diff --git a/ArinWareT4.sln b/ArinWareT4.sln index b063e09..e9f8690 100644 --- a/ArinWareT4.sln +++ b/ArinWareT4.sln @@ -17,6 +17,11 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Utility", "Utility\Utility. EndProject Project("{54435603-DBB4-11D2-8724-00A0C9A8B90C}") = "Setup1", "Setup1\Setup1.vdproj", "{0E52FBAC-1A86-4722-93D0-CA7B8570B617}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{A01A7396-C1BE-4D13-8B51-C9C1830DA088}" + ProjectSection(SolutionItems) = preProject + CLAUDE.md = CLAUDE.md + EndProjectSection +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution CD_ROM|Any CPU = CD_ROM|Any CPU diff --git a/ArinWarev1/ECO2_2025V1.vbproj b/ArinWarev1/ECO2_2025V1.vbproj index 47f846a..52e5e2c 100644 --- a/ArinWarev1/ECO2_2025V1.vbproj +++ b/ArinWarev1/ECO2_2025V1.vbproj @@ -111,8 +111,32 @@ False ..\Interop.VBIDE.dll + + False + ..\lib\Microsoft.Owin.dll + + + False + ..\lib\Microsoft.Owin.FileSystems.dll + + + False + ..\lib\Microsoft.Owin.Host.HttpListener.dll + + + False + ..\lib\Microsoft.Owin.Hosting.dll + + + False + ..\lib\Microsoft.Owin.StaticFiles.dll + + + False + ..\lib\Owin.dll + @@ -483,6 +507,9 @@ Form + + + @@ -789,6 +816,7 @@ + PreserveNewest @@ -807,6 +835,7 @@ PreserveNewest + diff --git a/ArinWarev1/MdiMain.vb b/ArinWarev1/MdiMain.vb index b903605..3dad666 100644 --- a/ArinWarev1/MdiMain.vb +++ b/ArinWarev1/MdiMain.vb @@ -1,4 +1,5 @@ Imports System.IO +Imports Eco2Ar.WebServer Public Class MdiMain @@ -20,9 +21,17 @@ Public Class MdiMain '''현재열려있는폼의 이름을 변경한다. Public OpenedForm As E_MenuIdx = E_MenuIdx.NONE + Private webServer As StaticFileServer Private Sub MdiMain_FormClosed(sender As Object, e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed pLog.Add("FormClosed", True) + + ' 웹 서버 정리 + If webServer IsNot Nothing Then + webServer.Stop() + webServer.Dispose() + End If + End Sub Private Sub MdiMain_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing @@ -243,6 +252,20 @@ Public Class MdiMain pLog.Add("Program Start") + Try + ' 웹 서버 초기화 및 시작 + Dim wwwPath = Path.Combine(Application.StartupPath, "wwwroot") + webServer = New StaticFileServer(wwwPath, 58123) + webServer.Start() + If System.Diagnostics.Debugger.IsAttached Then + webServer.OpenInBrowser() + End If + Catch ex As Exception + ' 웹 서버 시작 실패해도 프로그램은 계속 실행 + Debug.WriteLine("웹 서버 시작 실패: " & ex.Message) + End Try + + If Me.bt_etc.Visible = False AndAlso System.Diagnostics.Debugger.IsAttached Then MsgBox("debugmode import on") Me.bt_etc.Visible = True diff --git a/ArinWarev1/WebServer/Example_WebServer_Usage.vb b/ArinWarev1/WebServer/Example_WebServer_Usage.vb new file mode 100644 index 0000000..648ccf6 --- /dev/null +++ b/ArinWarev1/WebServer/Example_WebServer_Usage.vb @@ -0,0 +1,244 @@ +' OWIN 정적 파일 호스팅 서버 사용 예제 +' +' 이 파일은 StaticFileServer를 사용하는 방법을 보여줍니다. +' 실제 사용 시에는 MdiMain.vb 또는 필요한 폼에서 사용하세요. + +Imports Eco2Ar.WebServer +Imports System.IO + +Namespace Examples + + ''' + ''' 웹 서버 사용 예제 + ''' + Public Class WebServerExample + + Private server As StaticFileServer + + ''' + ''' 예제 1: 기본 사용법 + ''' + Public Sub Example1_BasicUsage() + ' 1. 정적 파일을 서빙할 디렉토리 경로 설정 + Dim wwwrootPath As String = Path.Combine(Application.StartupPath, "wwwroot") + + ' 2. 서버 인스턴스 생성 (포트 58123 사용) + server = New StaticFileServer(wwwrootPath, 58123) + + ' 3. 서버 시작 + server.Start() + + ' 4. 브라우저에서 열기 (선택사항) + ' server.OpenInBrowser() + + MsgBox("웹 서버가 시작되었습니다." & vbCrLf & _ + "URL: " & server.BaseUrl & vbCrLf & _ + "루트 경로: " & server.RootPath, _ + MsgBoxStyle.Information, "웹 서버") + End Sub + + ''' + ''' 예제 2: MdiMain에서 사용 (프로그램 시작 시 서버 시작) + ''' + Public Sub Example2_IntegrationWithMdiMain() + ' MdiMain.vb의 MdiMain_Load 이벤트에 추가: + ' + ' Private webServer As StaticFileServer + ' + ' Private Sub MdiMain_Load(sender As Object, e As EventArgs) Handles MyBase.Load + ' ' ... 기존 코드 ... + ' + ' Try + ' ' 웹 서버 초기화 및 시작 + ' Dim wwwPath = Path.Combine(Application.StartupPath, "wwwroot") + ' webServer = New StaticFileServer(wwwPath) + ' webServer.Start() + ' Catch ex As Exception + ' ' 웹 서버 시작 실패해도 프로그램은 계속 실행 + ' Debug.WriteLine("웹 서버 시작 실패: " & ex.Message) + ' End Try + ' End Sub + ' + ' Private Sub MdiMain_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing + ' ' ... 기존 코드 ... + ' + ' ' 웹 서버 정리 + ' If webServer IsNot Nothing Then + ' webServer.Stop() + ' webServer.Dispose() + ' End If + ' End Sub + End Sub + + ''' + ''' 예제 3: 특정 파일 브라우저에서 열기 + ''' + Public Sub Example3_OpenSpecificFile() + If server Is Nothing OrElse Not server.IsRunning Then + MsgBox("서버가 실행 중이 아닙니다.", MsgBoxStyle.Exclamation, "오류") + Return + End If + + ' 리포트 HTML 파일 열기 + server.OpenFileInBrowser("report.html") + + ' 또는 URL만 가져오기 + Dim reportUrl As String = server.GetFileUrl("reports/2025/report.html") + MsgBox("리포트 URL: " & reportUrl, MsgBoxStyle.Information, "URL") + End Sub + + ''' + ''' 예제 4: 동적으로 HTML 파일 생성 후 표시 + ''' + Public Sub Example4_GenerateAndDisplay() + If server Is Nothing OrElse Not server.IsRunning Then + MsgBox("서버가 실행 중이 아닙니다.", MsgBoxStyle.Exclamation, "오류") + Return + End If + + ' HTML 파일 생성 + Dim htmlContent As String = "" & vbCrLf & _ + "" & vbCrLf & _ + "" & vbCrLf & _ + " " & vbCrLf & _ + " ECO2 리포트" & vbCrLf & _ + " " & vbCrLf & _ + "" & vbCrLf & _ + "" & vbCrLf & _ + "

건물 에너지 분석 리포트

