17 KiB
MBN Stock WebView
기존 MBN_STOCK_N WinForms 애플리케이션을 단계적으로 대체하기 위한 Windows 데스크톱 프로젝트입니다.
현재 유일한 개발·실행 대상은
src/MBN_STOCK_WEBVIEW.LegacyParityApp입니다. Visual Studio F5, 개발 MSIX, 신규 기능과 회귀 검증은 모두 이 앱을 기준으로 합니다.
루트 MBN_STOCK_WEBVIEW.csproj와 루트 MainWindow*/Web은 이전 비교 프로토타입입니다.
현행 솔루션과 기본 F5 대상에서는 제외하되, 연결된 과거 비교 테스트를 별도로 정리할 때까지
참고 소스로 보존합니다. 현재 완료·제한·외부 결정 범위는
이관 현재 기준선이 유일한 우선 문서이며, 문서별 용도는
문서 안내에서 확인할 수 있습니다.
현재 기준 기술 스택은 다음과 같습니다.
- .NET 8 / C#
- WinUI 3 (XAML)
- Windows App SDK 1.8.6 (
1.8.260317003) - WebView2 기반 운영 UI
- Windows x64 전용
- 단일 프로젝트 MSIX
현재 화면/계약 구현 범위
- WinUI 3 네이티브 창과 WebView2 간 JSON 메시지 브리지
- FarPoint 플레이리스트를 대체하는 Web UI
- 첫 열 송출 포함, 행/Ctrl+행 작업 선택
- 드래그 정렬 및 위/아래 이동
- 선택 삭제
- 로컬 저장/불러오기
- Oracle/MariaDB 4개 국내 시장 종목 검색과 실행 파일 옆
ResINI 기반 컷/UI 구성 - 원본 자산이 있는 전체 빌드는 읽기 전용
bin\Debug\Cuts를 실행 파일 옆Cuts로 같은 구조로 배치 - 기존 운영 흐름을 반영한
PREPARE/TAKE IN/NEXT/TAKE OUTUI F8,Esc단축키와 원본 배경 선택용 F2의 안전 예약- 원본의 공급자 비의존 SQL/데이터 요청 71개를 .NET 8 Core 프로젝트로 이관
- Oracle/MariaDB 실제 비동기
IDataQueryExecutor와 소스별 health/retry/timeout - WebView 코스피·코스닥·NXT·5개 지수·해외 실데이터 조회와 장애 UI
- COM 중립
IPlayoutEngine, x64 K3D late binding, 전용 STA 큐와 프로세스 감시 - 네이티브 결과가 성공한 뒤에만 갱신되는
PREPARE/TAKE IN/NEXT/TAKE OUTWebView 브리지 - 기본
DryRun, Test 전용 인스턴스·채널·씬 allowlist 및 Live 이중 승인 안전 게이트 - MSIX 패키지 매니페스트와 x64 게시 프로필
Oracle/MariaDB 조회 계층, 원본 10초 DB 상태 감시, Tornado/K3D 어댑터와 35개 scene 계약을 구현했습니다. 2026-07-22 현재 최신 개발 MSIX의 전체 UI/DB·로컬 상태 물리 검증과 실제 PGM runtime route code 33/34가 승인된 action 범위에서 끝났습니다. s5006 큐브 배경 action과 s6001 국가 영상 13 action만 원본에도 없는 외부 제작 자산 때문에 fail closed 상태이며, s6001의 두바이유·WTI·브렌트유·금 4 action은 실제 PGM 검증을 완료했습니다. 앱과 Release 패키지의 기본 모드는 계속 DryRun이며 Live allowlist, 명령 예산, callback/OutcomeUnknown 게이트를 완화하지 않습니다. 이 개발 PC의 Tornado2/PGM 마이그레이션 검증은 사용자가 반복 승인 없이 진행하도록 상시 허용했으며, 적용 범위와 중단 조건은 개발 환경 상시 권한에 기록했습니다. DB 설정은 DB 운영 가이드, 송출 설정·실제 검증 증거·롤백은 Tornado/K3D 운영 가이드, 원본 Scene/PageN 대조는 송출 흐름 분석, 장면별 현황은 35개 Scene 동등성 매트릭스, 전체 412개 실행 action과 전용 편집 화면은 운영자 UI 동등성 인벤토리를 참고하세요.
35개 Scene/PageN 런타임과 원본 MainForm·UC1~UC7·GraphE·FSell·VIList·PList·AList·ThemeA·EList의 화면·bridge 계약은 WinUI 3/WebView2에 연결했습니다. 최신 패키지에서 실제 Windows 입력 1,838건으로 검색·키보드·컷/플레이리스트 drag·PList 모달과 화면별 버튼, 개발 DB create/save→fresh readback→delete를 검증했고 cleanup까지 확인했습니다. PList 2,213행은 모두 목록과 scene alias를 복원하며, 그중 1,617행은 fresh typed selection까지 증명됐고 596행은 식별정보 부족으로 추정 없이 보류합니다. 5077 6행 20페이지 전체, 마지막 페이지, 5088 12행 전환, 장기 실행 뒤 unload와 s6001 영상 비의존 4 action도 실제 PGM에서 확인했습니다. 고객 배포용 서명 MSIX, 외부 영상·배경 자산, 보류 596행의 DBA 결정은 아직 남아 있습니다.
과거 검증 자료
1.0.5 패키지와 날짜가 붙은 Gate·Release·Live 문서는 당시 실행의 역사적 증거입니다.
현행 완료 판정이나 새 패키지 승인으로 재사용하지 않습니다. 당시 상세 내용은
1.0.5 패키지 감사와
동작 동등성 작업 기록에 보존되어 있습니다.
Visual Studio 2026에서 실행
실제 송출을 확인할 기존 개발 PC는 바로 F5하지 말고 아래의
기존 설치가 있는 개발 PC에서 실제 송출 초기화를 먼저 실행합니다. 화면만 안전하게 확인하는
새 PC는 다음 순서를 사용합니다.
MBN_STOCK_WEBVIEW.sln을 엽니다.- 솔루션 구성을
Debug, 플랫폼을x64로 선택합니다. - 공유 시작 프로필
Legacy Parity App (VS F5)또는src\MBN_STOCK_WEBVIEW.LegacyParityApp을 시작 프로젝트로 선택합니다. - 실행 프로필이
MBN_STOCK_WEBVIEW.LegacyParityApp - Explicit DryRun (Package)인지 확인합니다. F5로 빌드·배포·실행합니다.
새로 받은 소스에 외부 MBN_STOCK_N\...\bin\Debug가 없어도 Debug/F5는 안전한
소스 전용 DryRun으로 빌드됩니다. 이 모드에서는 검증된 내장 메뉴로 화면을 확인할 수 있지만
DB 검색과 실제 장면 송출은 사용할 수 없습니다. Test/Live 송출 안전 게이트는 완화되지 않으며,
소스 전용 빌드는 과거 로컬 송출 프로필·환경 변수·Development Live 실행 인수를 무시하고
DryRun과 DB 미연결을 강제합니다. 출력과 중간 패키징 파일도 이전 전체 빌드의 Cuts, Res
또는 DB 설정을 잘못 재사용하지 않도록 bin\SourceOnly와 obj\SourceOnly에 분리됩니다.
기존 설치가 있는 개발 PC에서 실제 송출
상사 PC처럼 Cuts, Res\MmoneyCoder.ini, Tornado2/K3D x64와 장비 라이선스가 이미 있는
방송 비연결 개발 장비에서는 Git에 자산을 넣거나 runtime ZIP을 다시 전달할 필요가 없습니다.
다만 Git은 이 로컬 항목과 실제 PGM endpoint·승인 해시를 의도적으로 포함하지 않으므로,
무설정 첫 F5만으로 실제 송출하는 것은 불가능합니다. 잘못된 과거 출력이나 다른 Tornado 자산을
자동 선택하지 않도록 최초 clone마다 Visual Studio를 열기 전에 저장소 루트에서 다음 초기화를
한 번 실행합니다.
powershell -NoProfile -ExecutionPolicy Bypass `
-File .\scripts\Initialize-ExistingDevelopmentPc.ps1 `
-LegacyRuntimeSourceRoot '<Cuts와 Res의 공통 부모>' `
-ConfigureDevelopmentLive `
-PlayoutHost 127.0.0.1 `
-PlayoutPort <Tornado2에서 직접 확인한 Network-Server-port> `
-NativeSha256 '<독립 승인된 native DLL SHA-256>' `
-InteropSha256 '<독립 승인된 Interop DLL SHA-256>'
-LegacyRuntimeSourceRoot를 생략하면 정확한 기본 형제 경로를 먼저 확인하고, 없으면 Windows
폴더 선택기를 엽니다. 여기서는 Cuts와 Res를 함께 포함하는 bin\Debug 공통 부모를
선택하거나, 편의를 위해 그 바로 아래의 Cuts 또는 Res를 선택해도 공통 부모로
정규화됩니다. DB INI가 선택한 Res\MmoneyCoder.ini가 아닌 다른 위치에 있으면 검토한
절대 경로를 -DatabaseIniPath로 지정합니다. 기존 승인 프로필이 별도 출력 채널을 사용하는
경우에만 확인된 숫자를 -OutputChannel로 추가합니다.
초기화기는 기존 자산을 검증한 뒤 사용자 전용 LocalAppData에 검증된 runtime 복사본을 만들고,
Git 제외 Directory.Build.local.props가 그 복사본을 Required 모드로 사용하게 합니다.
DB INI도 사용자 전용 LocalAppData overlay로 복사해 ACL을 보호하고, K3D x64 등록을 읽기
전용으로 점검합니다. 위 Live 옵션을 모두 준 경우에만 별도 승인 해시를 실제 등록 파일과
대조한 뒤 보호된 Development Live 설정을 마지막에 새로 발급합니다. Debug x64 빌드 출력은
선택한 manifest와 경로·길이·SHA-256·파일 집합이 정확히 일치하고 SourceOnly가 아닌지까지
자동 확인합니다. 중간 단계가 실패하면 기존 runtime 연결과 DB overlay를 원래 내용·ACL로
되돌리고 Live 승인 파일을 남기지 않습니다. 이 과정은 Tornado에 CONNECT하거나 장면을
송출하지 않습니다.
초기화가 성공하면 Visual Studio에서 Debug|x64, Legacy Parity App (VS F5),
MBN_STOCK_WEBVIEW.LegacyParityApp - Development Live (Package)를 선택해 F5로 시작합니다.
앱이나 빌드 출력이 SourceOnly 또는 DryRun이라고 표시되면 송출을 시도하지 말고 초기화를
바로잡습니다. 최초 실제 확인은 개발 PGM 인수 절차에 따라
5001 하나로 진행합니다. Development Live는 이 Debug 프로세스에만 적용되며 Release와 기본
프로필은 계속 DryRun입니다. 이 프로필은 보호된 LocalAppData 설정만 읽고 상속된
MBN_STOCK_PLAYOUT_*·DB 환경 변수와 기존 운영자 scene/resource/background 선택을 무시합니다.
endpoint는 숫자형 loopback, scene root는 실행 파일 옆 검증된 Cuts로 다시 고정하며 strict
검증이 실패하면 Live를 승인하지 않고 안전한 DryRun으로 시작합니다.
같은 clone에서는 로컬 연결 파일이 Git에 덮어써지지 않으므로 이후에는 git pull 후 F5로
확인할 수 있습니다. 저장소를 새 폴더에 다시 clone하거나 자산·DB·K3D·PGM 설정이 바뀌면
초기화를 다시 실행합니다. pull 뒤 Required 자산 검증이 실패하는 경우에도 F5를 계속 시도하지
말고 초기화기를 다시 실행합니다. 상사에게 저장소 주소를 전달하기 전에는 이 초기화 기능이
상사가 받는 기본 브랜치에 통합되어 있는지 확인합니다.
해당 PC에 Cuts/Res가 없을 때만
New-LegacyRuntimeBundle.ps1과 Initialize-LegacyRuntimeBundle.ps1의 검증 ZIP 절차를
대안으로 사용합니다. 자세한 두 흐름은 개발 PGM 인수 절차와
Cuts/Res 런타임 배치에 있습니다.
이 프로젝트는 MSIX 패키지 ID가 필요한 앱입니다. bin 아래의 EXE를 직접 실행하지 말고 반드시 Package 프로필이나 설치된 MSIX로 실행하세요.
기존 중복 형식 오류(CS0121, CS0436)는 루트 앱 프로젝트가 하위 Core 소스까지 다시 컴파일하던 문제였으며, 현재 src\**\*.cs를 앱 컴파일 대상에서 제외해 해결했습니다. Visual Studio가 이전 진단을 계속 표시하면 빌드 > 솔루션 정리 후 다시 빌드하세요.
명령줄 빌드
dotnet restore MBN_STOCK_WEBVIEW.sln -p:Platform=x64
dotnet build MBN_STOCK_WEBVIEW.sln -c Debug -p:Platform=x64
K3D 등록 상태와 COM을 열지 않는 dry-run 송출 흐름 확인:
powershell -NoProfile -ExecutionPolicy Bypass `
-File .\scripts\Inspect-K3DRegistration.ps1
dotnet run --project .\tools\MBN_STOCK_WEBVIEW.PlayoutSmoke `
-c Debug -p:Platform=x64 -- --dry-run
격리 Tornado TEST의 프로세스·Network Server 포트·loopback 주소·LISTEN 소유권은 COM을 열기 전에 읽기 전용 점검 스크립트로 확인합니다. 설치 폴더의 다른 Tornado2 버전 EXE는 현재 사용자 설정과 출력 장치를 공유할 수 있으므로 PGM 옆에서 TEST 대용으로 실행하지 않습니다.
별도 Test 인스턴스 검증은 Tornado/K3D 운영 가이드의 단계별 CLI를 사용합니다. --test-plan은 절대 경로 로컬 JSON과 씬 자산만 확인하며 엔진/COM을 만들지 않습니다. PGM/PROGRAM이 전혀 없는 격리 출력에서만 --test-connect로 연결·해제를 확인한 뒤 --test-sequence로 PREPARE → TAKE IN → NEXT → TAKE OUT을 실행합니다. Test 명령은 MBN_STOCK_PLAYOUT_* 환경 override와 Live 설정을 거부하고 자동 재연결·재생을 하지 않습니다. 승인된 Test 씬 후보는 basename 5001, 5006이며 실제 자산 경로는 저장소에 기록하지 않습니다.
중요: 앱의 기본 DryRun, --probe, --dry-run, --test-plan은 KTAPConnect를 호출하지 않습니다. 따라서 이 단계에서 Tornado2의 View > Network Monitoring Window에 앱이 보낸 통신 기록이 없는 것은 정상입니다. 이 CLI 절차에서는 모든 안전 게이트를 통과한 격리 Test의 --test-connect에서 처음 네트워크 기록을 기대하며, 별도로 승인된 UI Test 실행도 기록을 만들 수 있습니다. 사용할 포트는 예제 숫자가 아니라 해당 격리 Test Tornado의 Tools > Option > Control > Network Server > TCP Port 실값이어야 합니다.
Tornado2의 PGM 창은 본 프로그램의 KTAP 명령을 렌더링하는 출력 창입니다. 현재 PGM과의 네트워크 왕복만 진단할 때는 일반 Test/Live 엔진을 완화하지 않고 --pgm-connect-diagnostic을 사용합니다. 이 명령은 Registry64에서 계산한 x64 K3D 네이티브 DLL과 Interop이 운영자 승인 SHA-256 핀 MBN_STOCK_K3D_NATIVE_SHA256/MBN_STOCK_K3D_INTEROP_SHA256과 각각 일치할 때만 동적으로 사용하며 KTAPConnect → Disconnect만 한 번 수행합니다. Scene player, 장면 로드, PREPARE, PLAY, STOP 계열 API 표면은 포함하지 않으며 해시 승인 절차와 판정 방법은 Tornado/K3D 운영 가이드에 있습니다.
MSIX 생성:
dotnet build .\src\MBN_STOCK_WEBVIEW.LegacyParityApp\MBN_STOCK_WEBVIEW.LegacyParityApp.csproj `
-c Release `
-p:Platform=x64 `
-p:GenerateAppxPackageOnBuild=true `
-p:AppxPackageSigningEnabled=false
위 명령은 서명되지 않은 개발 패키지를 AppPackages에 만듭니다. 배포용 MSIX는 Package.appxmanifest의 Identity/Publisher 값과 정확히 일치하는 인증서로 서명해야 합니다. 인증서와 개인 키는 저장소에 커밋하지 않습니다.
Release MSIX는 전체 런타임 자산을 필수로 검증합니다. 원본 위치가 기본 형제 경로와 다르면
-p:LegacyRuntimeSourceRoot="D:\path\to\MBN_STOCK_N\MBN_STOCK_N\bin\Debug"를
추가해야 합니다.
구성과 보안
원본 Res/MmoneyCoder.ini의 값은 저장소에 복사하지 않았습니다. 전체 자산 Debug 빌드,
소스 전용 빌드, 게시와 MSIX 모두 이 자격증명 파일을 빌드 입력이나 출력으로 사용하지 않습니다.
전체 자산 Debug/MSIX는 %LOCALAPPDATA%\MBN_STOCK_WEBVIEW\Res\MmoneyCoder.ini 또는 기존
database.local.json을 사용하고, 소스 전용 빌드는 DB 미연결을 강제합니다. 일반 실행에서는
환경 변수가 선택된 파일보다 우선하지만, 검증된 Development Live 프로필은 이 override를
의도적으로 무시하고 위 LocalAppData 파일만 사용합니다. 설정 우선순위, 보안과 실제 DB 스모크 방법은
DB 운영 가이드에 정리했습니다.
MSIX 설치 폴더는 읽기 전용입니다. 전체 자산 빌드에서는 읽기 전용 원본 Cuts 179개와 허용된
UI용 Res 파일이 실행 출력·게시·MSIX에 포함되지만, DB 자격증명 INI·백업·인증서·벤더 DLL은
포함하지 않습니다. 현재 원본에 없는 s5006/s6001 영상과 일부 배경은 별도 원본 제작 자산을
확보해야 합니다. 로그, 플레이리스트, 운영자 설정과 미리보기 파일은
ApplicationData.Current.LocalFolder 또는 LocalCacheFolder에 저장합니다.
프로젝트 구조
src/MBN_STOCK_WEBVIEW.LegacyParityApp/ WinUI 3 / WebView2 / 원본 동작 호환 MSIX 앱
MainWindow*.cs, Web/ 네이티브 권위·보안 경계와 로컬 운영 UI
MBN_STOCK_WEBVIEW.csproj 이전 프로토타입 앱(솔루션/F5 제외, 참고용 보존)
src/MBN_STOCK_WEBVIEW.Core/ 이관된 데이터 요청 및 공급자 비의존 Core
src/MBN_STOCK_WEBVIEW.Infrastructure/ Oracle/MariaDB 공급자·설정·복원력·health
src/MBN_STOCK_WEBVIEW.Playout/ x64 Tornado/K3D STA·COM 어댑터와 안전 게이트
tests/ Core/Infrastructure/Playout 단위 테스트
tools/MBN_STOCK_WEBVIEW.DbSmoke/ 비밀값을 출력하지 않는 실제 DB 스모크
tools/MBN_STOCK_WEBVIEW.PlayoutSmoke/ COM 비활성 probe/plan과 격리 Test 연결·시퀀스 CLI
Config/ 비밀값 없는 구성 템플릿
ThirdPartyNotices/ 공급자 재배포 라이선스 고지
docs/ 마이그레이션 기록과 다음 단계
원본 C:\Users\MD\source\repos\MBN_STOCK_N은 수정하거나 초기화하지 않았습니다.