docs(banner): 언어 필터 계약과 검증 결과를 기록한다
This commit is contained in:
@@ -4,9 +4,9 @@
|
||||
|
||||
| 항목 | 내용 |
|
||||
|---|---|
|
||||
| 문서 상태 | 구현 기준 확정 |
|
||||
| 문서 상태 | Phase 3 메인 탭 후속 언어 필터 구현·전체 검증·독립 리뷰 완료, 미배포 |
|
||||
| 작성일 | 2026-08-19 |
|
||||
| 최종 수정일 | 2026-08-20 |
|
||||
| 최종 수정일 | 2026-11-03 |
|
||||
| 대상 제품 | 관리자 이벤트 배너, 앱 이벤트 목록·팝업 |
|
||||
| 작성자·결정권자 | 사용자 |
|
||||
| 관련 API Contract | 별도 문서 없음. 이 문서 8절을 기준으로 사용 |
|
||||
@@ -38,7 +38,7 @@
|
||||
|
||||
- 이벤트 수정 API에서 `lang`을 변경하지 않는다.
|
||||
- `EventController.createEvent`의 `POST /event` 요청 계약을 변경하지 않는다.
|
||||
- 콘텐츠 메인 탭 6곳이 `EventService.getEventList(isAdult)`로 조립하는 `eventBannerList`에 언어 필터를 적용하지 않는다.
|
||||
- [2026-11-02 정정, DEC-009] 콘텐츠 메인 탭 6곳의 `eventBannerList`는 Phase 2 당시 언어 필터 제외 결정의 범위였으나, 이번 후속 요구로 각 호출에 기존 접속 국가 판정에 따른 언어 필터를 적용한다. 과거 구현·검증 기록은 당시 범위로 보존한다.
|
||||
- `Lang`에 새 enum을 추가하거나 `EN`을 노출할 접속 국가 정책을 추가하지 않는다.
|
||||
- `Accept-Language`를 이벤트 언어 판정에 사용하지 않는다.
|
||||
- 요청 언어의 이벤트가 없을 때 다른 언어로 fallback하지 않는다.
|
||||
@@ -92,9 +92,10 @@
|
||||
| `EVENT-LANG-004` | 확정 | `GET /event`는 판정 국가가 JP이면 JA, 그 외에는 KO 이벤트만 반환한다. | 서로 다른 언어의 활성 이벤트가 함께 있어도 판정 언어만 `eventList`에 있다. | `P2-T1` |
|
||||
| `EVENT-LANG-005` | 확정 | `GET /event/popup`은 판정 국가가 JP이면 JA, 그 외에는 KO 팝업만 반환한다. | 다른 언어 팝업의 ID가 더 최신이어도 언어 필터 후 선택된 팝업을 반환한다. | `P2-T1` |
|
||||
| `EVENT-LANG-006` | 확정 | 로그인 회원은 기존 강제 KR/JP 매핑을 포함한 국가 판정을 사용한다. | 강제 JP 회원은 비JP 헤더에서도 JA, 강제 KR 회원은 JP 헤더에서도 KO를 선택한다. | `P2-T1` |
|
||||
| `EVENT-LANG-007` | 확정 | 콘텐츠 메인 탭의 기존 `eventBannerList`는 언어 필터 없이 조회한다. | `getEventList(isAdult)` 경로가 `lang = null`을 유지하고 KO/JA/EN 모두를 조회할 수 있다. | `P2-T2` |
|
||||
| `EVENT-LANG-007` | 과거 요구, `DEC-009`에서 정정 | Phase 2 당시 콘텐츠 메인 탭 `eventBannerList`는 언어 필터 없이 조회하도록 확정했다. 이 요구는 `EVENT-LANG-010`으로 대체됐으며 현재 적용하지 않는다. | P2 당시 `lang = null`의 전체 언어 조회를 검증한 완료 증거는 역사적 기록으로 보존한다. | `P2-T2` (당시), `P3-T1` (대체) |
|
||||
| `EVENT-LANG-008` | 확정 | 기존 이벤트와 레거시 등록 경로의 언어는 KO다. | 기존 row를 KO로 backfill하고 `NOT NULL DEFAULT 'KO'`를 적용하며 `POST /event`에 `lang`을 추가하지 않는다. | `P1-T1` |
|
||||
| `EVENT-LANG-009` | 확정 | 앱 언어 필터는 DB 조회 조건으로 적용한다. | QueryDSL `where` 내 `event.lang.eq(lang)`이 정렬·`fetchFirst()` 전에 적용된다. | `P2-T1` |
|
||||
| `EVENT-LANG-010` | 확정, 2026-11-02 후속 | 콘텐츠 메인 탭 6곳의 `eventBannerList`도 접속 국가별 이벤트 언어를 조회한다. | 기존 `resolveCountryCode(member)` 결과가 JP이면 JA, 그 외에는 KO만 반환하며 각 호출부의 기존 `isAdult` 계산과 응답 계약은 유지한다. | `P3-T1`, `P3-GATE` |
|
||||
|
||||
## 8. API 계약
|
||||
|
||||
@@ -155,7 +156,8 @@
|
||||
- [x] 판정 국가 JP에서 `GET /event`, `GET /event/popup`이 JA만 반환한다. (`EVENT-LANG-004~006`)
|
||||
- [x] JP 이외와 국가 누락에서 두 API가 KO만 반환한다. (`EVENT-LANG-004`, `EVENT-LANG-005`)
|
||||
- [x] 다른 언어의 최신 팝업이 있어도 언어 필터 후 선택된 팝업이 반환된다. (`EVENT-LANG-005`, `EVENT-LANG-009`)
|
||||
- [x] 콘텐츠 메인 탭 6곳의 기존 `eventBannerList`는 언어 필터 없이 조회된다. (`EVENT-LANG-007`)
|
||||
- [x] Phase 2 당시 콘텐츠 메인 탭 6곳의 `eventBannerList`가 언어 필터 없이 조회됨을 검증했다. 이는 당시 요구에 대한 완료 이력이다. (`EVENT-LANG-007`)
|
||||
- [x] 후속 요구: 콘텐츠 메인 탭 6곳의 `eventBannerList`가 JP→JA, 그 외→KO만 조회하며 기존 `isAdult` 계산을 유지한다. (`EVENT-LANG-010`, `P3-T1`, `P3-GATE`; 2026-11-03 전체 2,928개 및 실제 HTTP 검증 완료)
|
||||
- [x] 기존 성인·활성·게시 기간·정렬·URL·응답 스키마 정책이 유지된다.
|
||||
|
||||
### 11.1 구현 완료 검증 — 2026-08-20
|
||||
@@ -180,6 +182,7 @@
|
||||
| `EVENT-LANG-001~003`, `EVENT-LANG-008` | 1 | `P1-T1`, `P1-T2`, `P1-GATE` | 엔티티·관리자 controller/service/repository 통합 테스트 |
|
||||
| `EVENT-LANG-004~006`, `EVENT-LANG-009` | 2 | `P2-T1`, `P2-GATE` | `EventServiceTest`, `EventRepositoryTest`, `EventControllerIntegrationTest` |
|
||||
| `EVENT-LANG-007` | 2 | `P2-T2`, `P2-GATE` | 언어 없는 기존 서비스 호출과 Repository null 조건 비회귀 테스트 |
|
||||
| `EVENT-LANG-010` | 3 | `P3-T1`, `P3-GATE` | 여섯 호출부의 국가별 language filter, adult 조건 비회귀, 실제 HTTP 테스트 |
|
||||
|
||||
## 14. Decision Log
|
||||
|
||||
@@ -193,6 +196,7 @@
|
||||
| 2026-08-19 | `DEC-006` | 확정 | 기존 이벤트는 KO로 backfill하고 `NOT NULL DEFAULT 'KO'`를 적용한다. | 사용자 인터뷰 A, 기존 배너 DDL 패턴 | `EVENT-LANG-008`, `P1-T1` |
|
||||
| 2026-08-19 | `DEC-007` | 확정 | 언어 입력은 `AdminEventBannerController`에만 추가하고 레거시 `POST /event`는 KO 기본값을 사용한다. | 사용자 인터뷰 A | `EVENT-LANG-002`, `EVENT-LANG-008`, `P1-T1~T2` |
|
||||
| 2026-08-20 | `DEC-008` | 확정 | `GET /event`의 익명 접근은 유지하고 `GET /event/popup`은 기준 HEAD의 인증 필수 정책을 유지한다. | 구현 리뷰에서 언어 필터와 무관한 익명 공개 확장을 확인 | `EVENT-LANG-005`, `P2-R1` |
|
||||
| 2026-11-02 | `DEC-009` | 정정 | 기존 콘텐츠 메인 탭 6곳의 언어 미필터 요구를 대체한다. 각 `eventBannerList` 호출은 기존 회원 국가 판정 `resolveCountryCode(member)`를 사용해 JP→JA, 그 외→KO로 필터링한다. 기존 `isAdult` 계산, 응답 계약 및 과거 구현 기록은 보존한다. | 승인된 최소 후속 언어 수정 | `EVENT-LANG-007`의 과거 범위, `EVENT-LANG-010`, `P3-T1` |
|
||||
|
||||
## 15. 변경 관리
|
||||
|
||||
@@ -202,3 +206,10 @@
|
||||
2. 관련 요구사항·수용 기준·API 계약을 갱신한다.
|
||||
3. `plan-task.md`의 범위·Files·Interfaces·체크박스를 코드 변경 전에 먼저 갱신한다.
|
||||
4. 기존 Progress·검증 기록을 삭제하거나 덮어쓰지 않는다.
|
||||
|
||||
## 16. 후속 요구사항: 메인 탭 이벤트 언어 — 2026-11-02
|
||||
|
||||
- 승인된 변경은 콘텐츠 메인 탭의 기존 `eventBannerList`를 조립하는 6개 호출부에만 적용한다. 접속 국가 판정은 기존 `MemberContentPreferenceService.resolveCountryCode(member)`를 재사용해 `JP`는 `Lang.JA`, 그 외는 `Lang.KO`로 변환한다.
|
||||
- 기존 각 호출부의 `isAdult` 계산과 성인 필터 동작은 변경하지 않는다. 언어 조건은 기존 Event Repository 조회 경로에서 DB 조건으로 적용한다.
|
||||
- 이벤트 상세, 팝업/API 이외 정책, 공개 응답 DTO·URL 처리, 이벤트 연결 파싱은 변경하지 않는다. 새 dependency와 별도 resolver를 추가하지 않는다.
|
||||
- 관련 성공 기준·추적표는 `EVENT-LANG-010` 및 `P3-T1`/`P3-GATE`에 연결한다. 과거 `EVENT-LANG-007`과 완료된 P2 증거는 당시 언어 전체 조회 계약의 기록이며 현재 메인 탭 요구사항을 지배하지 않는다.
|
||||
|
||||
Reference in New Issue
Block a user