# SheetMe 배포 가이드 ## 요약 ```bash pwsh tools/publish.ps1 ``` 산출물을 각 병원의 **`[000]bin\SheetMe\`** 하위 폴더에 푼다. 접속 정보는 코드나 설정에 넣지 않는다 — `[000]bin\MSYSTECH_ServerInfo.ini`에서 자동으로 읽는다. --- ## 🔴 `[000]bin` 최상위에 평면 복사 금지 `[000]bin`은 **DLL 1,772개 / EXE 187개**를 공유하는 폴더다. 신규 산출물과 이름이 겹치는 DLL이 실측 기준 아래와 같다. | DLL | 신규(.NET 10) | 기존(.NET FW) | |---|---|---| | `Oracle.ManagedDataAccess.dll` | 5,434 KB | 4,602 KB | | `Microsoft.Web.WebView2.*.dll` ×3 | — | — (`ExcludeAssets="runtime"` 로 제외됨) | 평면 복사하면 `Oracle.ManagedDataAccess.dll`이 덮여 **레거시 EXE 187개 전부가 Oracle 접속 불능**이 된다. 반드시 하위 폴더에 둔다. `Information`, `Log`, `OCR서식생성기`, `SpreadDesign` 등 기존 앱들도 같은 방식이다. --- ## 런타임 요구사항 FDD(framework-dependent)로 배포한다. 단말에 **.NET 10 Desktop Runtime**(`Microsoft.WindowsDesktop.App 10.x`)이 필요하다. ```bash dotnet --list-runtimes | findstr WindowsDesktop.App ``` 선례: `[000]bin\OCR서식생성기\WindowsOCR.runtimeconfig.json`이 이미 `net10.0` + `Microsoft.WindowsDesktop.App 10.0.0`을 요구하며 운영 중이다. 런타임이 없는 단말이 발견되면 자체 포함으로 전환한다(산출물 8.6MB → 약 150MB). ```bash pwsh tools/publish.ps1 -SelfContained ``` --- ## 접속 정보 우선순위 ``` 환경변수 > appsettings.Development.json > appsettings.json > ServerInfo ini ``` - **병원 설치본**: 위 세 가지가 모두 없거나 플레이스홀더(`__HOST__`)이므로 `ServerInfo ini`로 떨어진다. `ResolveIniPath`가 실행 폴더에서 상위로 최대 9단계 탐색하므로 `[000]bin\SheetMe\` → `[000]bin\MSYSTECH_ServerInfo.ini`를 찾는다. - **개발 단말**: `appsettings.Development.json`(`.gitignore` 대상, Debug 빌드에서만 산출물 복사). - **일회성 오버라이드**: 환경변수 `ConnectionStrings__His`. ini의 `CurrentServer`가 가리키는 DB로 고정 연결되며, 값은 레거시와 동일한 MD5 → 3DES-ECB 규약으로 복호한다(`ServerInfoReader`). **복호 결과와 완성된 접속 문자열은 로그·화면에 절대 기록하지 않는다.** ### ⚠ `SaveMode` 기본값은 `File` ini의 `CurrentServer`는 **운영 병원 DB**를 가리킨다. 그래서 DB 쓰기는 `FormStore:SaveMode`를 `Db`로 명시한 단말에서만 활성화된다. 이 기본값을 바꾸지 말 것. --- ## 기동 규약 ``` SheetMe.Designer.exe "UidCod,ComNum,ShtCod" ``` 콤마 구분 단일 인자다(레거시 `M.EMR.SheetDesigner.exe`와 동일). 필드가 모자라도 동작한다. | 인자 | 의미 | |---|---| | `UidCod` | HIS 사용자 코드 — **감사 컬럼(`SdgUidCod` 등)의 출처.** 없으면 DB 쓰기가 차단된다 | | `ComNum` | 내원번호 — 레거시에서도 쓰이지 않는 죽은 인자. 형상 보존용 | | `ShtCod` | 기동 시 자동으로 열 서식 코드. 비우면 서식 목록만 표시 | 예: `SheetMe.Designer.exe "011825,,P163"` ### 바로가기 배포 현재는 기록지정보 화면의 '서식생성기 연동' 버튼이 레거시를 띄운다(레거시 저장소 무수정 결정). SheetMe는 **사용자별 바로가기**로 기동한다 — `UidCod`가 감사 컬럼의 출처이므로 사용자마다 다른 인자가 필요하다. ``` 대상: C:\MsystechHIS_Ver.2\[000]Bin\SheetMe\SheetMe.Designer.exe "011825,," 시작 위치: C:\MsystechHIS_Ver.2\[000]Bin\SheetMe ``` 인자 없이 실행하면 미인증 상태로 열리며, **DB 읽기와 파일 저장은 되지만 DB 쓰기는 차단**된다. --- ## 배포 후 확인 1. `SheetMe.Designer.exe "<유효한UidCod>,,"` 실행 → 서식 목록이 뜨는지 2. 서식을 열고 **저장하지 말고** 닫기 → 정상 종료되는지 3. 로그 폴더(`[000]bin\SheetMe\logs\Designer\`)에 파일이 생기는지 4. 화면 어디에도 접속 문자열·비밀번호가 노출되지 않는지 5. **레거시 EXE가 멀쩡한지** — 기존 HIS 프로그램 하나를 띄워 DB 조회가 되는지 확인(평면 복사 사고 감지) --- ## 롤백 `[000]bin\SheetMe` 폴더 이름을 바꾸거나 지우면 끝난다. 레거시 산출물은 하나도 건드리지 않았으므로 다른 조치가 필요 없다. --- ## 아직 하지 않은 것 - **LiveUpdate 편입** — 하위 폴더 지원 여부와 삭제 파일 정리 동작을 확인하지 못했다. 모르는 상태로 태우면 구 DLL이 남는 반쪽 갱신이 진단 불가 장애가 된다. 수동 zip 배포로 시작하고, 안정화 후 `M.CMM.UpdateInfoFileGenerator.exe` 규격을 조사해 편입한다. - **단일 인스턴스 제어** — 같은 서식을 두 프로세스에서 열어 각각 저장하면 뒤에 저장한 쪽이 앞 내용을 이력으로 밀어낸다. 프로세스 내부는 막혀 있지만 프로세스 간에는 무방비다. 다중 사용자 병행 운영 전에 처리한다.