Files
MBN_STOCK_WEBVIEW/docs/SCENE_EQUIVALENCE.md

22 KiB

35개 Scene 동등성 완료 매트릭스

기준 시각은 2026-07-10이다. 원본 C:\Users\MD\source\repos\MBN_STOCK_N은 읽기 전용으로만 분석했으며, 이 문서 작업에서도 원본 파일을 수정하지 않았다. 원본 35개 builder의 파일 해시는 legacy-scene-source-hashes.json, 원본 구조 기준선 검사는 Test-LegacySceneBaseline.ps1에 있다.

이 문서에서 구현 완료는 DTO → mutation builder, 실제 데이터 loader, playlist selection resolver 또는 명시적 runtime route, 자동 테스트가 모두 존재한다는 뜻이다. 동등성 완료는 여기에 실제 데이터와 승인된 Tornado2/PGM 검증까지 통과해야 한다. 따라서 현재 전체 목표는 아직 완료가 아니다.

현재 판정

항목 상태 근거와 제한
원본 inventory와 hash 기준선 완료 35/35 builder, 원본 기준선 스크립트 35/35
DTO와 mutation builder 완료 registry가 정확히 35개 builder를 발견하고 catalog와 1:1 대조
loader와 runtime route 완료 MainForm 도달 가능 builder 34개, active alias 45개를 fail-closed route로 등록; s8086은 원본과 같이 무alias 진단 전용
자동 테스트 완료 최신 전체 재검증에서 Core Debug/Release x64 각각 779/779, Playout 각각 355/355, Infrastructure 각각 64/64, Web safety 11/11 통과. 테스트 추가에 따라 개수는 달라질 수 있으며 핵심 판정은 각 suite의 실패 0건이다.
Visual Studio 2026 빌드 완료 Debug/Release x64 빌드 성공
Release x64 MSIX 완료 trusted 개발 MSIX 생성·서명 검증·x64 설치·package context 실행 성공. 실제 DB DryRun에서 5001 PREPARE → fresh TAKE IN → timer refresh → 5074 playlist NEXT → Page NEXT → TAKE OUT과 5074의 1/20~20/20, 마지막 END OF PLAYLIST/NEXT 비활성, 편집 잠금 해제를 확인
실제 데이터 전체 장면 smoke 완료 34개 도달 가능 builder 전체 통과: 33개 Oracle/MariaDB loader와 s5025 trusted 외부 CP949 파일. 무alias s8086 diagnostic도 통과했고 실제 Oracle/MariaDB query 55건이 모두 성공했다.
이번 마이그레이션의 실제 Tornado2/PGM 미승인·미실행 현재 WebView → native workflow로 실제 PREPARE/fresh TAKE IN/Page NEXT/playlist NEXT/timer refresh/TAKE OUT, Network Monitoring, PGM 화면을 함께 검증하지 않음

과거 고정 runner로 수행한 5001 → 5006 PGM 왕복은 K3D 연결과 기본 load/play/stop 경로의 증거일 뿐이다. 35개 builder, 실제 DB mutation, Page NEXT와 현재 WebView workflow의 동등성 증거로 재사용하지 않는다.

표기

Mutation 약어는 실제 COM 메서드를 Web 입력에 노출하지 않는 COM-neutral 모델을 뜻한다.

약어 mutation
V PlayoutSetValue
A PlayoutSetAssetValue
Vis PlayoutSetVisible
C PlayoutSetFaceColor
Pos PlayoutSetPosition
PosK PlayoutSetPositionKey
Scale PlayoutSetScale
Crop PlayoutSetCropKey
Angle PlayoutSetCircleAngleKey
Path PlayoutSetPathPoints
Shape PlayoutSetPathShapePoints
BgV PlayoutSetBackgroundVideo 및 background 사용 상태

