# 2026-04-15 통합 작업 메모 이 문서는 2026-04-15에 시작한 연동 점검 메모를 2026-04-18 기준으로 현행화한 기록이다. ## 0. 작업 요약 - SBS 선거 API 기준 실연동 범위를 `광역단체장(3)`, `기초단체장(4)`, `교육감(11)`으로 정리했다. - 선거 종류 변경 시 실제 SBS `선거구` 코드 기준으로 지역 목록과 요청 코드가 맞물리도록 보정했다. - `기초단체장` 지역 옵션 교체 중 발생하던 `ArgumentNullException (key)` 및 `ObservableCollection during CollectionChanged` 계열 UI 전환 이슈를 방어 로직으로 정리했다. - `교육감`, `기초단체장` 사전 방송용 데이터 공백은 저장형 사전데이터(JSON)로 보완했다. - 사전데이터는 `사전데이터` 페이지에서 조회/수정/저장 가능하게 만들었다. - `사전_역대당선자*` 계열은 표기 정당과 색상 포맷 정당을 분리해 저장할 수 있게 했다. - 직함 표기는 광역단체장만이 아니라 `광역단체장`, `교육감`, `기초단체장` 전 컷으로 확대했다. - 컷 카탈로그는 실제 `.tscn` 이름 기준으로 정리했고, 과거 별칭은 호환용 alias로만 유지한다. - 컷 썸네일은 `Assets/Thumbnail`에 저장하고, 제어 패널과 컷리스트에서 프리뷰를 표시하도록 정리했다. ## 1. 선거 종류별 연동 결과 ### `3` 광역단체장 - 선거구 목록: `sungerInfo/region?type=선거구&sungerType=3` - 개표 요청: `gaepyo/3/sungergus?ids=<선거구 id>` - 사전 투표율 요청: `tupyo/3/sidos?ids=<시도 id>` - 결론: - 개표 연동 정상 - 사전 투표율 연동 정상 ### `4` 기초단체장 - 선거구 목록: `sungerInfo/region?type=선거구&sungerType=4` - 개표 요청: `gaepyo/4/sungergus?ids=<선거구 id>` - 결론: - 개표 연동 정상 - SBS API 사전 투표율은 미지원 - 사전 방송용 역사 데이터는 저장형 사전데이터에서 제공 ### `11` 교육감 - 선거구 목록: `sungerInfo/region?type=선거구&sungerType=11` - 개표 요청: `gaepyo/11/sungergus?ids=<선거구 id>` - 결론: - 개표 연동 정상 - SBS API 사전 투표율은 미지원 - 사전 방송용 역사 데이터는 저장형 사전데이터에서 제공 ## 2. SBS API 제한 사항 - `tupyo/4/...` 계열은 현재 `기초단체장`에 대해 `400`을 반환한다. - `tupyo/11/...` 계열은 현재 `교육감`에 대해 `400`을 반환한다. - 위 두 경우는 앱 오류가 아니라 API 제공 범위 밖으로 본다. - 실제 운영에서는 저장형 사전데이터로 공백을 메운다. ## 3. 저장형 사전데이터 운영 - 저장 위치: `Tornado3_2026Election/Assets/Data/pre_election_history.json` - 2026-04-18 기준 저장 건수: - `광역단체장` 17건 - `교육감` 17건 - `기초단체장` 262건 - 페이지 기능: - 선거 종류/지역 선택 - 역대 투표율 카드 - 역대 당선자 카드 - 엑셀형 편집 - 저장 - `사전_역대당선자`, `사전_역대당선자_교육감`, `사전_역대당선자_기초단체장`은 `ColorParty`를 저장할 수 있다. ## 4. 지역 선택 / 전환 안정화 - `DistrictName`, `DistrictCode`, `ElectionType`는 내부적으로 null이 아닌 문자열 상태를 유지한다. - 지역 옵션 교체 중에는 `_isUpdatingDistrictOptions` 플래그로 transient UI 값을 무시한다. - 사전데이터용 지역 콤보박스도 별도 `_isUpdatingPreElectionHistoryDistrictOptions` 플래그로 같은 문제를 피한다. - 선택 변경 뒤에는 debounce 후 자동 재조회한다. ## 5. 직함 표기 확대 - 현재 직함 표기는 `광역단체장`, `교육감`, `기초단체장` 전부에 적용한다. - 적용 대상 변수: - `선거구명` - `시도명` - `RegionName` - `ElectionDistrictName` - `DistrictName` - 예: - `서울특별시` -> `서울시장` - `전라남도` -> `전라남도지사` - `부산광역시` -> `부산광역시교육감` - `창원시` -> `창원시장` ## 6. 컷 카탈로그 / 실제 씬 파일 - 현재 카탈로그는 실제 존재하는 `.tscn` 파일명 기준으로 정리했다. - 2026-04-18 기준 canonical 카탈로그: - Bottom 15컷 - Normal 63컷 - Top 11컷 - 총 89컷 - 기존에 사용되던 `_L`, `_END`, `_7680` 계열은 현재 카탈로그에서 제거했다. - 다만 저장된 큐/상태 복원을 위해 legacy format alias는 유지한다. - 전수 감사 기준 실제 씬 누락은 `0건`이다. ## 7. 썸네일 - 저장 위치: `Assets/Thumbnail/.png` - 제어 패널의 컷 선택 콤보박스에서 프리뷰 표시 - `컷리스트` 페이지에서 전체 현황 확인 - `썸네일 생성` 기능은 Karisma에 씬을 로드해 320x180 PNG로 저장 ## 8. 변수 매핑 관련 기록 - Karisma 장면 변수 지원 범위 로깅을 유지한다. - 다음 alias 매핑을 보강했다. - `기준시`, `기준시01`, `기준시02` - `유권자수`, `유권자수01` - `투표자수`, `투표자수01` - `득표수바NN` - `정당원NN` - `정당색NN` - 역사 당선자 컷은 저장형 사전데이터의 `ColorParty`와 정당 별칭 정규화를 함께 사용한다. ## 9. 주요 변경 파일 - `Tornado3_2026Election/Services/SbsElectionApiClient.cs` - `Tornado3_2026Election/ViewModels/DataViewModel.cs` - `Tornado3_2026Election/ViewModels/MainViewModel.cs` - `Tornado3_2026Election/ViewModels/ChannelScheduleViewModel.cs` - `Tornado3_2026Election/Services/PreElectionHistoryService.cs` - `Tornado3_2026Election/Services/CutThumbnailAssetCatalog.cs` - `Tornado3_2026Election/Services/KarismaThumbnailGeneratorService.cs` - `Tornado3_2026Election/Services/FormatCatalogService.cs` - `Tornado3_2026Election/Services/KarismaTornado3Adapter.cs` ## 10. 현재 체크 결과 - `dotnet build .\\Tornado3_2026Election\\Tornado3_2026Election.csproj` 통과 - 기존 경고는 유지 - `WindowsBase` 참조 충돌 - MSIX 인증서 경고 - `MockTornado3Adapter.ConnectionChanged` 미사용 경고 - 컷 카탈로그 감사 결과 실제 씬 누락 `0건`