8.0 KiB
8.0 KiB
MBN_STOCK_N 마이그레이션 현황
원본 기준선
원본은 .NET Framework 4.8 / C# 7.3 기반 WinForms 애플리케이션입니다. 약 38,000줄의 C# 코드와 다음 요소로 구성되어 있습니다.
- 대형
MainForm및 7개 WinForms UserControl - 보조 폼 7개
- Tornado/K3D 장면 처리 클래스 35개
- Oracle 및 MariaDB SQL/데이터 요청 계층
- FarPoint Spread 4 플레이리스트/그리드
원본 작업 트리의 MainForm.cs와 RES/MmoneyCoder.ini에는 커밋되지 않은 변경이 있습니다. 원본 저장소는 그대로 보존했으며, 새 프로젝트에는 비밀값이 포함된 INI를 복사하지 않았습니다.
화면/계약 적용 현황
| 기존 구현 | 새 구현 |
|---|---|
| WinForms MainForm | WinUI 3 MainWindow + 로컬 WebView2 UI |
FarPoint FpSpread 플레이리스트 |
HTML table + 선택/드래그 정렬/이동/삭제 |
| 플레이리스트 임시 저장 | WebView2 사용자 데이터 영역의 localStorage |
Oracle DC_LIST/PLAY_LIST |
이름 있는 플레이리스트 생성·교체·불러오기·삭제와 fresh page preflight |
| WinForms 단축키 | Web UI F2 / F8 / Esc 처리 |
| 직접 DBManager 호출 | Core의 IDataQueryExecutor 경계 |
Data/Request SQL 정의 |
.NET 8 Core 프로젝트로 71개 이관 |
| 동기 Oracle/MySQL 연결 | 비동기 Oracle/MariaDB 공급자, 취소·timeout·선별 재시도 |
DB 실패 시 Application.Exit() |
앱 유지 + WebView 소스별 health/오류/재조회 |
| 종목·지수 선택 데이터 | WebView의 KRX/NXT 종목 및 5개 지수 실데이터 표 |
| 직접 K3D COM 호출 | COM 중립 IPlayoutEngine + x64 late-bound 어댑터 |
| UI thread의 Tornado 호출 | bounded STA FIFO, timeout 격리, 재연결·프로세스 감시 |
| 버튼 즉시 상태 변경 | requestId 기반 WebView bridge와 실제 결과 후 상태 갱신 |
| AnyCPU/x86 혼재 | 솔루션 및 게시 프로필 x64 단일화 |
| 상대 경로 Web 파일 | MSIX Content 및 안전한 가상 호스트 매핑 |
WebView는 https://app.mbn.local 가상 호스트로 패키지 내부 파일만 제공합니다. 외부 탐색은 WebView 안에서 차단하고 기본 브라우저로 넘기며, 개발자 도구와 기본 컨텍스트 메뉴는 디버거가 연결된 경우에만 활성화합니다.
이 표의 새 구현은 화면·bridge·DTO·persistence 계약이 존재한다는 뜻이다. 운영 데이터 쓰기, 기존 운영 데이터의 문자·identity 복원, 외부 asset 준비, 실제 Tornado2/PGM 송출까지 모두 확인했다는 뜻은 아니다. 현재 재감사 판정과 남은 증거는 LEGACY_FEATURE_AUDIT.md를 따른다.
구현 및 후속 운영 경계
데이터베이스
- 완료:
Oracle.ManagedDataAccess.Core 23.26.200,MySqlConnector 2.6.1고정 - 완료: 실제 비동기
IDataQueryExecutor, 취소, 명령/전체 timeout, 새 연결 재시도 - 완료: LocalAppData/환경 변수 설정과 공개 오류의 비밀값 비노출
- 완료: Oracle/MariaDB health, 기존 종목·지수 SQL의 WebView 조회, 단위/실DB 스모크
- 후속: 운영 보안 정책에 맞춘 Credential Locker/DPAPI 전환과 계정 자동 순환
- 후속: 사용자 입력이 들어가는 나머지 legacy SQL의 단계적 매개변수화
Tornado/K3D
원본 MainForm/35개 Scene builder/PageN의 호출 순서와 현재 어댑터의 정확한 적용 범위는 원본 Tornado 송출 흐름 분석에 정리했습니다.
- 완료: Registry64의 K3D TypeLib/CLSID/ProgID/AMD64/Apartment 등록 검사
- 완료: 빌드 입력에 Interop DLL을 두지 않는 late binding과 선택적 진단용
TlbImp스크립트 - 완료:
IPlayoutEngine경계, bounded STA FIFO/message pump, timeout 후OutcomeUnknown격리 - 완료: 연결/해제, 명시적 재연결(no replay),
Tornado2접두사 프로세스 감시 - 완료:
PREPARE,TAKE IN,NEXT,TAKE OUTWebView 메시지 및 상태/오류 UI 연결 - 완료: 기본 DryRun, Test의 단일 loopback 테스트 인스턴스·채널, Test/Live 공통 폐쇄형 씬 allowlist, Live 이중 승인
- 완료: 현재 Tornado2 PGM 렌더 창에 대한 x64 K3D
KTAPConnect → Disconnect실제 왕복 및 Network Monitoring[R] HELLO/[S] SUCCESS HELLO확인. 렌더 명령은 호출하지 않음 - 완료: 네이티브/Interop 이중 SHA-256 핀, 프로세스 수명 파일 잠금, 실제 PGM listener 소유권 및 KTAP 지연 dispatch 차단
- 과거 기본 경로 증거: 승인된 PGM 고정 runner에서
5001 → 5006 → TAKE OUT과 Network MonitoringHELLO/LOAD_SCENE/SCENE_PREPARE/PLAY/STOPAL/BYE, 39개 연속 캡처를 검증했다. 이는 현재 WebView의 fresh TAKE IN, Page NEXT, timer refresh 또는 35개 builder 동등성 완료 증거가 아니다. - 완료: 첫 과거 회차의 출력 전 Prepare 거부 원인이 cue 이중 resolve임을 확인하고, 상대 cue와 승인 검사용 절대 자산 경로를 분리하는 수정 및 회귀 테스트 적용. 결과 불명확 시 재시도 금지 원칙 유지
- 과거 실패·복구 증거: 승인 회차
MBNWEB-20260711-A의 CONNECT/PREPARE 뒤 fresh TAKE IN Oracle 조회가 K3D PLAY 전에 명확히 실패했으며 재시도 없이 STOPAL/UNLOAD/BYE로 회수했다. - 승인 범위 완료: 이후
MBNWEB-20260711-H에서 설치된 MSIX WebView로5001 PREPARE → fresh TAKE IN → 자동 refresh 1회 → 5074 playlist NEXT → Page NEXT → TAKE OUT을 실제 PGM과 Network Monitoring에서 함께 확인했다.PLAY=4,SCENE_PLAYED=4, FAILURE/ERROR/retry=0, 최종OutcomeUnknown=false였다. 이 증거는 승인된5001/5074에만 적용한다. - 완료:
OnScenePlayed/OnCutOut/OnStopAllcallback 기반 장기 세션 Scene unload와 pending callback fail-closed accounting - 화면/계약 구현: 35개 scene builder의 복합 K3D mutation 및
PageN/Nxt_PageN5·6·12개/최대 20페이지 포팅과 자동·실제 DB read→DTO→mutation 검증. 실제 장면별 PGM 검증과 asset readiness는 별도 판정
화면/계약 구현과 운영 동등성 검증
- 화면/계약 구현: MainForm과 UC1~UC7의 종목·고정·업종·비교·테마·해외·전문가·거래정지 workflow, GraphE·FSell·VIList·PList/AList·ThemeA·EList 전용 화면과 native bridge
- 자동 계약 검증: 328 fixed + 44 industry + 31 stock + 9 comparison의 412 action 매트릭스, typed DTO, 저장·복원 fail-closed 경계
- 적용 중: PList의 기존 한국어
DC_TITLE/LIST_TEXT복원. 기존 운영 DB 행을 원본과 문자 단위로 대조하기 전에는 완료로 판정하지 않음 - 화면/계약 구현·운영 검증 대기: GraphE·FSell·VI 항목을 포함한 manual named save→reload→fresh identity/version/page plan 복원, ThemeA/EList의 KRX/NXT·동명이름·코드 identity 보존
- 코드 적용·운영 검증 대기: 원본
Data\종목비교.dat, FSell, VI를 고정 read-only source에서 strict parser·hash·fresh identity·durable intent로 검증한 뒤 private 저장소로 이전하는 one-time importer. 실제 package profile의 명시적 1회 실행은 아직 수행하지 않음 - 외부자산 필요:
s5006의Video\큐브배경.vrv,s6001해외지수의 국가별 영상 13개. 현재 alias-only cut 검사를 asset-ready 근거로 사용하지 않음 - 운영 동등성 미검증: GraphE, PList/AList, ThemeA, EList의 실제 Oracle DB-W와 FSell/VI 운영 파일 write/read-back
- 실제 PGM 제한: Round H의
5001/5074만 완료 증거가 있으며 나머지 장면·화면은 별도 승인 회차가 필요함
의도적으로 제외한 항목
- WinForms
*.Designer.cs,*.resx - FarPoint DLL과 라이선스 파일
Interop.K3DAsyncEngineLib.dll복사본- 원본
App.config바인딩 리디렉션 - 실제 DB 주소, 계정, 암호가 들어 있는 INI
- Git에서 관리되지 않던 약 212MB의 Tornado 컷/영상 자산
이 항목들은 WinUI/WebView/MSIX 경계에 맞춰 재구현하거나, 정식 라이선스 및 운영 자산 위치가 확인된 뒤 어댑터 형태로 연결합니다.