" & vbCrLf & _ + " " & vbCrLf & _ + " " & vbCrLf & _ + " " & vbCrLf & _ + " " & vbCrLf & _ + "
항목
1차 에너지 소요량123.45 kWh/m²·year
CO2 배출량45.67 kg/m²·year
" & vbCrLf & _ + "" & vbCrLf & _ + "" + + ' 파일 저장 + Dim reportPath As String = Path.Combine(server.RootPath, "report.html") + File.WriteAllText(reportPath, htmlContent, System.Text.Encoding.UTF8) + + ' 브라우저에서 열기 + server.OpenFileInBrowser("report.html") + End Sub + + ''' + ''' 예제 5: 폼 버튼에서 웹 리포트 생성 및 표시 + ''' + Public Sub Example5_ButtonClick() + ' 폼의 버튼 클릭 이벤트에 추가: + ' + ' Private Sub btnShowWebReport_Click(sender As Object, e As EventArgs) Handles btnShowWebReport.Click + ' Try + ' ' 서버가 실행 중이 아니면 시작 + ' If webServer Is Nothing OrElse Not webServer.IsRunning Then + ' Dim wwwPath = Path.Combine(Application.StartupPath, "wwwroot") + ' webServer = New StaticFileServer(wwwPath) + ' webServer.Start() + ' End If + ' + ' ' HTML 리포트 생성 + ' GenerateHtmlReport() + ' + ' ' 브라우저에서 열기 + ' webServer.OpenFileInBrowser("report.html") + ' Catch ex As Exception + ' MsgBox("리포트 생성 실패: " & ex.Message, MsgBoxStyle.Critical, "오류") + ' End Try + ' End Sub + ' + ' Private Sub GenerateHtmlReport() + ' ' 실제 데이터를 사용하여 HTML 생성 + ' Dim html As String = BuildHtmlReport(DSET1, DSETR1, Result2) + ' Dim path As String = Path.Combine(webServer.RootPath, "report.html") + ' File.WriteAllText(path, html, System.Text.Encoding.UTF8) + ' End Sub + End Sub + + ''' + ''' 서버 중지 + ''' + Public Sub StopServer() + If server IsNot Nothing Then + server.Stop() + server.Dispose() + server = Nothing + End If + End Sub + + End Class + + ''' + ''' 간단한 HTML 빌더 헬퍼 클래스 + ''' + Public Class HtmlReportBuilder + + Private html As System.Text.StringBuilder + + Public Sub New(title As String) + html = New System.Text.StringBuilder() + html.AppendLine("") + html.AppendLine("") + html.AppendLine("") + html.AppendLine(" ") + html.AppendLine(" " & title & "") + html.AppendLine(" ") + html.AppendLine("") + html.AppendLine("") + html.AppendLine("

" & title & "

") + End Sub + + Public Sub AddSection(sectionTitle As String) + html.AppendLine("
") + html.AppendLine("

" & sectionTitle & "

") + End Sub + + Public Sub StartTable(ParamArray headers As String()) + html.AppendLine(" ") + html.Append(" ") + For Each headerItem As String In headers + html.Append("") + Next + html.AppendLine("") + End Sub + + Public Sub AddRow(ParamArray cells As String()) + html.Append(" ") + For Each cellItem As String In cells + html.Append("") + Next + html.AppendLine("") + End Sub + + Public Sub EndTable() + html.AppendLine("
" & headerItem & "
" & cellItem & "
") + End Sub + + Public Sub EndSection() + html.AppendLine("
") + End Sub + + Public Function Build() As String + html.AppendLine("") + html.AppendLine("") + Return html.ToString() + End Function + + End Class + +End Namespace diff --git a/ArinWarev1/WebServer/INSTALL.txt b/ArinWarev1/WebServer/INSTALL.txt new file mode 100644 index 0000000..acadde5 --- /dev/null +++ b/ArinWarev1/WebServer/INSTALL.txt @@ -0,0 +1,50 @@ +===================================================== +OWIN 정적 파일 호스팅 서버 설치 가이드 +===================================================== + +1. Visual Studio에서 ECO2_2025V1 프로젝트 열기 + +2. 메뉴: 도구 > NuGet 패키지 관리자 > 패키지 관리자 콘솔 + +3. 다음 명령들을 순서대로 실행: + + Install-Package Owin -Version 1.0 + Install-Package Microsoft.Owin -Version 2.1.0 + Install-Package Microsoft.Owin.Host.HttpListener -Version 2.1.0 + Install-Package Microsoft.Owin.Hosting -Version 2.1.0 + Install-Package Microsoft.Owin.StaticFiles -Version 2.1.0 + +4. 프로젝트 다시 빌드 + +5. wwwroot 폴더 생성 (없는 경우): + - 출력 디렉토리에 wwwroot 폴더 생성 + - Debug: ..\..\..\..\..\eco2\debug_2016\wwwroot + - Release: c:\eco2\debug_2016\wwwroot + +6. 기본 index.html 생성 (선택사항): + wwwroot\index.html 파일에 다음 내용 추가: + + + + + + ECO2 Web Server + + +

ECO2 웹 서버가 정상 작동 중입니다