실제 데이터 상태는 다음과 같이 기록한다.

  • DB-P: 실제 Oracle/MariaDB 조회 → typed DTO → mutation preflight가 통과했다.
  • FILE-P: s5025의 trusted 외부 CP949 수동 파일 → DTO → mutation preflight가 통과했다. 실제 파일과 디렉터리는 계속 Git 밖에 둔다.
  • DB-DP: 원본 MainForm에서 도달하지 않는 s8086 diagnostic 조회와 mutation preflight가 통과했다. 이 결과로 runtime alias를 만들지는 않는다.
  • TOR-W: 이번 마이그레이션 runtime으로 해당 scene을 실제 Tornado2/PGM에서 검증하지 않았다. 회차 승인 전에는 실행하지 않는다.
  • TOR-NA: active alias가 없어 운영 송출 대상이 아니다.

자동 테스트 묶음

아래 묶음은 최신 Core Debug/Release x64 전체 실행에 포함돼 실패 0건으로 통과했다. 모든 행에는 공통으로 LegacySceneCatalogTests, LegacySceneMutationBuilderRegistryTests, LegacySceneRuntimeCoverageTests, LegacySceneDataSourceRouterTests가 적용된다.

코드 테스트 파일
T-PARAM ParameterizedMarketSceneBuildersTests, ParameterizedMarketSceneDataLoadersTests, LegacyParameterizedSceneRequestResolverTests
T-PANEL ReadOnlyPanelSceneBuildersTests, EquityPanelSceneDataLoadersTests, PanelSceneDataLoadersTests, MarketPanelSceneDataLoadersTests
T-GRID TabularMarketSceneBuildersTests, FoundationalSceneBuildersTests, GridMarketSceneDataLoadersTests, TraderQuoteSceneDataLoadersTests, LegacyGridMarketSceneRequestResolverTests
T-MANUAL TrustedManualSceneDataLoader5025Tests, Infrastructure의 S5025TrustedManualFileDataSourceTests
T-COMP ComparisonAndYieldSceneBuildersTests, ComparisonAndYieldSceneDataLoadersTests, ComparisonAndYieldLegacyRequestResolverTests
T-CHART ChartSceneBuilders5078To5084Tests, ChartSceneDataLoadersTests, ChartLegacySceneRequestResolverTests
T-PAGED PagedQuoteSceneBuildersTests, PagedQuoteSceneDataLoadersTests, ScenePagingTests, LegacyPlayoutWorkflowTests
T-FOUND FoundationalSceneBuildersTests, ManualSceneDataLoadersTests, 해당 panel/grid loader 테스트
T-5082 GridSceneBuilder5082Tests
T-CANDLE CandleSceneBuilderTests, CandleSceneDataLoaderTests

35개 builder별 완료 판정

