docs(cdn): CDN URL 공통화 계획을 기록한다
This commit is contained in:
41
docs/20260619_cdn_url_공통화/plan-task.md
Normal file
41
docs/20260619_cdn_url_공통화/plan-task.md
Normal file
@@ -0,0 +1,41 @@
|
||||
# CDN URL 변환 공통화 구현 계획
|
||||
|
||||
### Phase 1: 공통 함수 동작 고정
|
||||
- [x] **Task 1.1: 공통 CDN URL 변환 테스트 작성**
|
||||
- 파일: `src/test/kotlin/kr/co/vividnext/sodalive/v2/common/domain/CdnUrlExtensionsTest.kt`
|
||||
- RED: `null`, blank, 절대 URL, 상대 path 입력의 기대 동작을 검증하는 실패 테스트를 작성하고 실패를 확인한다.
|
||||
- GREEN: `src/main/kotlin/kr/co/vividnext/sodalive/v2/common/domain/CdnUrlExtensions.kt`에 최소 구현을 추가하고 통과를 확인한다.
|
||||
- REFACTOR: 함수명/패키지/import를 정리하고 단일 테스트를 다시 실행한다.
|
||||
- 검증 명령: `./gradlew test --tests kr.co.vividnext.sodalive.v2.common.domain.CdnUrlExtensionsTest`
|
||||
- 검증 기록:
|
||||
- RED: `./gradlew test --tests kr.co.vividnext.sodalive.v2.common.domain.CdnUrlExtensionsTest` 실행 결과,
|
||||
`Unresolved reference: toCdnUrl`로 실패해 공통 함수 미구현 상태를 확인했다.
|
||||
- GREEN: 같은 명령 재실행 결과 `BUILD SUCCESSFUL`로 통과했다.
|
||||
|
||||
### Phase 2: 서비스 중복 함수 제거
|
||||
- [x] **Task 2.1: 4개 서비스가 공통 함수를 사용하도록 변경**
|
||||
- 파일:
|
||||
- `src/main/kotlin/kr/co/vividnext/sodalive/v2/creator/channel/home/application/CreatorChannelHomeQueryService.kt`
|
||||
- `src/main/kotlin/kr/co/vividnext/sodalive/v2/creator/channel/live/application/CreatorChannelLiveQueryService.kt`
|
||||
- `src/main/kotlin/kr/co/vividnext/sodalive/v2/creator/channel/audio/application/CreatorChannelAudioQueryService.kt`
|
||||
- `src/main/kotlin/kr/co/vividnext/sodalive/v2/ranking/application/CreatorRankingQueryService.kt`
|
||||
- RED: Task 1.1 테스트로 절대 URL 유지 동작을 먼저 고정한다.
|
||||
- GREEN: private `toCdnUrl` 중복 선언을 제거하고 공통 함수를 import해 사용한다.
|
||||
- REFACTOR: 변경 파일의 불필요한 import/중복 코드를 제거하고 회귀 테스트를 실행한다.
|
||||
- 검증 명령:
|
||||
- `./gradlew test --tests kr.co.vividnext.sodalive.v2.common.domain.CdnUrlExtensionsTest`
|
||||
- `./gradlew test --tests kr.co.vividnext.sodalive.v2.ranking.application.CreatorRankingQueryServiceTest`
|
||||
- 검증 기록:
|
||||
- `rg "fun String\\?\\.toCdnUrl|toCdnUrl\\(\\)" src/main/kotlin/kr/co/vividnext/sodalive/v2 src/test/kotlin/kr/co/vividnext/sodalive/v2 -n`
|
||||
실행 결과, 공통 함수 선언 1곳만 남은 것을 확인했다.
|
||||
- `./gradlew test --tests kr.co.vividnext.sodalive.v2.ranking.application.CreatorRankingQueryServiceTest` 실행 결과
|
||||
`BUILD SUCCESSFUL`로 ranking 서비스 회귀 테스트가 통과했다.
|
||||
|
||||
## 검증 기록
|
||||
- `./gradlew ktlintCheck` 첫 실행은 private 함수 제거 후 남은 클래스 종료 전 빈 줄로 실패했다.
|
||||
- 지적된 `CreatorChannelAudioQueryService.kt`, `CreatorChannelLiveQueryService.kt`의 빈 줄만 제거한 뒤
|
||||
`./gradlew ktlintCheck`를 재실행했고 `BUILD SUCCESSFUL`로 통과했다.
|
||||
- 문서 변경 규칙 확인을 위해 `./gradlew tasks --all`을 실행했고 `BUILD SUCCESSFUL`로 통과했다.
|
||||
- 최종 관련 테스트로
|
||||
`./gradlew test --tests kr.co.vividnext.sodalive.v2.common.domain.CdnUrlExtensionsTest --tests kr.co.vividnext.sodalive.v2.ranking.application.CreatorRankingQueryServiceTest`
|
||||
를 실행했고 `BUILD SUCCESSFUL`로 통과했다.
|
||||
36
docs/20260619_cdn_url_공통화/prd.md
Normal file
36
docs/20260619_cdn_url_공통화/prd.md
Normal file
@@ -0,0 +1,36 @@
|
||||
# PRD: CDN URL 변환 공통화
|
||||
|
||||
## 1. Overview
|
||||
v2 서비스에서 중복 선언된 `String?.toCdnUrl()` 확장 함수를 공통 유틸로 분리한다.
|
||||
|
||||
## 2. Problem
|
||||
- `CreatorChannelHomeQueryService`, `CreatorChannelLiveQueryService`, `CreatorChannelAudioQueryService`,
|
||||
`CreatorRankingQueryService`에 유사한 CDN URL 변환 로직이 private 함수로 중복되어 있다.
|
||||
- ranking 구현은 절대 URL을 그대로 유지하지 않아 다른 3곳과 동작이 다르다.
|
||||
|
||||
## 3. Goals
|
||||
- 4개 서비스가 하나의 공통 `toCdnUrl` 함수를 사용한다.
|
||||
- `null` 또는 blank 입력은 `null`을 반환한다.
|
||||
- `http://`, `https://` 절대 URL은 그대로 반환한다.
|
||||
- 상대 path는 `cloudFrontHost/path` 형식으로 반환한다.
|
||||
|
||||
## 4. Non-Goals
|
||||
- QueryDSL 조회 로직이나 공개 API 스키마는 변경하지 않는다.
|
||||
- 기존 CDN host 설정 방식은 변경하지 않는다.
|
||||
- 다른 레거시 CDN URL 조합 코드는 이번 범위에서 정리하지 않는다.
|
||||
|
||||
## 5. Core Features
|
||||
|
||||
### Feature A: 공통 CDN URL 변환
|
||||
#### Requirements
|
||||
- `kr.co.vividnext.sodalive.v2` 하위 공통 패키지에 재사용 가능한 함수를 둔다.
|
||||
- 기존 서비스 매핑 흐름은 유지하고 private 중복 함수만 제거한다.
|
||||
|
||||
#### Edge Cases
|
||||
- `null`, `""`, `" "` 입력은 `null`이어야 한다.
|
||||
- `https://...`, `http://...` 입력은 host를 덧붙이지 않아야 한다.
|
||||
- `"profile/a.png"` 입력은 `"https://cdn.test/profile/a.png"`가 되어야 한다.
|
||||
|
||||
## 6. Technical Constraints
|
||||
- Kotlin 확장 함수로 구현한다.
|
||||
- 테스트는 JUnit 5로 작성한다.
|
||||
Reference in New Issue
Block a user