+ + + +7. 사용 예제는 Example_WebServer_Usage.vb 참고 + +8. 관리자 권한 필요 시 (선택사항): + + 관리자 권한 명령 프롬프트에서: + netsh http add urlacl url=http://+:58123/ user=Everyone + +===================================================== +문제 발생 시: +- README.md의 "문제 해결" 섹션 참고 +- 패키지 버전이 정확한지 확인 (2.1.0) +- .NET Framework 4.0 타겟이 맞는지 확인 +===================================================== diff --git a/ArinWarev1/WebServer/MANUAL_INSTALL.md b/ArinWarev1/WebServer/MANUAL_INSTALL.md new file mode 100644 index 0000000..1589ec7 --- /dev/null +++ b/ArinWarev1/WebServer/MANUAL_INSTALL.md @@ -0,0 +1,126 @@ +# Visual Studio 2010 수동 설치 가이드 + +VS2010에는 NuGet이 기본 내장되어 있지 않으므로, 두 가지 방법 중 선택할 수 있습니다. + +## 방법 1: NuGet Extension 설치 (권장) + +1. Visual Studio 2010 열기 +2. **도구** > **확장 관리자** 클릭 +3. **온라인 갤러리** 선택 +4. 검색창에 "NuGet Package Manager" 입력 +5. **NuGet Package Manager** 찾아서 **다운로드** 클릭 +6. 설치 후 Visual Studio 재시작 +7. 이후 README.md의 NuGet 설치 방법 따라하기 + +또는 직접 다운로드: +https://visualstudiogallery.msdn.microsoft.com/27077b70-9dad-4c64-adcf-c7cf6bc9970c + +## 방법 2: DLL 수동 추가 (NuGet 없이) + +### 1단계: 필요한 DLL 다운로드 + +다음 NuGet 패키지를 직접 다운로드: + +**다운로드 링크:** +- https://www.nuget.org/packages/Owin/1.0 +- https://www.nuget.org/packages/Microsoft.Owin/2.1.0 +- https://www.nuget.org/packages/Microsoft.Owin.Host.HttpListener/2.1.0 +- https://www.nuget.org/packages/Microsoft.Owin.Hosting/2.1.0 +- https://www.nuget.org/packages/Microsoft.Owin.StaticFiles/2.1.0 +- https://www.nuget.org/packages/Microsoft.Owin.FileSystems/2.1.0 + +각 페이지에서 "Download package" 클릭 + +### 2단계: NuGet 패키지에서 DLL 추출 + +1. 다운로드한 `.nupkg` 파일의 확장자를 `.zip`으로 변경 +2. 압축 해제 +3. `lib\net40\` 폴더에서 DLL 파일 찾기 +4. 프로젝트 폴더에 `lib` 디렉토리 생성 +5. 모든 DLL을 `S:\Source\KICT\ECO2\lib\` 폴더에 복사 + +**필요한 DLL 목록:** +- Owin.dll +- Microsoft.Owin.dll +- Microsoft.Owin.Host.HttpListener.dll +- Microsoft.Owin.Hosting.dll +- Microsoft.Owin.StaticFiles.dll +- Microsoft.Owin.FileSystems.dll + +### 3단계: Visual Studio 프로젝트에 참조 추가 + +1. 솔루션 탐색기에서 **ECO2_2025V1** 프로젝트 선택 +2. **참조** 폴더 우클릭 > **참조 추가** +3. **찾아보기** 탭 선택 +4. `S:\Source\KICT\ECO2\lib\` 폴더로 이동 +5. 위의 모든 DLL 선택하여 추가 + +### 4단계: app.config에 바인딩 리디렉션 추가 + +`ArinWarev1\app.config` 파일을 열고 `` 바로 앞에 추가: + +```xml + + + + + + + + +``` + +## 방법 3: 스크립트로 자동 다운로드 (PowerShell) + +프로젝트 루트에서 PowerShell 실행: + +```powershell +# lib 폴더 생성 +New-Item -ItemType Directory -Force -Path "lib" + +# NuGet.exe 다운로드 +Invoke-WebRequest -Uri "https://dist.nuget.org/win-x86-commandline/v2.8.6/nuget.exe" -OutFile "nuget.exe" + +# 패키지 다운로드 +.\nuget.exe install Owin -Version 1.0 -OutputDirectory packages +.\nuget.exe install Microsoft.Owin -Version 2.1.0 -OutputDirectory packages +.\nuget.exe install Microsoft.Owin.Host.HttpListener -Version 2.1.0 -OutputDirectory packages +.\nuget.exe install Microsoft.Owin.Hosting -Version 2.1.0 -OutputDirectory packages +.\nuget.exe install Microsoft.Owin.StaticFiles -Version 2.1.0 -OutputDirectory packages + +# DLL 복사 +Copy-Item "packages\Owin.1.0\lib\net40\Owin.dll" -Destination "lib\" +Copy-Item "packages\Microsoft.Owin.2.1.0\lib\net40\Microsoft.Owin.dll" -Destination "lib\" +Copy-Item "packages\Microsoft.Owin.Host.HttpListener.2.1.0\lib\net40\Microsoft.Owin.Host.HttpListener.dll" -Destination "lib\" +Copy-Item "packages\Microsoft.Owin.Hosting.2.1.0\lib\net40\Microsoft.Owin.Hosting.dll" -Destination "lib\" +Copy-Item "packages\Microsoft.Owin.StaticFiles.2.1.0\lib\net40\Microsoft.Owin.StaticFiles.dll" -Destination "lib\" +Copy-Item "packages\Microsoft.Owin.FileSystems.2.1.0\lib\net40\Microsoft.Owin.FileSystems.dll" -Destination "lib\" + +Write-Host "DLL 다운로드 완료! lib 폴더를 확인하세요." +``` + +## 방법 4: 미리 준비된 DLL 사용 + +팀원에게 이미 설치된 환경에서 다음 폴더의 DLL을 복사 받기: +- `packages\Owin.1.0\lib\net40\` +- `packages\Microsoft.Owin.2.1.0\lib\net40\` +- `packages\Microsoft.Owin.Host.HttpListener.2.1.0\lib\net40\` +- `packages\Microsoft.Owin.Hosting.2.1.0\lib\net40\` +- `packages\Microsoft.Owin.StaticFiles.2.1.0\lib\net40\` +- `packages\Microsoft.Owin.FileSystems.2.1.0\lib\net40\` + +## 확인 방법 + +프로젝트를 빌드했을 때 다음 오류가 없으면 성공: +- "형식 또는 네임스페이스 이름 'Owin'을 찾을 수 없습니다" +- "형식 또는 네임스페이스 이름 'Microsoft'을 찾을 수 없습니다" + +## 문제 해결 + +### "Could not load file or assembly" 오류 +- app.config에 바인딩 리디렉션 추가했는지 확인 +- DLL 버전이 2.1.0이 맞는지 확인 (2.x 버전만 .NET 4.0 호환) + +### "파일을 찾을 수 없습니다" 오류 +- 출력 디렉토리에 DLL이 복사되는지 확인 +- 참조의 "로컬 복사" 속성이 True인지 확인 diff --git a/ArinWarev1/WebServer/README.md b/ArinWarev1/WebServer/README.md new file mode 100644 index 0000000..a086dce --- /dev/null +++ b/ArinWarev1/WebServer/README.md @@ -0,0 +1,190 @@ +# OWIN 정적 파일 호스팅 서버 + +ECO2 프로젝트에 OWIN 기반 내장 웹 서버를 추가하여 HTML 리포트 및 정적 파일을 호스팅할 수 있습니다. + +## 설치 방법 + +### 1. NuGet 패키지 설치 + +Visual Studio에서 Package Manager Console을 열고 다음 명령을 실행하세요: + +```powershell +# ECO2_2025V1 프로젝트를 기본 프로젝트로 선택 후 실행 + +Install-Package Microsoft.Owin -Version 2.1.0 +Install-Package Microsoft.Owin.Host.HttpListener -Version 2.1.0 +Install-Package Microsoft.Owin.Hosting -Version 2.1.0 +Install-Package Microsoft.Owin.StaticFiles -Version 2.1.0 +Install-Package Owin -Version 1.0 +``` + +또는 패키지 관리자 UI에서 다음 패키지를 검색하여 설치: +- Microsoft.Owin (2.1.0) +- Microsoft.Owin.Host.HttpListener (2.1.0) +- Microsoft.Owin.Hosting (2.1.0) +- Microsoft.Owin.StaticFiles (2.1.0) +- Owin (1.0) + +### 2. 프로젝트에 파일 추가 + +다음 파일들이 `WebServer` 폴더에 추가되었습니다: +- `StaticFileServer.vb` - 메인 서버 클래스 +- `Startup.vb` - OWIN 시작 구성 +- `Example_WebServer_Usage.vb` - 사용 예제 + +Visual Studio에서 프로젝트를 다시 로드하면 자동으로 인식됩니다. + +## 사용 방법 + +### 기본 사용법 + +```vb +Imports Eco2Ar.WebServer +Imports System.IO + +' 1. 서버 인스턴스 생성 +Dim wwwrootPath As String = Path.Combine(Application.StartupPath, "wwwroot") +Dim server As New StaticFileServer(wwwrootPath, 58123) + +' 2. 서버 시작 +server.Start() + +' 3. 브라우저에서 열기 +server.OpenInBrowser() + +' 4. 사용 후 서버 중지 +server.Stop() +``` + +### MdiMain에 통합 + +`MdiMain.vb`에 다음 코드를 추가: + +```vb +Public Class MdiMain + Private webServer As StaticFileServer + + Private Sub MdiMain_Load(sender As Object, e As EventArgs) Handles MyBase.Load + ' ... 기존 코드 ... + + ' 웹 서버 시작 + Try + Dim wwwPath = Path.Combine(Application.StartupPath, "wwwroot") + webServer = New StaticFileServer(wwwPath) + webServer.Start() + Catch ex As Exception + Debug.WriteLine("웹 서버 시작 실패: " & ex.Message) + End Try + End Sub + + Private Sub MdiMain_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing + ' ... 기존 코드 ... + + ' 웹 서버 정리 + If webServer IsNot Nothing Then + webServer.Stop() + webServer.Dispose() + End If + End Sub +End Class +``` + +### HTML 리포트 생성 및 표시 + +```vb +' HTML 리포트 빌더 사용 +Dim builder As New HtmlReportBuilder("건물 에너지 분석 리포트") + +builder.AddSection("1차 에너지 소요량") +builder.StartTable("항목", "값", "단위") +builder.AddRow("난방", "123.45", "kWh/m²·year") +builder.AddRow("냉방", "67.89", "kWh/m²·year") +builder.EndTable() +builder.EndSection() + +Dim html As String = builder.Build() + +' 파일 저장 +Dim reportPath As String = Path.Combine(webServer.RootPath, "report.html") +File.WriteAllText(reportPath, html, System.Text.Encoding.UTF8) + +' 브라우저에서 열기 +webServer.OpenFileInBrowser("report.html") +``` + +## 폴더 구조 + +``` +C:\eco2\debug_2016\ +├─ Eco2Ar.exe +└─ wwwroot\ # 정적 파일 루트 디렉토리 + ├─ index.html # 기본 페이지 + ├─ report.html # 생성된 리포트 + ├─ css\ + │ └─ styles.css + ├─ js\ + │ └─ scripts.js + └─ images\ + └─ logo.png +``` + +## 주요 기능 + +### StaticFileServer 클래스 + +- **Start()** - 웹 서버 시작 +- **Stop()** - 웹 서버 중지 +- **OpenInBrowser()** - 기본 브라우저에서 루트 URL 열기 +- **OpenFileInBrowser(relativePath)** - 특정 파일을 브라우저에서 열기 +- **GetFileUrl(relativePath)** - 파일의 전체 URL 반환 +- **IsRunning** - 서버 실행 상태 확인 +- **BaseUrl** - 서버 URL (http://localhost:58123) +- **RootPath** - 정적 파일 루트 경로 + +### HtmlReportBuilder 클래스 + +간단한 HTML 리포트를 코드로 생성할 수 있는 헬퍼 클래스입니다. + +## 포트 정보 + +- **기본 포트**: 58123 (일반적으로 사용하지 않는 포트) +- 필요 시 생성자에서 다른 포트 지정 가능: `New StaticFileServer(path, 9999)` + +## 보안 주의사항 + +- 이 웹 서버는 **localhost**에서만 접근 가능합니다 (외부 접근 불가) +- 민감한 정보를 wwwroot에 저장하지 마세요 +- 필요한 경우에만 서버를 실행하고 사용 후 중지하세요 + +## 문제 해결 + +### "포트가 이미 사용 중입니다" 오류 + +다른 프로그램이 58123 포트를 사용 중일 수 있습니다. 다른 포트를 사용하세요: + +```vb +Dim server As New StaticFileServer(wwwrootPath, 58124) +``` + +### "관리자 권한이 필요합니다" 오류 + +일부 환경에서는 HTTP.sys 리스너 등록에 관리자 권한이 필요할 수 있습니다. +다음 명령을 관리자 권한 명령 프롬프트에서 실행: + +```cmd +netsh http add urlacl url=http://+:58123/ user=Everyone +``` + +### 패키지 설치 오류 + +.NET Framework 4.0 타겟 프로젝트이므로 반드시 2.x 버전의 OWIN 패키지를 사용해야 합니다. +최신 버전(4.x)은 .NET Framework 4.5 이상이 필요합니다. + +## 예제 코드 위치 + +더 자세한 사용 예제는 `Example_WebServer_Usage.vb` 파일을 참고하세요. + +## 참고 자료 + +- [OWIN 공식 문서](http://owin.org/) +- [Microsoft.Owin 문서](https://docs.microsoft.com/en-us/aspnet/aspnet/overview/owin-and-katana/) diff --git a/ArinWarev1/WebServer/Startup.vb b/ArinWarev1/WebServer/Startup.vb new file mode 100644 index 0000000..fa44aed --- /dev/null +++ b/ArinWarev1/WebServer/Startup.vb @@ -0,0 +1,93 @@ +' OWIN Startup 클래스 +Imports Owin +Imports Microsoft.Owin.StaticFiles +Imports Microsoft.Owin.FileSystems + +Namespace WebServer + + ''' + ''' OWIN 시작 구성 클래스 + ''' + Public Class Startup + + ' 정적 필드로 RootPath 저장 + Public Shared RootPath As String = String.Empty + + ''' + ''' OWIN 미들웨어 구성 + ''' + ''' App builder + Public Sub Configuration(app As IAppBuilder) + ' 루트 경로 확인 + If String.IsNullOrEmpty(RootPath) Then + RootPath = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "wwwroot") + End If + + ' 정적 파일 서빙을 위한 파일 시스템 설정 + Dim fileSystem = New PhysicalFileSystem(RootPath) + + ' 정적 파일 옵션 설정 + Dim options As New FileServerOptions() With { + .RequestPath = New Microsoft.Owin.PathString(""), + .FileSystem = fileSystem, + .EnableDirectoryBrowsing = False + } + + ' MIME 타입 매핑 추가 (필요한 경우) + options.StaticFileOptions.ContentTypeProvider = New CustomContentTypeProvider() + + ' 정적 파일 미들웨어 사용 + app.UseFileServer(options) + + ' 기본 핸들러 (루트 경로 접근 시) + app.Run(Function(context) + ' 루트 경로 접근 시 index.html로 리다이렉트 + If context.Request.Path.Value = "/" OrElse context.Request.Path.Value = "" Then + Dim indexPath = System.IO.Path.Combine(RootPath, "index.html") + If System.IO.File.Exists(indexPath) Then + context.Response.Redirect("/index.html") + Else + context.Response.StatusCode = 200 + context.Response.ContentType = "text/html" + Dim tcs = New System.Threading.Tasks.TaskCompletionSource(Of Integer)() + context.Response.WriteAsync("