Builder / alias / page 원본 기능 새 builder → loader → resolver/route mutation 자동 테스트 실제 데이터 실제 Tornado
s5001 / 5001, N5001 / — 국내·NXT·해외 지수, 환율, 업종, 종목 단일 시세와 등락 표식 S5001SceneMutationBuilderS5001SceneDataLoaderLegacyParameterizedSceneRequestResolver V, Vis, A T-PARAM 통과 DB-P TOR-W
s5006 / 5006 / — 국내·NXT 종목 현재·시가·고가·저가와 비율, 등락 상태, 큐브 배경 영상 S5006SceneMutationBuilderS5006DomesticSceneDataLoader/S5006NxtSceneDataLoader → market 직접 route V, Vis, C, BgV T-PANEL 통과 DB-P; Video\큐브배경.vrv 외부 자산 누락 TOR-W
s5011 / 5011 / — 국내·NXT 종목 시세, 액면가, 자본금, 시가총액, 순위 S5011SceneMutationBuilderS5011SceneDataLoader → branch 직접 route V, Vis, C T-PANEL 통과 DB-P TOR-W
s5016 / 5016 / — 미국·중화권·유럽·아시아 지수와 채권·환율·원자재 3열 panel S5016SceneMutationBuilderS5016SceneDataLoader → closed target 직접 route V, Vis T-PANEL 통과 DB-P TOR-W
s50160 / 50160 / — 원면·국제금·국내금 2열 panel S50160SceneMutationBuilderS50160SceneDataLoader → closed target 직접 route V, Vis T-PANEL 통과 DB-P TOR-W
s5023 / 5023 / — 코스피·코스닥 일별/월합계 주체별 매매동향 grid S5023SceneMutationBuilderS5023SceneDataLoaderLegacyGridMarketSceneRequestResolver V, C T-GRID 통과 DB-P TOR-W
s5024 / 5024 / — 코스피·코스닥 매매동향 막대, 중앙선과 양·음 크기/위치 S5024SceneMutationBuilderS5024SceneDataLoaderLegacyGridMarketSceneRequestResolver V, Vis, Pos, Scale T-GRID 통과 DB-P TOR-W
s5025 / 5025 / — 승인된 수동 파일의 개인·외국인·기관 순매도 좌·우 5쌍 S5025SceneMutationBuilderS5025SceneDataLoader/S5025TrustedManualFileDataSourceLegacyGridMarketSceneRequestResolver V T-GRID, T-MANUAL 통과 FILE-P; 외부 CP949 파일 통합 검증 완료 TOR-W
s5026 / 5026 / — 두 국내 종목 주간 candle과 각 종목 시세/OHLC S5026SceneMutationBuilderS5026SceneDataLoaderComparisonAndYieldLegacyRequestResolver V, Vis, C, Crop T-COMP 통과 DB-P TOR-W
s5029 / 5029 / — 두 종목 candle·수익률 비교와 두 path-shape S5029SceneMutationBuilderS5029SceneDataLoaderComparisonAndYieldLegacyRequestResolver V, Vis, Pos, Shape T-COMP 통과 DB-P TOR-W
s5032 / 8018, 8032, 5032 중 선물 조건 / — 선물을 포함한 좌·우 두 항목 plate S5032SceneMutationBuilderS5032SceneDataLoaderLegacyParameterizedSceneRequestResolver V, Vis, A T-PARAM 통과 DB-P TOR-W
s5037 / 5037 / — 국내 종목 현재가와 매수·매도 거래원별 수량 S5037SceneMutationBuilderS5037SceneDataLoaderLegacyGridMarketSceneRequestResolver V, Vis T-GRID 통과 DB-P TOR-W
s5074 / 5074 / 5 Oracle/MariaDB/DataManager 계열의 최대 5행 시세·수익률 목록 S5074SceneMutationBuilderS5074SceneDataLoader → typed paged 직접 route V, Vis, A T-PAGED 통과 DB-P TOR-W
s5076 / 5076 / — 주요매출 구성, 기준일, 항목 비율과 누적 원형 각도 S5076SceneMutationBuilderS5076SceneDataLoader → subject 직접 route V, Vis, Angle T-FOUND 통과 DB-P TOR-W
s5077 / 5077 / 6 Oracle/MariaDB/DataManager 계열의 최대 6행 시세·수익률 목록 S5077SceneMutationBuilderS5077SceneDataLoader → typed paged 직접 route V, Vis, A T-PAGED 통과 DB-P TOR-W
s5078 / 5078 / — 미국·국내 섹터지수 값과 양·음 막대 크기 S5078SceneMutationBuilderS5078SceneDataLoaderChartLegacySceneRequestResolver V, Vis, Scale T-CHART 통과 DB-P TOR-W
s5079 / 5079 / — 성장성 지표 기간·값과 복수 path S5079SceneMutationBuilderS5079SceneDataLoaderChartLegacySceneRequestResolver V, Vis, Path T-CHART 통과 DB-P TOR-W
s5080 / 5080 / — 매출액 분기 시계열과 양·음 막대/중앙선 S5080SceneMutationBuilderS5080SceneDataLoaderChartLegacySceneRequestResolver V, Vis, PosK, Scale T-CHART 통과 DB-P TOR-W
s5081 / 5081 / — 영업이익 분기 시계열과 양·음 막대/중앙선 S5081SceneMutationBuilderS5081SceneDataLoader → subject 직접 route V, Vis, PosK, Scale T-FOUND 통과 DB-P TOR-W
s5082 / 5082 / — 일자·개인·기관·외국인 매매동향 grid와 부호 variant S5082SceneMutationBuilderS5082SceneDataLoader → 직접 route V, Vis T-5082 통과 DB-P TOR-W
s5083 / 5083 / — 개인·기관·외국인 매매 시계열, baseline과 세 path S5083SceneMutationBuilderS5083SceneDataLoaderChartLegacySceneRequestResolver V, Pos, Path T-CHART 통과 DB-P TOR-W
s5084 / 5084 / — 코스피·코스닥 매매 시계열, baseline과 path S5084SceneMutationBuilderS5084SceneDataLoaderChartLegacySceneRequestResolver V, Pos, Path T-CHART 통과 DB-P TOR-W
s5085 / 5085 / — 프로그램 매매 grid의 구분별 금액과 부호 색상 S5085SceneMutationBuilderS5085SceneDataLoaderLegacyGridMarketSceneRequestResolver V, C T-GRID, T-FOUND 통과 DB-P TOR-W
s5086 / 5086 / — 국내·해외 지수/종목/업종 수익률 시계열과 path-shape S5086SceneMutationBuilderS5086SceneDataLoaderComparisonAndYieldLegacyRequestResolver V, Vis, Pos, Shape T-COMP 통과 DB-P TOR-W
s50860 / 50860 / — 국내·해외 지수/종목/업종 line 시계열과 path-shape S50860SceneMutationBuilderS50860SceneDataLoaderComparisonAndYieldLegacyRequestResolver V, Vis, C, Pos, Shape T-COMP 통과 DB-P TOR-W
s5087 / 5087 / — 두 국내 종목 candle·수익률 비교와 두 line shape S5087SceneMutationBuilderS5087SceneDataLoaderComparisonAndYieldLegacyRequestResolver V, Vis, Pos, Shape T-COMP 통과 DB-P TOR-W
s5088 / 5088 / 12 Oracle/MariaDB/DataManager 계열의 최대 12행 시세·수익률 목록 S5088SceneMutationBuilderS5088SceneDataLoader → typed paged 직접 route V, Vis, A T-PAGED 통과 DB-P TOR-W
s6001 / 6001 / — 해외지수와 유가·금 단일 plate, 연계 이미지·영상/방향 상태 S6001SceneMutationBuilderS6001SceneDataLoader → closed target 직접 route V, A, Vis, C T-PANEL 통과 DB-P TOR-W
s6067 / 6067 / — 기관 순매수 grid와 부호 색상 S6067SceneMutationBuilderS6067SceneDataLoaderLegacyGridMarketSceneRequestResolver V, C T-GRID, T-FOUND 통과 DB-P TOR-W
s8001 / 8001, 8002 / — 코스피·코스닥 업종 square chart와 cube 색상 S8001SceneMutationBuilderS8001SceneDataLoaderLegacyParameterizedSceneRequestResolver V, C T-PARAM 통과 DB-P TOR-W
s8003 / 8003 / — 국내 종목 호가·시세와 매수·매도 잔량 막대 S8003SceneMutationBuilderS8003SceneDataLoaderLegacyGridMarketSceneRequestResolver V, Vis, C, Scale T-GRID 통과 DB-P TOR-W
s8010 / 8035, 8061, 8040, 8046, 8051, 8056 / — 지수·종목·거래정지·해외 candle, 거래량, 예상지수, 이동평균 path S8010SceneMutationBuilderS8010SceneDataLoader → alias/market/mode 직접 route V, Vis, C, Pos, Crop, Path T-CANDLE 통과 DB-P TOR-W
s8018 / 8018, 8032, 5032 중 비선물 조건 / — 국내·NXT·해외·업종 좌·우 두 항목 plate S8018SceneMutationBuilderS8018SceneDataLoaderLegacyParameterizedSceneRequestResolver V, Vis, A T-PARAM 통과 DB-P TOR-W
s8067 / 8067, 5068, 5070, 5072 / — 글로벌 world-map의 지역별 현재가·등락과 방향/배경 상태 S8067SceneMutationBuilderS8067SceneDataLoader → 직접 route V, Vis, C T-FOUND, T-PANEL 통과 DB-P TOR-W
s8086 / active alias 없음 / — 유가·금 3열 원천. 원본 파일은 있으나 MainForm dispatch 없음 S8086SceneMutationBuilderS8086DiagnosticSceneDataLoader; 앱 runtime route 없음 V, C T-FOUND, T-PANEL 통과 DB-DP TOR-NA

