Files
sodalive-backend-spring-boot/docs/20261029_가로형서브배너/reviews/banner-language-review.md
T

53 lines
5.5 KiB
Markdown

# 메인 탭·서브 배너 언어 후속 리뷰
## 리뷰 정보
- 일자: 2026-11-02
- 대상: 이벤트 언어 `P3-T1/P3-GATE`, 서브 배너 `P7-T1/P7-GATE`.
- 기준: `7fce26ad` 이후 현재 `test` 브랜치 변경. 별도 worktree 없음.
- 독립 리뷰어: Oracle (`ses_e634d4707ffe00405lhcwZXMXM`). 기록 담당: Sisyphus.
- 요구사항: 이벤트 PRD `EVENT-LANG-010`, 서브 배너 PRD `SB-013/DEC-012`, 기존 API 계약.
## 판정
**명세 준수 APPROVE, 코드 품질·시나리오 커버리지 APPROVE. 확정 발견 사항 없음.**
초기 리뷰 시 전체 검증은 진행 중이므로 전체 Gate 완료 판정은 보류했다. 후속 실행 결과는 아래에 누적한다.
| 시나리오 | 확인한 근거 |
|---|---|
| S1 메인 탭 | 여섯 호출부가 기존 `isAdult`를 보존하고 `resolveCountryCode(member)`로 JP→JA/그 외→KO를 전달한다. `EventBannerLanguageIntegrationTest`가 실제 HTTP에서 정확한 ID·순서·5필드, 일반/강제 국가와 익명 홈을 검증한다. |
| S2 공개 서브 배너 | 두 facade가 member를 전달하고 repository가 언어 equality를 기존 활성·기간 조건과 결합한다. `RecommendationSubBannerIntegrationTest`가 JP/KR/US/누락/강제 국가, 빈 결과, EN 제외, 6필드 및 원문 링크를 확인한다. |
| S3 관리자 | 생성 언어 생략 KO, 수정 생략 보존, explicit null/non-text/blank/unknown의 업로드·쓰기 전 400을 검증한다. 실제 DB 불변, S3 상호작용 0, 실제 repository spy save 0을 함께 확인한다. 관리자 조회는 모든 언어·9필드다. |
| S4 인접 회귀 | focused 11개 클래스 145 tests, failures/errors/skipped 0. 기존 기간·초 정밀도·소프트 삭제·정렬·무절단 테스트 보존. 전체 suite/lint/build는 초기 리뷰 시 진행 중이었다. |
## 검토한 증거
- 신규 실제 HTTP 테스트와 기존 서브 배너 domain/persistence/admin/recommendation 및 facade 테스트의 assertion을 직접 검토했다.
- `final-focused.log`의 `BUILD SUCCESSFUL in 8m 8s`, 11개 XML의 145 tests 및 실제 HTTP 185건/DB 증거를 대조했다. 해당 임시 원본은 작업 종료 시 정리하며 핵심 결과를 이 문서와 두 계획에 보존한다.
- 신규 CREATE와 기존 테이블 migration의 guarded 컬럼 추가 → NULL만 KO backfill → NOT NULL/default 흐름을 검토했다. H2 CREATE 검증과 native MySQL 실행을 구분한다.
- LSP 도구가 없어 `lsp_diagnostics`는 미실행이며 Gradle 컴파일·lint를 대체 근거로 사용한다. LSP 통과로 표현하지 않는다.
## 운영 한계
운영 DB·native MySQL·실제 AWS·앱/관리자 UI·배포는 검증 범위 밖이다. 서버 배포 전에 스키마를 준비해야 한다. 임의 링크에 이벤트 관계나 자동 언어 검증을 추가하지 않았으므로 JA 소재 및 연결 이벤트 언어의 수동 정합성 확인이 필요하다. 이벤트 상세·성인 정책은 변경하지 않는다.
## 후속 검증
전체 검증 결과와 소유 자원 정리 증거는 실행 종료 후 누적한다. 확정 결함이 없어 회귀 수정 Goal 전환 항목은 없다.
### 2026-11-03 부모 재검증
- `./gradlew test ktlintCheck bootJar --continue --console=plain --no-daemon -Pkotlin.compiler.execution.strategy=in-process`: 전체 336 suites / 2,928 tests / failures=0 / errors=0 / skipped=0, bootJar 성공. 테스트 인자 줄바꿈 한 곳만 lint 실패해 최초 명령 exit 1 (15m 50s).
- 제품 코드 변경 없이 테스트 인자 배치만 수정한 뒤 해당 `RecommendationSubBannerIntegrationTest`와 `ktlintCheck bootJar` 재실행: exit 0, 26 tests / 실패·오류·무시 0, `BUILD SUCCESSFUL in 4m 32s`.
- 전체 XML은 재실행 전에 부모가 집계했다. 현재 보고서는 26개 재실행 결과로 갱신되어 있으며 전체 성공 기록과 구분한다. 공백 변경만 있어 전체 재실행 대신 영향받은 실제 HTTP suite를 다시 구동했다.
- 기존 Oracle 세션의 continuation 도구가 `Task not found`를 반환해 새 Oracle 세션에 공백 delta와 최종 실행 증거만 재판정하도록 전달했다. 전면 리뷰를 중복 수행하지 않는다.
- 후속 Oracle (`ses_e6323aa1afferoJ13TsZawApwR`) 판정: **APPROVE. 동작 변경 없음, 영향 HTTP 26개 및 lint/build Gate 승인, 추가 발견 사항 없음.** 전체 2,928개 집계는 XML 갱신 전 부모 기록에 의존함을 명시했다. 부모는 최종 bash 실행의 정상 반환과 `BUILD SUCCESSFUL`을 직접 확인했다.
- 최종 결론: 승인된 backend 범위의 `P3-GATE/P7-GATE` 완료. 운영 배포 성공이나 LSP 실행을 주장하지 않는다.
## 종료 증거
- 제품 커밋: `255da2b6` (메인 탭 필터·HTTP 회귀), `c4c61e36` (서브 배너 언어·SQL·테스트). 두 커밋의 ktlint hook 및 커밋 메시지 검증 통과. `git diff --exit-code -- src` 정상으로 hook 후 추가 소스 변경 없음.
- 전체 검증 runner PID `49134` 종료, `pgrep -fl 'GradleDaemon|GradleWorkerMain|redis-server'` 결과 없음. 랜덤 포트 테스트 서버는 테스트 컨텍스트 종료로 정리됐다.
- 소유 임시 경로 `/tmp/soda-banner-ulw.HDkpg4`, `/tmp/soda-banner-worker.AMcPYe`, `/tmp/soda-banner-impl.CfAkhD`, `/tmp/soda-banner-review.tIFyeb`는 소유·실경로 확인 후 삭제하고 네 경로 모두 부재를 확인했다. 임시 notepad도 삭제했다. 공유 Gradle 캐시와 저장소 build reports/JAR는 보존했다.
- worktree 생성·운영 DDL·배포·push 없음. 현재 `test` 브랜치에서 완료했다.