중간저장 04.20
This commit is contained in:
@@ -1,112 +1,114 @@
|
||||
# 2026-04-15 통합 작업 메모
|
||||
|
||||
이 문서는 2026-04-15에 시작한 연동 점검 메모를 2026-04-18 기준으로 현행화한 기록이다.
|
||||
|
||||
## 0. 작업 요약
|
||||
|
||||
- SBS 선거 API를 기준으로 `광역단체장(3)`, `기초단체장(4)`, `교육감(11)` 실연동을 정리했다.
|
||||
- SBS 선거 API 기준 실연동 범위를 `광역단체장(3)`, `기초단체장(4)`, `교육감(11)`으로 정리했다.
|
||||
- 선거 종류 변경 시 실제 SBS `선거구` 코드 기준으로 지역 목록과 요청 코드가 맞물리도록 보정했다.
|
||||
- `기초단체장` 지역 옵션 교체 중 발생하던 `ArgumentNullException (key)`를 ViewModel 방어 로직으로 수정했다.
|
||||
- 콤보박스 변경 후 값이 그대로 남아 있던 문제를 선택 변경 즉시 재조회 흐름으로 바꿨다.
|
||||
- `System.Text.Json.JsonException`은 region API 응답이 최상위 배열(`[...]`)인 경우를 허용하도록 수정했다.
|
||||
- 미지원 조합에서는 이전 값이 계속 보이지 않도록 상태 문구와 보드 표시 규칙을 보정했다.
|
||||
- `기초단체장` 지역 옵션 교체 중 발생하던 `ArgumentNullException (key)` 및 `ObservableCollection during CollectionChanged` 계열 UI 전환 이슈를 방어 로직으로 정리했다.
|
||||
- `교육감`, `기초단체장` 사전 방송용 데이터 공백은 저장형 사전데이터(JSON)로 보완했다.
|
||||
- 사전데이터는 `사전데이터` 페이지에서 조회/수정/저장 가능하게 만들었다.
|
||||
- `사전_역대당선자*` 계열은 표기 정당과 색상 포맷 정당을 분리해 저장할 수 있게 했다.
|
||||
- 직함 표기는 광역단체장만이 아니라 `광역단체장`, `교육감`, `기초단체장` 전 컷으로 확대했다.
|
||||
- 컷 카탈로그는 실제 `.tscn` 이름 기준으로 정리했고, 과거 별칭은 호환용 alias로만 유지한다.
|
||||
- 컷 썸네일은 `Assets/Thumbnail`에 저장하고, 제어 패널과 컷리스트에서 프리뷰를 표시하도록 정리했다.
|
||||
|
||||
## 1. 선거종류(Sunger Types)별 점검 결과
|
||||
## 1. 선거 종류별 연동 결과
|
||||
|
||||
### `3` 시도지사 / 광역단체장
|
||||
### `3` 광역단체장
|
||||
|
||||
- 선거구 목록: `sungerInfo/region?type=선거구&sungerType=3`
|
||||
- 개표 요청: `gaepyo/3/sungergus?ids=<선거구 id>`
|
||||
- 사전 투표율 요청: `tupyo/3/sidos?ids=<시도 id>`
|
||||
- 부산 기준 확인:
|
||||
- 개표 코드: `3260000`
|
||||
- 사전 코드: `26`
|
||||
- 결론:
|
||||
- 개표 연동 정상
|
||||
- 사전 투표율 연동 정상
|
||||
|
||||
### `4` 시군구장 / 기초단체장
|
||||
### `4` 기초단체장
|
||||
|
||||
- 선거구 목록: `sungerInfo/region?type=선거구&sungerType=4`
|
||||
- 개표 요청: `gaepyo/4/sungergus?ids=<선거구 id>`
|
||||
- 부산 해운대구 기준 확인:
|
||||
- 개표 코드: `4260900`
|
||||
- 결론:
|
||||
- 개표 연동 정상
|
||||
- 사전 투표율은 SBS API가 `400` 반환으로 미지원
|
||||
- SBS API 사전 투표율은 미지원
|
||||
- 사전 방송용 역사 데이터는 저장형 사전데이터에서 제공
|
||||
|
||||
### `11` 교육감
|
||||
|
||||
- 선거구 목록: `sungerInfo/region?type=선거구&sungerType=11`
|
||||
- 개표 요청: `gaepyo/11/sungergus?ids=<선거구 id>`
|
||||
- 부산 기준 확인:
|
||||
- 개표 코드: `11260000`
|
||||
- 결론:
|
||||
- 개표 연동 정상
|
||||
- 사전 투표율은 SBS API가 `400` 반환으로 미지원
|
||||
- SBS API 사전 투표율은 미지원
|
||||
- 사전 방송용 역사 데이터는 저장형 사전데이터에서 제공
|
||||
|
||||
## 2. SBS 선거 API 실연동
|
||||
|
||||
- 기준 문서: `https://documenter.getpostman.com/view/39408930/2sBXqCNNyS`
|
||||
- 기준 호스트: `http://202.31.153.141:8421/`
|
||||
- API 응답 헤더에 charset이 없어서, 본문은 UTF-8 바이트 기준으로 직접 디코딩한다.
|
||||
|
||||
### 현재 지원 범위
|
||||
|
||||
- `광역단체장`
|
||||
- 사전 투표율: 지원
|
||||
- 개표: 지원
|
||||
- `교육감`
|
||||
- 사전 투표율: 미지원
|
||||
- 개표: 지원
|
||||
- `기초단체장`
|
||||
- 사전 투표율: 미지원
|
||||
- 개표: 지원
|
||||
|
||||
### 확인된 API 제한사항
|
||||
## 2. SBS API 제한 사항
|
||||
|
||||
- `tupyo/4/...` 계열은 현재 `기초단체장`에 대해 `400`을 반환한다.
|
||||
- `tupyo/11/...` 계열은 현재 `교육감`에 대해 `400`을 반환한다.
|
||||
- 위 두 경우는 앱 오류가 아니라 API 제공 범위 밖으로 본다.
|
||||
- 실제 운영에서는 저장형 사전데이터로 공백을 메운다.
|
||||
|
||||
## 3. 기초단체장 지역 선택 규칙
|
||||
## 3. 저장형 사전데이터 운영
|
||||
|
||||
- 기초단체장 목록은 `시도 + 시군구/기초단체장명` 결합 문자열로 표시한다.
|
||||
- 예: `부산광역시 해운대구`
|
||||
- 실제 개표 요청은 SBS API의 `선거구 id`를 사용한다.
|
||||
- 예: `부산광역시 해운대구 -> 4260900`
|
||||
- 데이터 탭의 `지역 코드`는 현재 선택된 요청 코드(시도 코드 또는 선거구 코드)를 표시한다.
|
||||
- 기초단체장 선택 목록은 API `sungerInfo/region?type=선거구&sungerType=4` 기준으로 구성한다.
|
||||
- 저장 위치: `Tornado3_2026Election/Assets/Data/pre_election_history.json`
|
||||
- 2026-04-18 기준 저장 건수:
|
||||
- `광역단체장` 17건
|
||||
- `교육감` 17건
|
||||
- `기초단체장` 262건
|
||||
- 페이지 기능:
|
||||
- 선거 종류/지역 선택
|
||||
- 역대 투표율 카드
|
||||
- 역대 당선자 카드
|
||||
- 엑셀형 편집
|
||||
- 저장
|
||||
- `사전_역대당선자`, `사전_역대당선자_교육감`, `사전_역대당선자_기초단체장`은 `ColorParty`를 저장할 수 있다.
|
||||
|
||||
## 4. 데이터 탭 표시 기준
|
||||
|
||||
- 데이터 탭에는 기존 `선거구명`, `지역 코드` 외에 다음 정보를 함께 표시한다.
|
||||
- `시도명`
|
||||
- `송출 선거구명`
|
||||
- 데이터 탭은 원본 JSON 전문을 그대로 보여주는 용도는 아니다.
|
||||
- API 응답을 ViewModel용 값으로 정규화한 뒤 표시한다.
|
||||
- `DistrictName`은 선택/저장용 원본 문자열로 유지한다.
|
||||
- 송출용 분리 값은 별도 필드로 관리한다.
|
||||
- `RegionName`
|
||||
- `ElectionDistrictName`
|
||||
- Karisma/Tornado3 송출 변수 `시도명NN`, `선거구명NN`은 위 분리 값을 직접 사용한다.
|
||||
|
||||
## 5. Null-Key 예외 원인과 처리
|
||||
|
||||
- 원인:
|
||||
- `기초단체장`으로 전환하면서 `DistrictOptions`를 교체하는 순간,
|
||||
`ComboBox.SelectedValue`가 일시적으로 `null`을 보낼 수 있었다.
|
||||
- 이 값이 그대로 `Dictionary.TryGetValue(null, ...)` 경로로 들어가며
|
||||
`System.ArgumentNullException (Parameter 'key')`가 발생했다.
|
||||
|
||||
### 적용한 방어 규칙
|
||||
## 4. 지역 선택 / 전환 안정화
|
||||
|
||||
- `DistrictName`, `DistrictCode`, `ElectionType`는 내부적으로 null이 아닌 문자열 상태를 유지한다.
|
||||
- 지역 옵션 교체 중에는 `_isUpdatingDistrictOptions` 플래그로 transient UI 값을 무시한다.
|
||||
- 옵션 교체 전의 `preferredName`, `preferredCode`를 캡처해 마지막 유효 선택값 기준으로 복원한다.
|
||||
- 사전데이터용 지역 콤보박스도 별도 `_isUpdatingPreElectionHistoryDistrictOptions` 플래그로 같은 문제를 피한다.
|
||||
- 선택 변경 뒤에는 debounce 후 자동 재조회한다.
|
||||
|
||||
## 6. 변수 매핑 관련 기록
|
||||
## 5. 직함 표기 확대
|
||||
|
||||
- Karisma 장면 변수 지원 범위 로깅을 추가했다.
|
||||
- 현재 컷에 없는 변수명은 경고로 확인 가능하다.
|
||||
- 현재 직함 표기는 `광역단체장`, `교육감`, `기초단체장` 전부에 적용한다.
|
||||
- 적용 대상 변수:
|
||||
- `선거구명`
|
||||
- `시도명`
|
||||
- `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/<template.Id>.png`
|
||||
- 제어 패널의 컷 선택 콤보박스에서 프리뷰 표시
|
||||
- `컷리스트` 페이지에서 전체 현황 확인
|
||||
- `썸네일 생성` 기능은 Karisma에 씬을 로드해 320x180 PNG로 저장
|
||||
|
||||
## 8. 변수 매핑 관련 기록
|
||||
|
||||
- Karisma 장면 변수 지원 범위 로깅을 유지한다.
|
||||
- 다음 alias 매핑을 보강했다.
|
||||
- `기준시`, `기준시01`, `기준시02`
|
||||
- `유권자수`, `유권자수01`
|
||||
@@ -114,64 +116,25 @@
|
||||
- `득표수바NN`
|
||||
- `정당원NN`
|
||||
- `정당색NN`
|
||||
|
||||
### 아직 주의가 필요한 변수군
|
||||
|
||||
- 의석수 계열
|
||||
- 판세 지도/그래프 계열
|
||||
- 경력/공약 계열
|
||||
- 일부 사진/차트 전용 컷 변수
|
||||
|
||||
## 7. 콤보박스 변경 즉시 갱신
|
||||
|
||||
- `선거 종류`, `선거구명`, `지역 코드`, `방송 단계`가 바뀌면 짧은 debounce 후 자동으로 `RefreshAsync(...)`를 다시 호출한다.
|
||||
- 지역 옵션 재구성 중(`_isUpdatingDistrictOptions`)이나 API 결과 반영 중(`_isApplyingRefreshResult`)에는
|
||||
내부 setter 연쇄로 인한 재조회는 막는다.
|
||||
- 이 변경으로 콤보박스만 바뀌고 `후보현황`, `정보값`이 이전 조회 결과에 머물러 있던 문제를 줄인다.
|
||||
|
||||
## 8. JSON 응답 파싱 보정
|
||||
|
||||
- `sungerInfo/region...` 계열은 `{ value: [...] }`가 아니라 최상위 배열(`[...]`)로 오는 경우가 있다.
|
||||
- 클라이언트는 이제 `value` envelope와 최상위 배열을 모두 허용한다.
|
||||
- 광역단체장/교육감/기초단체장 지역 옵션도 SBS `선거구` 목록 기준으로 읽어서 실제 요청 코드와 맞춘다.
|
||||
- 선택 변경 debounce는 `CancellationTokenSource` 취소 대신 revision 비교로 바꿔
|
||||
디버그 출력에 반복 `TaskCanceledException`이 쌓이는 흐름을 줄였다.
|
||||
- 선거 종류 전환/상태 복원 도중 비동기 선거구 목록 갱신이 늦게 끝나더라도,
|
||||
마지막 현재 선택값 기준으로 다시 매칭하도록 보정했다.
|
||||
- 미지원 단계나 API 오류가 나면 `StatusText`에 마지막 경고 메시지를 남겨
|
||||
화면에서 이유를 바로 확인할 수 있게 했다.
|
||||
- 데이터 탭 상단에 `StatusText`를 노출해 마지막 갱신 상태/미지원 사유를 바로 볼 수 있게 했다.
|
||||
- 미지원 조합에서는 투표율/후보 보드를 숨기고 상태 문구만 보이도록 해
|
||||
이전 수신값을 현재 데이터로 오해하는 흐름을 줄였다.
|
||||
- 역사 당선자 컷은 저장형 사전데이터의 `ColorParty`와 정당 별칭 정규화를 함께 사용한다.
|
||||
|
||||
## 9. 주요 변경 파일
|
||||
|
||||
- `Tornado3_2026Election/Services/SbsElectionApiClient.cs`
|
||||
- SBS API 요청/응답 처리
|
||||
- 선거 종류별 지역 옵션 구성
|
||||
- JSON 파싱 보정
|
||||
- `Tornado3_2026Election/ViewModels/DataViewModel.cs`
|
||||
- null-safe 지역 선택 처리
|
||||
- 선택 변경 즉시 갱신
|
||||
- 상태 문구 및 미지원 조합 표시
|
||||
- `Tornado3_2026Election/MainWindow.xaml`
|
||||
- 데이터 탭에 `시도명`, `송출 선거구명`, `StatusText` 표시
|
||||
- `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`
|
||||
- `RegionName`, `ElectionDistrictName` 기반 송출 변수 매핑
|
||||
- `Tornado3_2026Election/Domain/ElectionDataSnapshot.cs`
|
||||
- 송출용 분리 지역 필드 추가
|
||||
- `Tornado3_2026Election/Persistence/AppState.cs`
|
||||
- 실제 연동 기준 기본값 정리
|
||||
|
||||
## 10. 현재 상태 및 남은 체크포인트
|
||||
## 10. 현재 체크 결과
|
||||
|
||||
- `dotnet build Tornado3_2026Election.slnx` 통과
|
||||
- `dotnet build .\\Tornado3_2026Election\\Tornado3_2026Election.csproj` 통과
|
||||
- 기존 경고는 유지
|
||||
- `WindowsBase` 참조 충돌 경고
|
||||
- `WindowsBase` 참조 충돌
|
||||
- MSIX 인증서 경고
|
||||
- `MockTornado3Adapter.ConnectionChanged` 미사용 경고
|
||||
- 코드상 연동/파싱/표시 흐름은 정리 완료
|
||||
- 남은 실운영 체크:
|
||||
- 앱 실행 상태에서 `광역단체장 -> 교육감 -> 기초단체장` 전환 확인
|
||||
- `개표 <-> 사전` 전환 시 상태 문구와 보드 표시 확인
|
||||
- 실제 송출 컷에서 `시도명NN`, `선거구명NN` 반영 확인
|
||||
- 컷 카탈로그 감사 결과 실제 씬 누락 `0건`
|
||||
|
||||
Reference in New Issue
Block a user