공통 호출 순서 동등성

모든 runtime scene은 Web에서 object 이름이나 K3D 메서드를 받지 않는다. Web은 closed playlist selection만 보내고, loader가 조회 결과를 명시적 DTO로 만들며, registry의 typed builder가 allowlisted mutation을 생성한다.

PREPARE의 공통 순서는 다음과 같다.

  1. 활성 playlist 항목과 cut alias를 결정하고 native loader로 page DTO를 조회한다.
  2. scene을 load하고 cue-level background와 fade/scene effect를 적용한다.
  3. BeginTransaction을 호출한다.
  4. builder가 생성한 mutation을 원본 순서대로 적용한다.
  5. QueryVariables를 호출한다.
  6. EndTransaction을 호출한다.
  7. layout 10을 Prepare한다.

TAKE IN은 PREPARE 때의 오래된 DTO를 그대로 재생하지 않는다. 원본 ONAirMode와 같이 현재 playlist snapshot의 같은 entry/page를 실제 DB에서 다시 조회하고 새 scene을 LoadScene → transaction → Prepare(10)한 뒤, 그 prepare가 명확히 성공한 경우에만 Play(10)을 한 번 호출한다. PREPARE를 다시 누르는 원본 toggle은 TakeOut(All)/StopAll로 state를 정리한다. timeout 또는 OutcomeUnknown은 retry 가능한 실패로 낮추지 않는다.

