From 9987595fe2c3fa7add6af2b20b622a9509ea5917 Mon Sep 17 00:00:00 2001 From: Klaus Date: Tue, 23 Jun 2026 21:51:18 +0900 Subject: [PATCH] =?UTF-8?q?docs(audio-recommendation):=20=EC=B6=94?= =?UTF-8?q?=EC=B2=9C=20=ED=8C=A8=ED=82=A4=EC=A7=80=20=EC=9D=B4=EB=8F=99=20?= =?UTF-8?q?=EA=B8=B0=EB=A1=9D=EC=9D=84=20=EA=B0=B1=EC=8B=A0=ED=95=9C?= =?UTF-8?q?=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plan-task.md | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/docs/20260623_메인_콘텐츠_추천_탭_API/plan-task.md b/docs/20260623_메인_콘텐츠_추천_탭_API/plan-task.md index ac5abcbc..1bc93131 100644 --- a/docs/20260623_메인_콘텐츠_추천_탭_API/plan-task.md +++ b/docs/20260623_메인_콘텐츠_추천_탭_API/plan-task.md @@ -460,7 +460,7 @@ interface AudioRecommendationQueryPort { ### Phase 6: 패키지 구조 content.recommendation 이동 -- [ ] **Task 6.1: 공개 API 조립 계층 패키지 이동** +- [x] **Task 6.1: 공개 API 조립 계층 패키지 이동** - Files: - Move: `src/main/kotlin/kr/co/vividnext/sodalive/v2/api/audio/recommendation/adapter/in/web/AudioRecommendationController.kt` -> `src/main/kotlin/kr/co/vividnext/sodalive/v2/api/content/recommendation/adapter/in/web/AudioRecommendationController.kt` - Move: `src/main/kotlin/kr/co/vividnext/sodalive/v2/api/audio/recommendation/application/AudioRecommendationFacade.kt` -> `src/main/kotlin/kr/co/vividnext/sodalive/v2/api/content/recommendation/application/AudioRecommendationFacade.kt` @@ -475,7 +475,7 @@ interface AudioRecommendationQueryPort { - REFACTOR: endpoint `GET /api/v2/audio/recommendations`, response DTO class/field 이름은 공개 API 계약이므로 변경하지 않는다. - 기대 결과: 공개 API 조립 계층은 `v2.api.content.recommendation` 아래에만 존재한다. -- [ ] **Task 6.2: 도메인 조회 계층 패키지 이동** +- [x] **Task 6.2: 도메인 조회 계층 패키지 이동** - Files: - Move: `src/main/kotlin/kr/co/vividnext/sodalive/v2/audio/recommendation/application/AudioRecommendationQueryService.kt` -> `src/main/kotlin/kr/co/vividnext/sodalive/v2/content/recommendation/application/AudioRecommendationQueryService.kt` - Move: `src/main/kotlin/kr/co/vividnext/sodalive/v2/audio/recommendation/application/AudioRecommendationSnapshotRefreshService.kt` -> `src/main/kotlin/kr/co/vividnext/sodalive/v2/content/recommendation/application/AudioRecommendationSnapshotRefreshService.kt` @@ -495,7 +495,7 @@ interface AudioRecommendationQueryPort { - REFACTOR: class 이름(`AudioRecommendation*`)은 현재 API/섹션 의미가 오디오 중심이므로 유지하고, 패키지명만 콘텐츠 범주로 확장한다. - 기대 결과: 도메인 조회 계층은 `v2.content.recommendation` 아래에만 존재하고 `v2.api.*`에 의존하지 않는다. -- [ ] **Task 6.3: 패키지 잔여 참조와 문서 동기화 확인** +- [x] **Task 6.3: 패키지 잔여 참조와 문서 동기화 확인** - Files: - Verify: `docs/20260623_메인_콘텐츠_추천_탭_API/prd.md` - Verify: `docs/20260623_메인_콘텐츠_추천_탭_API/plan-task.md` @@ -507,6 +507,20 @@ interface AudioRecommendationQueryPort { - Run: `rg -n "api\\.content\\.recommendation|v2\\.content\\.recommendation|api/content/recommendation|v2/content/recommendation" docs/20260623_메인_콘텐츠_추천_탭_API src/main/kotlin src/test/kotlin` - 기대 결과: 잔여 `audio.recommendation` 패키지 참조는 과거 검증 기록을 제외하고 남지 않고, PRD/plan-task의 최종 구조가 `content.recommendation` 기준으로 일치한다. - 검증 기록: 구현 완료 시 실행 명령, 결과, 잔여 참조가 남은 경우 사유를 이 task 아래에 한국어로 누적 기록한다. + - 2026-06-23 Phase 6 구현 기록: + - 공개 API 조립 계층을 `kr.co.vividnext.sodalive.v2.api.content.recommendation` 패키지로 이동했다. endpoint `GET /api/v2/audio/recommendations`, class 이름, response DTO field 이름은 변경하지 않았다. + - 도메인 조회 계층을 `kr.co.vividnext.sodalive.v2.content.recommendation` 패키지로 이동했다. `AudioRecommendation*` class 이름과 repository/query/scheduler 동작은 변경하지 않았다. + - `rg -n "kr\.co\.vividnext\.sodalive\.v2\.(api\.)?audio\.recommendation|v2\.api\.audio\.recommendation|v2\.audio\.recommendation" src/main/kotlin src/test/kotlin`: 결과 없음. + - `rg --files src/main/kotlin src/test/kotlin | rg "/v2/(api/)?audio/recommendation/"`: 결과 없음. + - `rg -n "/api/v2/audio/recommendations" src/main/kotlin src/test/kotlin`: controller, controller test, E2E test, `SecurityConfig`에서 기존 endpoint 유지 확인. + - `./gradlew test --tests 'kr.co.vividnext.sodalive.v2.api.content.recommendation.*'`: `BUILD SUCCESSFUL`. + - `./gradlew test --tests 'kr.co.vividnext.sodalive.v2.content.recommendation.*'`: 병렬 Gradle 실행 중 XML test result 파일 쓰기 충돌로 1회 실패 후 단독 재실행해 `BUILD SUCCESSFUL`. + - 2026-06-23 Phase 6 코드 리뷰 및 검증 기록: + - `rg -n "v2\\.api\\.audio\\.recommendation|v2\\.audio\\.recommendation|api/audio/recommendation|/v2/audio/recommendation" src/main/kotlin src/test/kotlin`: endpoint 문자열을 제외하고 이전 패키지/경로 참조 없음. + - `rg -n "api\\.audio\\.recommendation|v2\\.audio\\.recommendation|api/audio/recommendation|v2/audio/recommendation" docs/20260623_메인_콘텐츠_추천_탭_API src/main/kotlin src/test/kotlin`: 문서의 Phase 1-6 과거 작업 경로/검증 기록과 endpoint 문자열만 확인됨. + - `./gradlew test --tests 'kr.co.vividnext.sodalive.v2.api.content.recommendation.*'`: `BUILD SUCCESSFUL`. + - `./gradlew test --tests 'kr.co.vividnext.sodalive.v2.content.recommendation.*'`: `BUILD SUCCESSFUL`. + - `./gradlew ktlintCheck`: 최초 sandbox 실행은 Gradle wrapper의 `~/.gradle` lock 파일 접근 권한으로 실패했고, 승인 후 재실행해 `BUILD SUCCESSFUL`. ### Phase 7: 성인 콘텐츠 조회 정책 계산 경로 통일