ECO2 Web Server

서버가 정상적으로 실행 중입니다.

루트 경로: " & RootPath & "

") + tcs.SetResult(0) + Return tcs.Task + End If + End If + Dim tcs2 = New System.Threading.Tasks.TaskCompletionSource(Of Integer)() + tcs2.SetResult(0) + Return tcs2.Task + End Function) + End Sub + + End Class + + ''' + ''' 커스텀 Content Type Provider + ''' + Public Class CustomContentTypeProvider + Inherits Microsoft.Owin.StaticFiles.ContentTypes.FileExtensionContentTypeProvider + + Public Sub New() + MyBase.New() + + ' 추가 MIME 타입 매핑 (필요한 경우) + ' 기본적으로 일반적인 타입들은 이미 포함되어 있음 + If Not Me.Mappings.ContainsKey(".json") Then + Me.Mappings.Add(".json", "application/json") + End If + If Not Me.Mappings.ContainsKey(".svg") Then + Me.Mappings.Add(".svg", "image/svg+xml") + End If + If Not Me.Mappings.ContainsKey(".woff") Then + Me.Mappings.Add(".woff", "font/woff") + End If + If Not Me.Mappings.ContainsKey(".woff2") Then + Me.Mappings.Add(".woff2", "font/woff2") + End If + End Sub + + End Class + +End Namespace diff --git a/ArinWarev1/WebServer/StaticFileServer.vb b/ArinWarev1/WebServer/StaticFileServer.vb new file mode 100644 index 0000000..ce1743c --- /dev/null +++ b/ArinWarev1/WebServer/StaticFileServer.vb @@ -0,0 +1,175 @@ +' OWIN 기반 정적 파일 호스팅 서버 +' +' 사용 방법: +' Dim server As New StaticFileServer("C:\wwwroot", 58123) +' server.Start() +' ... 프로그램 실행 ... +' server.Stop() + +Imports System +Imports System.IO +Imports Microsoft.Owin.Hosting + +Namespace WebServer + + ''' + ''' OWIN 기반 정적 파일 호스팅 서버 + ''' 포트 58123 사용 (일반적으로 사용하지 않는 포트) + ''' + Public Class StaticFileServer + Implements IDisposable + + Private _webApp As IDisposable + Private _baseUrl As String + Private _rootPath As String + Private _isRunning As Boolean = False + + ''' + ''' 서버가 실행 중인지 여부 + ''' + Public ReadOnly Property IsRunning As Boolean + Get + Return _isRunning + End Get + End Property + + ''' + ''' 서버 URL (예: http://localhost:58123) + ''' + Public ReadOnly Property BaseUrl As String + Get + Return _baseUrl + End Get + End Property + + ''' + ''' 정적 파일 루트 경로 + ''' + Public ReadOnly Property RootPath As String + Get + Return _rootPath + End Get + End Property + + ''' + ''' StaticFileServer 생성자 + ''' + ''' 정적 파일을 서빙할 루트 디렉토리 경로 + ''' 사용할 포트 번호 (기본값: 58123) + Public Sub New(rootPath As String, Optional port As Integer = 58123) + If String.IsNullOrEmpty(rootPath) Then + Throw New ArgumentException("rootPath는 비어있을 수 없습니다.", "rootPath") + End If + + If Not Directory.Exists(rootPath) Then + Directory.CreateDirectory(rootPath) + End If + + _rootPath = Path.GetFullPath(rootPath) + _baseUrl = String.Format("http://localhost:{0}", port) + End Sub + + ''' + ''' 웹 서버 시작 + ''' + Public Sub Start() + If _isRunning Then + Throw New InvalidOperationException("서버가 이미 실행 중입니다.") + End If + + Try + ' OWIN 서버 시작 + _webApp = WebApp.Start(Of Startup)(_baseUrl) + _isRunning = True + + ' 루트 경로를 Startup에서 접근할 수 있도록 설정 + Startup.RootPath = _rootPath + + Console.WriteLine("웹 서버 시작: {0}", _baseUrl) + Console.WriteLine("루트 경로: {0}", _rootPath) + Catch ex As Exception + _isRunning = False + Throw New Exception("웹 서버 시작 실패: " & ex.Message, ex) + End Try + End Sub + + ''' + ''' 웹 서버 중지 + ''' + Public Sub [Stop]() + If Not _isRunning Then + Return + End If + + Try + If _webApp IsNot Nothing Then + _webApp.Dispose() + _webApp = Nothing + End If + _isRunning = False + Console.WriteLine("웹 서버 중지됨") + Catch ex As Exception + Throw New Exception("웹 서버 중지 실패: " & ex.Message, ex) + End Try + End Sub + + ''' + ''' 리소스 해제 + ''' + Public Sub Dispose() Implements IDisposable.Dispose + [Stop]() + End Sub + + ''' + ''' 특정 파일의 전체 URL 반환 + ''' + ''' 상대 경로 (예: "index.html" 또는 "images/logo.png") + ''' 전체 URL + Public Function GetFileUrl(relativePath As String) As String + If String.IsNullOrEmpty(relativePath) Then + Return _baseUrl & "/" + End If + + ' 경로 정규화 + Dim normalizedPath As String = relativePath.Replace("\", "/") + If Not normalizedPath.StartsWith("/") Then + normalizedPath = "/" & normalizedPath + End If + + Return _baseUrl & normalizedPath + End Function + + ''' + ''' 브라우저에서 루트 URL 열기 + ''' + Public Sub OpenInBrowser() + If Not _isRunning Then + Throw New InvalidOperationException("서버가 실행 중이 아닙니다.") + End If + + Try + System.Diagnostics.Process.Start(_baseUrl) + Catch ex As Exception + Throw New Exception("브라우저 열기 실패: " & ex.Message, ex) + End Try + End Sub + + ''' + ''' 특정 파일을 브라우저에서 열기 + ''' + ''' 상대 경로 + Public Sub OpenFileInBrowser(relativePath As String) + If Not _isRunning Then + Throw New InvalidOperationException("서버가 실행 중이 아닙니다.") + End If + + Try + Dim url As String = GetFileUrl(relativePath) + System.Diagnostics.Process.Start(url) + Catch ex As Exception + Throw New Exception("브라우저 열기 실패: " & ex.Message, ex) + End Try + End Sub + End Class + +End Namespace diff --git a/ArinWarev1/packages.config b/ArinWarev1/packages.config new file mode 100644 index 0000000..c180c35 --- /dev/null +++ b/ArinWarev1/packages.config @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..c520f22 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,381 @@ +# CLAUDE.md + +이 파일은 Claude Code (claude.ai/code)가 이 저장소에서 작업할 때 참고할 가이드를 제공합니다. + +## 프로젝트 개요 + +**ECO2 (Energy Calculation Optimization 2)**는 한국 건축물 에너지효율등급 인증 기준(녹색건축인증)에 따라 건물의 1차 에너지 소요량, CO2 배출량, 신재생에너지 생산량을 계산하는 VB.NET 및 WinForms 기반 응용 프로그램입니다. + +**주 언어**: Visual Basic .NET (VB.NET) with .NET Framework 4.0 +**추가 언어**: C# (유틸리티 라이브러리만) +**플랫폼**: Windows 데스크톱 응용 프로그램 (x86 타겟) + +## 솔루션 구조 + +솔루션 `ArinWareT4.sln`은 모듈화된 아키텍처로 구성된 6개의 프로젝트를 포함합니다: + +### 메인 응용 프로그램 +- **ECO2_2025V1** (`ArinWarev1/`) - 주 WinForms 응용 프로그램 + - 진입점: `MdiMain.vb` - 메뉴 시스템을 갖춘 MDI 부모 폼 + - `Calculator/` 하위 디렉토리의 핵심 계산 엔진 + - 기능별 폼 구성: `Forms/`, `Forms_Input/`, `Forms_Report/`, `Forms_Basic/` + - `Data/`의 기상 데이터 (XML 형식) + - 타입 데이터셋: `eco2DataSet.xsd` (데이터 모델링용) + +### 지원 라이브러리 (SubProject 폴더 그룹) +- **CEnergy** (`CEnergy/ArinClassV2/`) - 핵심 비즈니스 로직 라이브러리 + - 공통 유틸리티, 데이터베이스 액세스, INI 파일 처리 + - 여러 프로젝트에서 공유 + +- **ArinNet** - 네트워크 통신 유틸리티 + +- **ArinLogin** - 인증 및 사용자 관리 + - 라이선스 검증, 암호화/복호화 + +- **ArinLog** - 로깅 기능 + +- **Utility** (C#) - 압축 유틸리티 + - 데이터 압축을 위한 MiniLZO 구현 + +### 배포 +- **Setup1** - 설치 프로그램 프로젝트 (`.vdproj`) + +## 빌드 및 실행 + +### 솔루션 빌드 + +```bash +# Visual Studio에서 솔루션 열기 +start ArinWareT4.sln + +# 명령줄에서 빌드 (Visual Studio 필요) +msbuild ArinWareT4.sln /p:Configuration=Debug /p:Platform="Any CPU" +msbuild ArinWareT4.sln /p:Configuration=Release /p:Platform="Any CPU" +``` + +### 출력 경로 +- **Debug**: `..\..\..\..\..\eco2\debug_2016\` (프로젝트 기준 상대 경로) +- **Release**: `c:\eco2\debug_2016\` + +### 플랫폼 설정 +- 타겟 플랫폼: **x86** (32비트) +- 프레임워크: **.NET Framework 4.0** +- Option Strict: **Off** (VB.NET 특성) + +### 빌드 구성 +- Debug / Release (표준) +- CD_ROM / DVD-5 / SingleImage (배포 구성) + +## 아키텍처 개요 + +### 계산 엔진 (`ArinWarev1/Calculator/`) + +계산 엔진은 건물 에너지 계산을 수행하는 전문 모듈로 구성됩니다: + +**핵심 계산기 클래스**: +- `Calculator.vb` - 모든 계산 모듈을 조율하는 메인 오케스트레이터 +- `CZone.vb` - 존 레벨 계산 (열존, 난방/냉방 부하) +- `CAirHandling.vb` - 공조 시스템 계산 +- `CHeating.vb` - 난방 시스템 계산 (기기, 분배, 공급) +- `CCooling.vb` - 냉방 시스템 계산 (기기, 분배) +- `CRenewable.vb` - 신재생에너지 생산량 계산 +- `CSummary.vb` - 결과 집계 및 요약 생성 +- `CShared.vb` - 공유 계산 변수 및 유틸리티 + +**결과 처리** (`Calculator/Result/`): +- `CResult.vb` - 결과 데이터 구조 +- `C1차소요량.vb` - 1차 에너지 소요량 계산 +- `CCo2발생량.vb` - CO2 배출량 계산 +- `C생산에너지.vb` - 에너지 생산량 계산 +- `C사용면적.vb` - 사용 면적 계산 +- `CZones.vb` - 존 결과 집계 + +### 데이터 흐름 + +``` +사용자 입력 폼 (Forms_Input/) + ↓ +DataSet (eco2DataSet - DS, DSR) + ↓ +계산 엔진 (Calculator) + ↓ +결과 클래스 (CResult, DSR) + ↓ +리포트 폼 (Forms_Report/) +``` + +### 주요 데이터셋 +- `DS` (DSET) - 입력 데이터 (사용자 입력 건물 정보) +- `DSR` (DSETR) - 결과 데이터 (계산된 에너지 값) +- `CResult` - 구조화된 계산 결과 + +### 폼 구성 + +**Forms_Input/** - 데이터 입력 폼 +- `Frm_Desc.vb` - 건물 개요 +- `Frm_kongjo.vb` - 공조 처리 입력 +- `Frm_Bunbae.vb` - 분배 시스템 입력 +- `Frm_custom_profile.vb` - 커스텀 사용 프로파일 + +**Forms_Report/** - 출력 및 보고 +- `Frm_Upload.vb` - 인증 서버 업로드 +- `Frm_Macro.vb`, `Frm_Macro2.vb` - Excel 리포트 생성 +- `Frm_Export.vb` - 데이터 내보내기 기능 + +**Forms_Basic/** - 유틸리티 폼 +- `Frm_Calc.vb` - 계산 트리거 +- `Frm_Filter.vb` - 데이터 필터링 +- `Frm_FileInfo.vb` - 파일 메타데이터 + +**Forms/** - 일반 응용 프로그램 폼 +- `Frm_About.vb` - About 대화상자 +- `Frm_Common.vb` - 공통 대화상자 + +### 메뉴 시스템 (MdiMain.vb) + +`E_MenuIdx` 열거형에 정의된 메뉴 인덱스: +- 입력존 +- 입력면 +- 공조처리 +- 난방기기/공급/분배 +- 냉방기기/분배 +- 신재생및열병합 +- 열관류율 +- 건물개요 +- 월별에너지사용량 + +### 사용자 권한 + +`Prj.UserAuthType`을 통해 제어되는 사용자 유형: +- `ADMIN` - 전체 액세스 +- `BOTH` - 전문 사용자 (계산 + 인증) +- `BOTH0` - 일반 사용자 (제한된 액세스) +- `BOTH1` - 확장 전문 사용자 액세스 + +## 외부 종속성 + +### FarPoint Spread (v5.0.3505.2008) +- 데이터 입력을 위한 Excel 형식의 스프레드시트 컨트롤 +- 구성 요소: CalcEngine, Excel, PDF, Win, Chart +- 입력 폼에서 광범위하게 사용 + +### Microsoft ReportViewer +- `Microsoft.ReportViewer.Common.dll` +- `Microsoft.ReportViewer.WinForms.dll` +- 형식화된 보고서 생성에 사용 + +### Excel Interop +- `Interop.Excel.dll` - Excel 자동화를 위한 COM interop +- 매크로/내보내기 기능에 사용 + +### LOV 구성 요소 +- `Lov.dll` - 값 목록 컨트롤 라이브러리 + +## 파일 형식 및 데이터 저장 + +### 프로젝트 파일 (.tpl 파일) +- LZO 압축 바이너리 형식 (Utility 프로젝트 사용) +- 건물 데이터, 계산 입력값, 결과 포함 +- 사용자 지정 위치에 저장 +- 최근 파일은 응용 프로그램 설정에서 추적 + +### 기상 데이터 (Data/*.xml) +- `weather_temp.xml` - 온도 데이터 +- `weather_supdo.xml` - 습도 데이터 +- `weather_ilsa.xml` - 일사량 데이터 +- `weather_group.xml` - 기상 관측소 그룹 +- `tbl_weather.xml` - 기상 위치 테이블 + +### 구성 파일 +- `Frm_Setting.ini` - UI 상태 지속성 (창 크기, 위치) +- `login.dat` - 사용자 자격 증명 (암호화됨) +- `app.config` - 응용 프로그램 설정 + +## 한국 건축물 에너지 기준 + +이 응용 프로그램은 한국 건축물 에너지효율등급 인증 기준을 구현합니다: + +### 주요 용어 +- 건물개요 +- 1차 에너지 소요량 +- CO2 발생량 +- 난방 / 냉방 +- 급탕 +- 조명 / 환기 +- 신재생에너지 +- 열관류율 +- 공조 +- 용도지역 + +### 계산 버전 관리 + +`StartVersion` 상수를 통한 버전 제어: +- 규제 준수를 위한 계산 엔진 버전 관리 +- `Calculator.New()` 생성자에서 버전 확인 +- 기준 버전 "2009123100" + +## 개발 가이드라인 + +### VB.NET 규칙 +- Option Strict는 OFF - 암시적 형식 변환 허용 +- 한글 주석 및 변수명은 표준 관행 +- 명명: 클래스, 메서드는 PascalCase; 로컬 변수는 엄격한 규칙 없음 + +### DataSet 사용 +- 항상 타입 데이터셋 (`DS`, `DSR`) 사용 +- 모듈 수준 변수 `DSET1`, `DSETR1`을 통해 액세스 +- 타입 안전 액세스를 위해 DataRow 객체 사용 + +### 폼 관리 +- `MdiMain`을 통한 MDI 자식 폼 관리 +- `OpenedForm` 속성을 통해 열린 폼 추적 +- `Prj.Opened`를 사용하여 프로젝트 파일 로드 여부 확인 + +### 계산 흐름 +1. 프로젝트 파일 로드 → `DSET` 채우기 +2. 사용자가 입력 폼 수정 → `DSET` 업데이트 +3. 계산 트리거 → `Calculator` 클래스가 `DSET` 처리 → `DSETR` 및 `CResult` 채우기 +4. 리포트 폼에 결과 표시 + +### 파일 작업 +- 항상 MdiMain의 `Save_File()` / `Load_File()` 메서드 사용 +- Utility 라이브러리를 통한 파일 압축 처리 +- `PrjChanged` 플래그를 통한 파일 변경 추적 + +## 일반 작업 + +### 계산 실행 + +계산은 메뉴 또는 폼 버튼에서 트리거되고 `Calculator` 클래스를 통해 처리됩니다: + +```vb +' 데이터셋 및 결과 객체로 계산기 초기화 +Dim calc As New Calculator(version, DSET1, DSETR1, Result2, isSimulation) + +' 초기화 오류 확인 +If calc.IsError Then + ' 오류 처리 + Return +End If + +' DSETR1 및 Result2에서 계산 결과 사용 가능 +``` + +### 새 입력 필드 추가 + +1. 적절한 테이블에 열을 추가하도록 `eco2DataSet.xsd` 수정 +2. 해당 입력 폼(`Forms_Input/*.vb`) 업데이트 +3. 관련 `Calculator/*.vb` 클래스의 계산 로직 업데이트 +4. 필요한 경우 리포트 폼 업데이트 + +### 새 계산 모듈 추가 + +1. `Calculator/` 디렉토리에 새 클래스 생성 +2. 기존 모듈의 계산 패턴 상속 +3. 생성자에서 `DS`, `DSR`, `CResult` 수락 +4. `Calculator.vb` 오케스트레이터에 연결 +5. `CSummary.vb`의 요약 집계 업데이트 + +### FarPoint Spread 컨트롤 작업 + +FarPoint 컨트롤은 그리드 기반 입력에 광범위하게 사용됩니다: + +```vb +' Spread 컨트롤 액세스 +Dim spread As FarPoint.Win.Spread.FpSpread = Me.FpSpread1 + +' 셀 값 설정 +spread.ActiveSheet.Cells(row, col).Value = value + +' 셀 값 읽기 +Dim value = spread.ActiveSheet.Cells(row, col).Value + +' 셀 속성 설정 +spread.ActiveSheet.Cells(row, col).BackColor = Color.Yellow +``` + +## 알려진 패턴 및 규칙 + +### 전역 모듈 변수 +- `DSET1` - 전역 입력 데이터셋 (DS 타입) +- `DSETR1` - 전역 결과 데이터셋 (DSR 타입) +- `Result2` - 전역 결과 객체 (CResult 타입) +- `Prj` - 전역 프로젝트 상태 객체 +- `CLang` - 언어/지역화 문자열 + +### 오류 처리 +- 계산 클래스의 `IsError` 속성 패턴 +- 사용자 대면 오류에 대한 메시지 박스 +- `On Error Resume Next`를 사용한 VB.NET 오류 처리 (레거시 패턴) + +### 이벤트 처리 +- 클래스 수준 이벤트 핸들러를 위한 WithEvents 패턴 +- `Handles` 키워드를 통한 폼 이벤트 처리 + +### INI 파일 액세스 +```vb +Dim ini As New MyINI(filePath) +Dim value = ini.Read(section, key, defaultValue) +ini.Write(section, key, value) +``` + +## 테스트 및 디버깅 + +### 디버그 모드 +- Debug 구성으로 빌드 +- 로컬 디버그 폴더로 출력 +- 전체 심볼 정보 사용 가능 + +### 테스트 데이터 +사용 가능한 샘플 프로젝트 파일: +- `sample.tpl` - 표준 샘플 건물 +- `sample_0307.tpl` - 대체 샘플 +- `sample_200.tpl` - 대형 건물 샘플 + +### 로깅 +응용 프로그램 로깅에 ArinLog 라이브러리 사용: +```vb +pLog.Add("이벤트 설명", includeStackTrace) +``` + +## 언어 관련 참고사항 + +응용 프로그램은 한국 사용자를 위해 설계되었습니다: +- 모든 UI 텍스트는 한글 +- 사용자 문서는 한글 +- 한국 건축 기준 및 용어 +- 날짜/시간 형식: 한국 표준 +- 인코딩: 소스 파일은 UTF-8 + +주석 및 변수명은 한글과 영어를 혼용합니다 - 이는 의도적이며 이 코드베이스의 표준입니다. + +## 배포 참고사항 + +### 설치 +- 설치 프로그램 프로젝트: `Setup1/Setup1.vdproj` +- 메인 프로젝트에 구성된 ClickOnce 배포 +- 게시 URL: `ftp://tindevil.com/www/mynetapp/t4/` +- 설치 URL: `http://tindevil.com/mynetapp/t4/` + +### 버전 관리 +- AssemblyInfo의 버전 정보 +- ArinLogin 라이브러리를 통한 버전 확인 +- 서버 측 버전 검증 + +### 업데이트 +- 시작 시 업데이트 확인 +- Foreground 업데이트 모드 (실행 전 업데이트) +- 7일 업데이트 간격 구성 + +## 보안 참고사항 + +### 인증 +- ArinLogin 라이브러리를 통한 사용자 인증 +- MAC 주소 검증 (상태 표시줄의 `lbl_mac`) +- 라이선스 관리 시스템 +- `login.dat`의 암호화된 자격 증명 + +### 데이터 보호 +- 데이터 보호를 위한 파일 압축 +- ArinLogin.EnDec 클래스를 통한 암호화/복호화 +- 라이선스 준수를 위한 네트워크 검증 diff --git a/download_owin_packages.bat b/download_owin_packages.bat new file mode 100644 index 0000000..8e7e2c0 --- /dev/null +++ b/download_owin_packages.bat @@ -0,0 +1,68 @@ +@echo off +chcp 65001 > nul +echo ======================================== +echo OWIN NuGet 패키지 다운로드 +echo (압축 해제는 수동으로 진행) +echo ======================================== +echo. + +REM 다운로드 폴더 생성 +echo [1/2] 다운로드 폴더 생성 중... +if not exist "owin_packages" mkdir owin_packages +cd owin_packages +echo 완료 +echo. + +REM NuGet 패키지 다운로드 (.zip으로 저장) +echo [2/2] NuGet 패키지 다운로드 중... +echo. + +echo 다운로드: Owin.1.0.0.zip +powershell -Command "Invoke-WebRequest -Uri 'https://www.nuget.org/api/v2/package/Owin/1.0.0' -OutFile 'Owin.1.0.0.zip'" +echo 완료 + +echo 다운로드: Microsoft.Owin.2.1.0.zip +powershell -Command "Invoke-WebRequest -Uri 'https://www.nuget.org/api/v2/package/Microsoft.Owin/2.1.0' -OutFile 'Microsoft.Owin.2.1.0.zip'" +echo 완료 + +echo 다운로드: Microsoft.Owin.Host.HttpListener.2.1.0.zip +powershell -Command "Invoke-WebRequest -Uri 'https://www.nuget.org/api/v2/package/Microsoft.Owin.Host.HttpListener/2.1.0' -OutFile 'Microsoft.Owin.Host.HttpListener.2.1.0.zip'" +echo 완료 + +echo 다운로드: Microsoft.Owin.Hosting.2.1.0.zip +powershell -Command "Invoke-WebRequest -Uri 'https://www.nuget.org/api/v2/package/Microsoft.Owin.Hosting/2.1.0' -OutFile 'Microsoft.Owin.Hosting.2.1.0.zip'" +echo 완료 + +echo 다운로드: Microsoft.Owin.StaticFiles.2.1.0.zip +powershell -Command "Invoke-WebRequest -Uri 'https://www.nuget.org/api/v2/package/Microsoft.Owin.StaticFiles/2.1.0' -OutFile 'Microsoft.Owin.StaticFiles.2.1.0.zip'" +echo 완료 + +echo 다운로드: Microsoft.Owin.FileSystems.2.1.0.zip +powershell -Command "Invoke-WebRequest -Uri 'https://www.nuget.org/api/v2/package/Microsoft.Owin.FileSystems/2.1.0' -OutFile 'Microsoft.Owin.FileSystems.2.1.0.zip'" +echo 완료 + +cd .. + +echo. +echo ======================================== +echo 다운로드 완료! +echo ======================================== +echo. +echo 다운로드된 파일 목록: +dir /b owin_packages\*.zip +echo. +echo 다음 단계: +echo 1. owin_packages 폴더 열기 +echo 2. 각 .zip 파일을 압축 해제 +echo 3. 각 폴더의 lib\net40\ 경로에서 .dll 파일 찾기 +echo 4. 모든 .dll 파일을 lib 폴더로 복사 +echo. +echo 필요한 DLL 파일 목록: +echo - Owin.dll +echo - Microsoft.Owin.dll +echo - Microsoft.Owin.Host.HttpListener.dll +echo - Microsoft.Owin.Hosting.dll +echo - Microsoft.Owin.StaticFiles.dll +echo - Microsoft.Owin.FileSystems.dll +echo. +pause diff --git a/host_eco2_guide_fixed.bat b/host_eco2_guide_fixed.bat new file mode 100644 index 0000000..7ecc1a3 --- /dev/null +++ b/host_eco2_guide_fixed.bat @@ -0,0 +1,143 @@ +@echo off +chcp 65001 > nul +echo ======================================== +echo ECO2 Guide Center 로컬 호스팅 +echo ======================================== +echo. + +REM 현재 디렉토리 확인 +set CURRENT_DIR=%CD% +echo 현재 디렉토리: %CURRENT_DIR% +echo. + +REM eco2_guide_center 저장소 경로 확인 +set GUIDE_REPO=eco2_guide_center +if not exist "%GUIDE_REPO%" ( + echo [1/4] 저장소 클론 중... + git clone https://github.com/VeryColdplay/eco2_guide_center.git + if errorlevel 1 ( + echo 오류: 저장소 클론 실패 + echo Git이 설치되어 있는지 확인하세요. + pause + exit /b 1 + ) + echo 완료 +) else ( + echo [1/4] 저장소 업데이트 중... + cd %GUIDE_REPO% + git pull + cd .. + echo 완료 +) +echo. + +REM 필요한 패키지 설치 +echo [2/4] Python 패키지 설치 중... +echo (네트워크 연결이 필요합니다. 시간이 걸릴 수 있습니다...) +echo. + +REM 방화벽이나 프록시 문제가 있을 수 있으므로 개별 설치 시도 +pip install mkdocs-material 2>nul +if errorlevel 1 ( + echo 경고: mkdocs-material 설치 실패 - 이미 설치되어 있거나 네트워크 문제일 수 있습니다. +) + +pip install mkdocs-macros-plugin 2>nul +pip install mkdocs-mermaid2-plugin 2>nul +pip install mkdocs-table-reader-plugin 2>nul +pip install mkdocs-glightbox 2>nul +pip install mkdocs-git-revision-date-localized-plugin 2>nul +pip install mkdocs-minify-plugin 2>nul +pip install mkdocs-awesome-pages-plugin 2>nul + +echo 패키지 설치 시도 완료 +echo. + +REM MkDocs 빌드 +echo [3/4] MkDocs 빌드 중... +cd %GUIDE_REPO% + +REM mkdocs.yml에서 awesome-pages 플러그인 제거 (임시) +echo awesome-pages 플러그인 비활성화 중... +powershell -Command "(Get-Content mkdocs.yml) -replace ' - awesome-pages', ' # - awesome-pages' | Set-Content mkdocs_temp.yml" + +REM 정적 사이트 빌드 +echo MkDocs 빌드 실행... +mkdocs build -f mkdocs_temp.yml +if errorlevel 1 ( + echo. + echo 오류: MkDocs 빌드 실패 + echo. + echo 해결 방법: + echo 1. Python이 설치되어 있는지 확인 + echo 2. 인터넷 연결 확인 + echo 3. 방화벽/프록시 설정 확인 + echo 4. 관리자 권한으로 실행 + echo. + echo 또는 수동 설치: + echo pip install mkdocs-material mkdocs-awesome-pages-plugin + echo. + del mkdocs_temp.yml 2>nul + cd .. + pause + exit /b 1 +) + +del mkdocs_temp.yml 2>nul +echo 완료 +echo. + +REM ECO2 wwwroot 폴더로 복사 +echo [4/4] ECO2 wwwroot로 복사 중... +cd .. + +REM wwwroot 폴더 생성 +if not exist "wwwroot" mkdir wwwroot + +REM 기존 파일 백업 (선택사항) +if exist "wwwroot\index.html" ( + echo 기존 파일 발견 - 백업 생성 중... + if not exist "wwwroot_backup" mkdir wwwroot_backup + xcopy /E /I /Y "wwwroot\*" "wwwroot_backup\" > nul +) + +REM site 폴더 내용 복사 +echo 빌드된 파일 복사 중... +xcopy /E /I /Y "%GUIDE_REPO%\site\*" "wwwroot\" > nul +if errorlevel 1 ( + echo 오류: 파일 복사 실패 + pause + exit /b 1 +) +echo 완료 +echo. + +REM 파일 개수 확인 +for /f %%A in ('dir /b /s "wwwroot\*.html" ^| find /c ".html"') do set HTML_COUNT=%%A +echo 복사된 HTML 파일: %HTML_COUNT%개 + +echo. +echo ======================================== +echo 호스팅 준비 완료! +echo ======================================== +echo. +echo wwwroot 폴더: %CURRENT_DIR%\wwwroot +echo. +echo 다음 중 한 가지 방법으로 접속: +echo. +echo [방법 1] ECO2 프로그램의 OWIN 서버 사용 +echo 1. ECO2 프로그램 실행 +echo 2. OWIN 서버 시작 (포트 58123) +echo 3. 브라우저: http://localhost:58123 +echo. +echo [방법 2] MkDocs 개발 서버 사용 (추천 - 자동 새로고침) +echo 1. cd eco2_guide_center +echo 2. mkdocs serve +echo 3. 브라우저: http://127.0.0.1:8000 +echo. +echo [방법 3] Python 간단 서버 사용 +echo 1. cd wwwroot +echo 2. python -m http.server 8080 +echo 3. 브라우저: http://localhost:8080 +echo. +pause diff --git a/lib/Microsoft.Owin.FileSystems.dll b/lib/Microsoft.Owin.FileSystems.dll new file mode 100644 index 0000000..b723114 Binary files /dev/null and b/lib/Microsoft.Owin.FileSystems.dll differ diff --git a/lib/Microsoft.Owin.Host.HttpListener.dll b/lib/Microsoft.Owin.Host.HttpListener.dll new file mode 100644 index 0000000..f3dface Binary files /dev/null and b/lib/Microsoft.Owin.Host.HttpListener.dll differ diff --git a/lib/Microsoft.Owin.Hosting.dll b/lib/Microsoft.Owin.Hosting.dll new file mode 100644 index 0000000..64916c6 Binary files /dev/null and b/lib/Microsoft.Owin.Hosting.dll differ diff --git a/lib/Microsoft.Owin.StaticFiles.dll b/lib/Microsoft.Owin.StaticFiles.dll new file mode 100644 index 0000000..036075d Binary files /dev/null and b/lib/Microsoft.Owin.StaticFiles.dll differ diff --git a/lib/Microsoft.Owin.dll b/lib/Microsoft.Owin.dll new file mode 100644 index 0000000..d706512 Binary files /dev/null and b/lib/Microsoft.Owin.dll differ diff --git a/lib/Owin.dll b/lib/Owin.dll new file mode 100644 index 0000000..ba6e21e Binary files /dev/null and b/lib/Owin.dll differ diff --git a/nuget.exe b/nuget.exe new file mode 100644 index 0000000..324daa8 Binary files /dev/null and b/nuget.exe differ