공통 fade와 배경은 Web 입력이 아니라 로컬 trusted playout 설정에서만 온다. legacySceneFadeDuration의 원본 기본값은 6이며, legacySceneBackgroundKind, scene root 아래의 상대 legacySceneBackgroundAssetPath, video loop 설정을 PlayoutSceneCompositionFactory가 검증한다. DryRun에서도 경로 탈출, 절대 경로, 허용되지 않은 확장자, reparse point, 누락 파일을 실제 COM 전에 fail-closed preflight한다. asset 경로는 Web 상태와 preview에 노출하지 않는다.

이 순서는 RegisteredLegacySceneCueProviderTests, LegacyPlayoutWorkflowTests, Playout의 DynamicK3dSessionTests, TornadoPlayoutEngineTests에서 검증한다. 실제 COM 형식과 vendor 구현은 계속 IPlayoutEngine 뒤에 있다.

PageN과 NEXT 동등성

페이지 대상은 s5074(5), s5077(6), s5088(12)이다. 일반 시장과 NXT 시장이 같은 계산기를 사용하며 page index는 0부터 시작한다.

  • pageCount = min(20, ceil(itemCount / pageSize))다.
  • 경계값 0, 1, size-1, size, size+1, 20*size, 20*size+1을 테스트한다.
  • 마지막 부분 페이지는 남은 행만 채우고 나머지 object를 clear/hide한다.
  • s5088의 NXT 인덱스는 비교와 조회 모두 i + pageIndex * 12를 사용한다.
  • 현재 항목에 다음 page가 있으면 operator Page NEXT는 playlist index를 유지하되 원본 Next_Scene(0)처럼 다음 page 데이터를 조회하고 새 scene을 LoadScene → transaction mutation → QueryVariablesEndTransactionPrepare(10)Play(10)한다. 이 경로는 GetPlayingScene in-place refresh가 아니다.
  • 마지막 page면 다음 활성 playlist 항목으로 이동한다. 비활성 항목은 원본처럼 앞으로 건너뛰며 끝에서 wrap하지 않는다.
  • 모든 operator command는 기존 refresh timer를 먼저 멈춘다. TAKE IN과 playlist NEXT 성공 뒤에는 해당 cut의 원본 m_time으로 첫 timer를 시작하고, 첫 성공 뒤부터 3초 간격으로 갱신한다. Page NEXT 성공 뒤에는 timer를 다시 시작하지 않는다.
  • timer refresh는 current entry/page를 fresh DB DTO로 다시 만든 뒤, 원본 timer1_Tick의 K3D 호출 순서인 Play(10)GetPlayingScene(10) → transaction mutation → QueryVariablesEndTransactionPrepare(10)Play(10)으로 on-air scene을 갱신한다.

