# 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로 작성한다.