WebView 동등성 및 안전 상태

  • Web catalog는 35개 builder와 도달 가능한 45개 active cut alias를 모두 보존하며 s8086은 선택 불가 진단 항목으로 유지한다.
  • 각 playlist row는 원본 active flag에 대응하는 enabled를 제공한다. PREPARE 성공 시 전체 playlist와 선택 index를 immutable native snapshot으로 고정한다. pending command 또는 OutcomeUnknown/timeout quarantine 중에도 snapshot 편집을 잠그며, 그 상태가 해제될 때까지 Web 편집값으로 NEXT 대상을 바꾸지 않는다.
  • native 결과가 authoritative source이며 currentEntryId, builderKey, pageSize, currentPageItemCount, isLastPage, nextKind와 bounded mutation preview를 표시한다.
  • preview는 object별 typed 값/상태를 보여주되 image, texture, video와 공통 background의 실제 asset path는 항상 configured 같은 비밀 없는 상태로 치환한다.
  • refresh의 active/next/last-success/fault 상태를 표시한다. refresh DB·scene·COM 실패는 fault latch를 세워 TAKE OUT 외의 mutation 명령을 막고 자동 반복하지 않는다. 성공한 TAKE OUT 뒤 native refresh state가 reset되면 전용 refresh fault marker만 지우며 OutcomeUnknown이나 timeout quarantine은 함께 지우지 않는다.
  • native 응답 상관관계가 Web 제한 시간 안에 끝나지 않으면 WEB_TIMEOUT을 native에 보고한다. ParseTimeoutQuarantine이 검증한 요청은 MainWindow의 process-lifetime latch를 먼저 세운 뒤 vendor session을 quarantine하므로 WebView reload로 해제되지 않는다. 늦은 응답이나 UI 재시도로 같은 명령을 다시 보내지 않으며 authoritative native/PGM 상태를 사람이 확인한다.

Callback과 scene 수명

  • OnScenePlayed가 성공한 뒤 이전 scene을 retired queue로 옮겨 안전하게 unload한다.
  • OnCutOut은 해당 layout의 on-air 참조를, OnStopAll은 player의 모든 on-air 참조를 정리할 근거다.
  • 이전 connection generation의 늦은 callback은 현재 state를 바꾸지 않는다.
  • pending Play callback이 있으면 TAKE OUT을 제외한 PREPARE/TAKE IN/NEXT/timer refresh를 fail-closed 차단한다. 어떤 lifecycle callback이든 pending이면 Disconnect와 session recycle을 하지 않고 abandon/quarantine 및 OutcomeUnknown으로 보수적으로 전환한다.
  • StopAll/CutOut은 SDK dispatch 전에 각 pending completion counter를 올리고 동기 호출 실패 시 되돌린다. 성공 callback은 대응 counter를 정확히 하나 줄이며, 성공한 stop/cut은 중단된 Play가 뒤늦게 OnScenePlayed를 보내지 않을 수 있으므로 해당 pending Play accounting을 취소한다. dispatch 뒤 cancellation/timeout은 결과 불명확으로 취급한다.
  • 장기 실행 시 retired scene은 callback으로 안전성이 확인된 뒤 unload/release한다.

운영·장애 복구·승인 절차는 PLAYOUT_OPERATIONS.md를 따른다.

남은 완료 조건

다음 항목이 끝나기 전에는 이 문서의 전체 상태를 동등성 완료로 바꾸지 않는다.

  1. 승인된 외부 asset root에 s5006Video\큐브배경.vrv가 제공돼야 한다.
  2. 설치된 Release x64 MSIX의 WebView workflow로 승인된 테스트 scene에 대해 PREPARE → fresh TAKE IN → Page NEXT/playlist NEXT → timer refresh → TAKE OUT을 실행해야 한다.
  3. 같은 회차의 Tornado2 Network Monitoring 명령/응답과 PGM 데이터·페이지·종료 화면을 함께 보존하고 비교해야 한다.
  4. timeout, OutcomeUnknown, refresh fault, callback/연결 장애 복구 절차를 실제 검증 결과에 적용하고 운영자가 판정해야 한다.

실제 DB/CP949 통합 검증과 자동 suite는 완료됐지만, 위 실제 Tornado2 검증은 여전히 회차 승인 전이며 실행하지 않았다.