refactor(home): 추천 데이터 계층을 정리한다

This commit is contained in:
Yu Sung
2026-06-26 22:32:36 +09:00
parent 6b5176eba7
commit 5757705b12
8 changed files with 218 additions and 143 deletions

View File

@@ -60,7 +60,7 @@
### Phase 1: 기준 스펙과 기존 구현 점검
- [ ] **Task 1.1: 문서/코드 기준점 확인**
- [x] **Task 1.1: 문서/코드 기준점 확인**
- 대상 파일:
- 확인: `docs/20260602_메인_홈_추천_UI_API_연동/prd.md`
- 확인: `SodaLive/Sources/V2/Main/Home/**`
@@ -74,7 +74,7 @@
- 실행 명령: `find SodaLive/Sources/V2/Main/Home SodaLive/Sources/V2/Component -maxdepth 4 -type f | sort`
- 기대 결과: 현재 생성된 V2 홈/공용 컴포넌트 목록을 확인할 수 있다.
- [ ] **Task 1.2: 제외 범위 점검**
- [x] **Task 1.2: 제외 범위 점검**
- 대상 파일:
- 확인: `SodaLive/Sources/V2/Main/Home/**`
- 확인: `SodaLive/Sources/V2/Component/**`
@@ -87,7 +87,7 @@
### Phase 2: 신규 API와 응답 모델
- [ ] **Task 2.1: 추천 API endpoint 확인/보완**
- [x] **Task 2.1: 추천 API endpoint 확인/보완**
- 대상 파일:
- 생성/보완: `SodaLive/Sources/V2/Main/Home/Recommendation/Repository/MainHomeRecommendationApi.swift`
- 생성/보완: `SodaLive/Sources/V2/Main/Home/Recommendation/Repository/MainHomeRecommendationRepository.swift`
@@ -103,7 +103,7 @@
- 실행 명령: `rg "/api/v2/home/recommendations|getRecommendations" SodaLive/Sources/V2/Main/Home/Recommendation/Repository SodaLive/Sources/Home`
- 기대 결과: 신규 경로는 `SodaLive/Sources/V2/Main/Home/Recommendation/Repository`에서만 검색된다.
- [ ] **Task 2.2: 신규 Response 모델 보완**
- [x] **Task 2.2: 신규 Response 모델 보완**
- 대상 파일:
- 생성/보완: `SodaLive/Sources/V2/Main/Home/Recommendation/Models/MainHomeRecommendationResponse.swift`
- 이동/정리: `SodaLive/Sources/V2/Main/Home/Models/MainHomeRecommendationResponse.swift`
@@ -119,7 +119,7 @@
### Phase 3: 활동 타입과 I18n
- [ ] **Task 3.1: RecommendedActivityType 변환 보완**
- [x] **Task 3.1: RecommendedActivityType 변환 보완**
- 대상 파일:
- 생성/보완: `SodaLive/Sources/V2/Main/Home/Recommendation/Models/RecommendedActivityType.swift`
- 이동/정리: `SodaLive/Sources/V2/Main/Home/Models/RecommendedActivityType.swift`
@@ -133,47 +133,25 @@
- 실행 명령: `rg "LIVE_REPLAY|activityLive|activityAudio|activityCommunity|ライブ|オーディオ|コミュニティ" SodaLive/Sources/V2/Main/Home/Recommendation/Models/RecommendedActivityType.swift SodaLive/Sources/I18n/I18n.swift`
- 기대 결과: enum 변환과 I18n 문구가 확인된다.
### Phase 4: MainHomeView 탭 shell과 탭별 루트 View
### Phase 4: 추천 데이터 상태 계층 정리
- [ ] **Task 4.1: MainHomeView 탭 shell 작성/보완**
- [ ] **Task 4.1: 추천 ViewModel 데이터 로딩 계층 정리**
- 대상 파일:
- 생성/보완: `SodaLive/Sources/V2/Main/Home/MainHomeView.swift`
- 확인: `SodaLive/Sources/V2/Component/HomeTitleBar.swift`
- 작업 내용:
- `MainHomeView``HomeTitleBar`, 추천/랭킹/팔로잉 상단 탭, 선택된 탭 콘텐츠 조합만 담당한다.
- 추천 탭 섹션 조립과 추천 API 호출을 `MainHomeView`에 직접 넣지 않는다.
- 하단 `MainTabBarView`는 기존 `MainView` 구조에서 유지하고 `MainHomeView` 내부에 중복 생성하지 않는다.
- 검증 기준:
- 실행 명령: `rg "struct MainHomeView|HomeTitleBar|MainHomeRecommendationView|MainHomeRankingView|MainHomeFollowingView|MainTabBarView|fetchRecommendations" SodaLive/Sources/V2/Main/Home/MainHomeView.swift SodaLive/Sources/V2/Main/MainView.swift`
- 기대 결과: `MainHomeView`는 탭별 루트 View를 조합하고, `fetchRecommendations`를 직접 호출하지 않으며, 탭바 중복 생성은 없어야 한다.
- [ ] **Task 4.2: 추천/랭킹/팔로잉 하위 폴더와 루트 View 준비**
- 대상 파일:
- 생성/보완: `SodaLive/Sources/V2/Main/Home/Recommendation/MainHomeRecommendationView.swift`
- 생성/보완: `SodaLive/Sources/V2/Main/Home/Recommendation/MainHomeRecommendationViewModel.swift`
- 생성/보완: `SodaLive/Sources/V2/Main/Home/Ranking/MainHomeRankingView.swift`
- 생성/보완: `SodaLive/Sources/V2/Main/Home/Following/MainHomeFollowingView.swift`
- 이동/정리: `SodaLive/Sources/V2/Main/Home/MainHomeViewModel.swift`
- 확인/보완: `SodaLive/Sources/V2/Main/Home/Recommendation/Repository/MainHomeRecommendationRepository.swift`
- 작업 내용:
- 추천 탭 콘텐츠 조립은 `MainHomeRecommendationView`에서 담당한다.
- 추천 API 로딩/에러/섹션 상태는 `MainHomeRecommendationViewModel`에서 담당한다.
- 랭킹/팔로잉 탭은 이번 추천 API 범위 밖이므로 placeholder 또는 최소 루트 View만 준비하고 추천 섹션 코드를 넣지 않는다.
- 기존 `MainHomeViewModel`이 추천 전용 상태만 가진다면 `MainHomeRecommendationViewModel`로 이동/이름 변경한다.
- 추천 API 응답 데이터가 섹션별 View에서 바로 사용할 수 있는 상태로 노출되는지 확인한다.
- UI 섹션 구현은 이 Phase에서 진행하지 않는다.
- 검증 기준:
- 실행 명령: `find SodaLive/Sources/V2/Main/Home -maxdepth 3 -type f | sort`
- 기대 결과: `Recommendation`, `Ranking`, `Following` 하위 폴더의 루트 View 파일이 확인된다.
- 실행 명령: `rg "final class MainHomeRecommendationViewModel|fetchRecommendations|HomeRecommendationResponse|MainHomeRecommendationRepository|isLoading|errorMessage" SodaLive/Sources/V2/Main/Home`
- 기대 결과: 추천 API 로딩/에러/응답 상태가 `MainHomeRecommendationViewModel` 중심으로 정리되어야 한다.
- [ ] **Task 4.3: MainView 홈 탭 연결**
- 대상 파일:
- 수정: `SodaLive/Sources/V2/Main/MainView.swift`
- 작업 내용:
- `.home` 분기에서 placeholder 대신 `MainHomeView()`를 표시한다.
- 다른 탭 분기와 기존 이벤트 팝업/회원 정보 초기화 흐름은 변경하지 않는다.
- 검증 기준:
- 실행 명령: `rg "case \\.home|MainHomeView|MainPlaceholderTabView" SodaLive/Sources/V2/Main/MainView.swift`
- 기대 결과: `.home``MainHomeView()`를 표시하고, 다른 탭은 기존 동작을 유지한다.
### Phase 5: 추천 상세 진입 데이터/라우팅 guard
- [ ] **Task 4.4: 추천 탭 상세 진입 guard 적용**
- [ ] **Task 5.1: 추천 탭 상세 진입 guard 적용**
- 대상 파일:
- 수정: `SodaLive/Sources/V2/Main/MainView.swift`
- 생성/보완: `SodaLive/Sources/V2/Main/Home/MainHomeView.swift`
@@ -194,9 +172,62 @@
- 기대 결과: 신규 추천 탭 상세 진입 callback이 기존 인증/민감 콘텐츠 guard 인프라를 재사용한다.
- 수동 확인: `MainHomeView`, `MainHomeRecommendationView` 내부에 Bootpay 인증 UI를 중복 구현하지 않아야 한다.
### Phase 5: 현재 라이브 섹션
### Phase 6: 홈 탭 shell과 탭별 루트 연결
- [ ] **Task 5.1: 현재 라이브 섹션 작성/보완**
- [ ] **Task 6.1: 추천/랭킹/팔로잉 하위 폴더와 루트 View 준비**
- 대상 파일:
- 생성/보완: `SodaLive/Sources/V2/Main/Home/Recommendation/MainHomeRecommendationView.swift`
- 생성/보완: `SodaLive/Sources/V2/Main/Home/Ranking/MainHomeRankingView.swift`
- 생성/보완: `SodaLive/Sources/V2/Main/Home/Following/MainHomeFollowingView.swift`
- 작업 내용:
- 추천 탭 콘텐츠 조립은 `MainHomeRecommendationView`에서 담당한다.
- 랭킹/팔로잉 탭은 이번 추천 API 범위 밖이므로 placeholder 또는 최소 루트 View만 준비하고 추천 섹션 코드를 넣지 않는다.
- 섹션별 UI 구현은 이후 섹션 UI Phase에서 진행한다.
- 검증 기준:
- 실행 명령: `find SodaLive/Sources/V2/Main/Home -maxdepth 3 -type f | sort`
- 기대 결과: `Recommendation`, `Ranking`, `Following` 하위 폴더의 루트 View 파일이 확인된다.
- [ ] **Task 6.2: MainHomeView 탭 shell 작성/보완**
- 대상 파일:
- 생성/보완: `SodaLive/Sources/V2/Main/Home/MainHomeView.swift`
- 확인: `SodaLive/Sources/V2/Component/HomeTitleBar.swift`
- 작업 내용:
- `MainHomeView``HomeTitleBar`, 추천/랭킹/팔로잉 상단 탭, 선택된 탭 콘텐츠 조합만 담당한다.
- 추천 탭 섹션 조립과 추천 API 호출을 `MainHomeView`에 직접 넣지 않는다.
- 하단 `MainTabBarView`는 기존 `MainView` 구조에서 유지하고 `MainHomeView` 내부에 중복 생성하지 않는다.
- 검증 기준:
- 실행 명령: `rg "struct MainHomeView|HomeTitleBar|MainHomeRecommendationView|MainHomeRankingView|MainHomeFollowingView|MainTabBarView|fetchRecommendations" SodaLive/Sources/V2/Main/Home/MainHomeView.swift SodaLive/Sources/V2/Main/MainView.swift`
- 기대 결과: `MainHomeView`는 탭별 루트 View를 조합하고, `fetchRecommendations`를 직접 호출하지 않으며, 탭바 중복 생성은 없어야 한다.
- [ ] **Task 6.3: MainView 홈 탭 연결**
- 대상 파일:
- 수정: `SodaLive/Sources/V2/Main/MainView.swift`
- 작업 내용:
- `.home` 분기에서 placeholder 대신 `MainHomeView()`를 표시한다.
- 다른 탭 분기와 기존 이벤트 팝업/회원 정보 초기화 흐름은 변경하지 않는다.
- 검증 기준:
- 실행 명령: `rg "case \\.home|MainHomeView|MainPlaceholderTabView" SodaLive/Sources/V2/Main/MainView.swift`
- 기대 결과: `.home``MainHomeView()`를 표시하고, 다른 탭은 기존 동작을 유지한다.
### Phase 7: 데이터 기반 프로젝트 포함과 중간 빌드 검증
- [ ] **Task 7.1: 데이터 기반 신규 Swift 파일 프로젝트 포함 여부 확인**
- 대상 파일:
- 확인/보완: `SodaLive.xcodeproj/project.pbxproj`
- 확인: `SodaLive/Sources/V2/Main/Home/**`
- 작업 내용:
- Phase 4~6에서 생성/이동한 데이터 상태, 라우팅, 탭 루트 Swift 파일이 빌드 대상에 포함되는지 확인한다.
- 파일 시스템 동기화 방식으로 자동 포함되면 프로젝트 파일을 수정하지 않는다.
- 프로젝트 파일 수정이 필요한 경우에만 최소 변경한다.
- 검증 기준:
- 실행 명령: `plutil -lint SodaLive.xcodeproj/project.pbxproj`
- 기대 결과: `OK`
- 실행 명령: `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build`
- 기대 결과: `BUILD SUCCEEDED`
### Phase 8: 현재 라이브 섹션 UI
- [ ] **Task 8.1: 현재 라이브 섹션 작성/보완**
- 대상 파일:
- 생성/보완: `SodaLive/Sources/V2/Main/Home/Recommendation/Components/MainHomeLiveSection.swift`
- 작업 내용:
@@ -207,9 +238,9 @@
- 실행 명령: `rg "MainHomeLiveSection|roomId|creatorNickname|creatorProfileImage" SodaLive/Sources/V2/Main/Home/Recommendation`
- 기대 결과: 라이브 섹션이 신규 응답 필드를 기준으로 구성된다.
### Phase 6: 배너 섹션
### Phase 9: 배너 섹션 UI
- [ ] **Task 6.1: 추천 배너 섹션 작성/보완**
- [ ] **Task 9.1: 추천 배너 섹션 작성/보완**
- 대상 파일:
- 생성/보완: `SodaLive/Sources/V2/Main/Home/Recommendation/Components/MainHomeBannerSection.swift`
- 확인/보완: `SodaLive/Sources/V2/Component/Banner/BannerCarousel.swift`
@@ -222,9 +253,9 @@
- 실행 명령: `rg "RecommendationBannerResponse|HomeBanner|BannerCarousel|MainHomeBannerSection" SodaLive/Sources/V2/Main/Home/Recommendation SodaLive/Sources/V2/Component/Banner`
- 기대 결과: 배너 응답 모델과 화면 조합이 확인된다.
### Phase 7: 최근 활동 크리에이터 섹션
### Phase 10: 최근 활동 크리에이터 섹션 UI
- [ ] **Task 7.1: 최근 활동 크리에이터 섹션 작성/보완**
- [ ] **Task 10.1: 최근 활동 크리에이터 섹션 작성/보완**
- 대상 파일:
- 생성/보완: `SodaLive/Sources/V2/Main/Home/Recommendation/Components/MainHomeActiveCreatorSection.swift`
- 작업 내용:
@@ -235,9 +266,9 @@
- 실행 명령: `rg "MainHomeActiveCreatorSection|activityType|activityAt|targetId|RecommendedActivityType" SodaLive/Sources/V2/Main/Home/Recommendation`
- 기대 결과: 최근 활동 섹션이 신규 응답 필드와 활동 타입 변환을 사용한다.
### Phase 8: 최근 데뷔한 크리에이터 섹션
### Phase 11: 최근 데뷔한 크리에이터 섹션 UI
- [ ] **Task 8.1: 최근 데뷔 크리에이터 섹션 작성/보완**
- [ ] **Task 11.1: 최근 데뷔 크리에이터 섹션 작성/보완**
- 대상 파일:
- 생성/보완: `SodaLive/Sources/V2/Main/Home/Recommendation/Components/MainHomeRecentDebutCreatorSection.swift`
- 확인/보완: `SodaLive/Sources/V2/Component/Creator/CreatorProfileGrid.swift`
@@ -250,9 +281,9 @@
- 실행 명령: `rg "MainHomeRecentDebutCreatorSection|CreatorProfileGrid|CreatorProfileItem|creatorProfileImage" SodaLive/Sources/V2/Main/Home/Recommendation SodaLive/Sources/V2/Component/Creator`
- 기대 결과: 최근 데뷔 섹션이 공용 Creator widget을 재사용한다.
### Phase 9: 처음 만나는 오디오 섹션
### Phase 12: 처음 만나는 오디오 섹션 UI
- [ ] **Task 9.1: AudioContentCardView 조건부 태그 보완**
- [ ] **Task 12.1: AudioContentCardView 조건부 태그 보완**
- 대상 파일:
- 확인/보완: `SodaLive/Sources/V2/Component/AudioContentCard.swift`
- 생성/보완: `SodaLive/Sources/V2/Main/Home/Recommendation/Components/MainHomeFirstAudioContentSection.swift`
@@ -267,9 +298,9 @@
- 실행 명령: `rg "ic_content_tag_point|ic_content_tag_original|isPointAvailable|무료|FIRST|MainHomeFirstAudioContentSection" SodaLive/Sources/V2`
- 기대 결과: 오디오 카드 조건부 시각요소와 섹션 조합이 확인된다.
### Phase 10: AI 캐릭터 섹션
### Phase 13: AI 캐릭터 섹션 UI
- [ ] **Task 10.1: AI 캐릭터 섹션 작성/보완**
- [ ] **Task 13.1: AI 캐릭터 섹션 작성/보완**
- 대상 파일:
- 생성/보완: `SodaLive/Sources/V2/Main/Home/Recommendation/Components/MainHomeAiCharacterSection.swift`
- 확인/보완: `SodaLive/Sources/V2/Component/Card/AiCharacterCard.swift`
@@ -281,9 +312,9 @@
- 실행 명령: `rg "MainHomeAiCharacterSection|AiCharacterCard|totalChatCount|originalWorkTitle|profileImage" SodaLive/Sources/V2`
- 기대 결과: AI 캐릭터 섹션이 신규 응답 필드를 기준으로 구성된다.
### Phase 11: 장르의 크리에이터 섹션
### Phase 14: 장르의 크리에이터 섹션 UI
- [ ] **Task 11.1: 장르 크리에이터 그룹 섹션 작성/보완**
- [ ] **Task 14.1: 장르 크리에이터 그룹 섹션 작성/보완**
- 대상 파일:
- 생성/보완: `SodaLive/Sources/V2/Main/Home/Recommendation/Components/MainHomeGenreCreatorSection.swift`
- 생성/보완: `SodaLive/Sources/V2/Main/Home/Recommendation/Components/MainHomeCreatorGroupSection.swift`
@@ -297,9 +328,9 @@
- 실행 명령: `rg "MainHomeGenreCreatorSection|MainHomeCreatorGroupSection|genreName|creators|followAll" SodaLive/Sources/V2/Main/Home/Recommendation`
- 기대 결과: 장르 그룹 섹션과 그룹 재사용 구조가 확인된다.
### Phase 12: 최근 응원이 많은 크리에이터 섹션
### Phase 15: 최근 응원이 많은 크리에이터 섹션 UI
- [ ] **Task 12.1: 응원 크리에이터 섹션 작성/보완**
- [ ] **Task 15.1: 응원 크리에이터 섹션 작성/보완**
- 대상 파일:
- 생성/보완: `SodaLive/Sources/V2/Main/Home/Recommendation/Components/MainHomeCheerCreatorSection.swift`
- 확인/보완: `SodaLive/Sources/V2/Main/Home/Recommendation/Components/MainHomeCreatorGroupSection.swift`
@@ -313,9 +344,9 @@
- 실행 명령: `rg "MainHomeCheerCreatorSection|cheerCreators|MainHomeCreatorGroupSection|CreatorProfileGrid" SodaLive/Sources/V2/Main/Home/Recommendation`
- 기대 결과: 응원 섹션이 장르 그룹 UI를 재사용한다.
### Phase 13: 인기 커뮤니티 섹션 FeedCommunityView
### Phase 16: 인기 커뮤니티 섹션 UI와 FeedCommunityView
- [ ] **Task 13.1: FeedCommunityView/CommunityPostCard 요구 보완**
- [ ] **Task 16.1: FeedCommunityView/CommunityPostCard 요구 보완**
- 대상 파일:
- 확인/보완: `SodaLive/Sources/V2/Component/Card/CommunityPostCard.swift`
- 생성/보완: `SodaLive/Sources/V2/Main/Home/Recommendation/Components/MainHomePopularCommunitySection.swift`
@@ -331,9 +362,9 @@
- 실행 명령: `rg "MainHomePopularCommunitySection|CommunityPostCard|imageUrl|audioUrl|existOrdered|구매완료" SodaLive/Sources/V2`
- 기대 결과: 커뮤니티 섹션과 카드 조건 분기가 확인되고 `구매완료` 표시 구현은 없어야 한다.
### Phase 14: 사업자 정보 섹션
### Phase 17: 사업자 정보 섹션 UI
- [ ] **Task 14.1: 사업자 정보 더보기/접기 섹션 작성/보완**
- [ ] **Task 17.1: 사업자 정보 더보기/접기 섹션 작성/보완**
- 대상 파일:
- 생성/보완: `SodaLive/Sources/V2/Main/Home/Recommendation/Components/MainHomeBusinessInfoSection.swift`
- 확인/보완: `SodaLive/Sources/V2/Component/Text/ExpandableTextView.swift`
@@ -347,9 +378,9 @@
- 실행 명령: `rg "MainHomeBusinessInfoSection|ExpandableTextView|lineLimit|더보기|접기" SodaLive/Sources/V2`
- 기대 결과: 사업자 정보 섹션과 확장 텍스트 구현이 확인된다.
### Phase 15: 섹션 조립 순서와 빈 섹션 처리
### Phase 18: 섹션 조립 순서와 빈 섹션 처리
- [ ] **Task 15.1: MainHomeRecommendationView에 섹션 순서 반영**
- [ ] **Task 18.1: MainHomeRecommendationView에 섹션 순서 반영**
- 대상 파일:
- 확인/보완: `SodaLive/Sources/V2/Main/Home/Recommendation/MainHomeRecommendationView.swift`
- 작업 내용:
@@ -360,9 +391,9 @@
- 실행 명령: `rg "MainHomeLiveSection|MainHomeBannerSection|MainHomeActiveCreatorSection|MainHomeRecentDebutCreatorSection|MainHomeFirstAudioContentSection|MainHomeAiCharacterSection|MainHomeGenreCreatorSection|MainHomeCheerCreatorSection|MainHomePopularCommunitySection|MainHomeBusinessInfoSection" SodaLive/Sources/V2/Main/Home/Recommendation/MainHomeRecommendationView.swift`
- 기대 결과: 모든 구현 대상 섹션이 올바른 순서로 조립된다.
### Phase 16: 프로젝트 포함과 빌드 검증
### Phase 19: 최종 프로젝트 포함과 빌드 검증
- [ ] **Task 16.1: Xcode 프로젝트 포함 여부 확인**
- [ ] **Task 19.1: Xcode 프로젝트 포함 여부 확인**
- 대상 파일:
- 확인/보완: `SodaLive.xcodeproj/project.pbxproj`
- 확인: `SodaLive/Sources/V2/Main/Home/**`
@@ -375,7 +406,7 @@
- 실행 명령: `plutil -lint SodaLive.xcodeproj/project.pbxproj`
- 기대 결과: `OK`
- [ ] **Task 16.2: 정적 점검과 빌드**
- [ ] **Task 19.2: 정적 점검과 빌드**
- 대상 파일:
- 확인: `SodaLive/Sources/V2/Main/Home/**`
- 확인: `SodaLive/Sources/V2/Component/**`
@@ -395,9 +426,9 @@
- 실행 명령: `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build`
- 기대 결과: `BUILD SUCCEEDED`
### Phase 17: 문서와 검증 기록 갱신
### Phase 20: 문서와 검증 기록 갱신
- [ ] **Task 17.1: PRD/계획 문서 갱신**
- [ ] **Task 20.1: PRD/계획 문서 갱신**
- 대상 파일:
- 수정: `docs/20260602_메인_홈_추천_UI_API_연동/prd.md`
- 수정: `docs/20260602_메인_홈_추천_UI_API_연동/plan-task.md`
@@ -411,6 +442,55 @@
## 검증 기록
### 2026-06-26 Phase 1~3 코드 리뷰 보완
- 목적: Phase 2.2 리뷰에서 지적된 과거 추정 응답 필드 혼재를 제거하고, 추천 전용 request 모델 위치를 `Recommendation/Models` 구조로 일치
- 수행 내용:
- `MainHomeRecommendationResponse.swift`에서 PRD 응답 스펙에 없는 legacy/추정 필드(`liveRoomId`, `profileImageUrl`, `thumbnailUrl`, `coverImageUrl`, `releaseDate`, `originalTitle` 등) 제거
- 배너는 상세 PRD 스펙이 별도로 없으므로 기존 표시/이동 판단에 필요한 `RecommendationBannerResponse` 최소 필드 유지
- `FollowRecommendedCreatorsRequest.swift``SodaLive/Sources/V2/Main/Home/Recommendation/Models` 아래로 이동
- `SodaLive.xcodeproj/project.pbxproj`의 request/model/API/Repository 참조 경로 갱신
- 검증:
- `rg "liveRoomId|profileImageUrl|thumbnailUrl|coverImageUrl|releaseDate|originalTitle|chatCount|creatorProfileImageUrl|genreId|debutDate|followerCount|cheerCount|nickname" SodaLive/Sources/V2/Main/Home/Recommendation/Models/MainHomeRecommendationResponse.swift` 실행, 검색 결과 없음 확인
- `rg "FollowRecommendedCreatorsRequest" SodaLive/Sources/V2/Main/Home SodaLive.xcodeproj/project.pbxproj` 실행, request 모델이 `Recommendation/Models`에 있고 호출부/프로젝트 참조가 유지됨 확인
- `rg --files SodaLive/Sources/V2/Main/Home | sort` 실행, 추천 전용 모델/API 파일이 `Recommendation` 하위에 위치함 확인
- `plutil -lint SodaLive.xcodeproj/project.pbxproj` 실행, `OK` 확인
- `git diff --check` 실행, 출력 없이 성공 확인
- `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build` 실행, `BUILD SUCCEEDED` 확인
### 2026-06-26 Phase 4 이후 데이터 선행 순서 재배치
- 목적: Figma 기준 UI는 직접 확인하며 처리할 수 있도록, Phase 4 이후 작업을 네트워크 통신/상태/라우팅/중간 빌드 검증 선행 후 섹션 UI 구현 순서로 재배치
- 수행 내용:
- Phase 4를 추천 ViewModel 데이터 로딩 계층 정리로 변경
- Phase 5를 상세 진입 데이터/라우팅 guard로 배치
- Phase 6을 홈 탭 shell과 탭별 루트 연결로 배치하되, 섹션 UI 구현은 이후 Phase로 미룸
- Phase 7에 데이터 기반 프로젝트 포함과 중간 빌드 검증을 추가
- 기존 섹션별 UI Phase를 Phase 8~17로 뒤로 이동하고, 섹션 조립/최종 검증/문서 갱신을 Phase 18~20으로 재번호 지정
- 검증:
- `rg "^### Phase [0-9]+:|- \\[[ x]\\] \\*\\*Task [0-9]+\\.[0-9]+:" docs/20260602_메인_홈_추천_UI_API_연동/plan-task.md` 실행, Phase/Task 번호 형식 확인
- `git diff --check -- docs/20260602_메인_홈_추천_UI_API_연동/plan-task.md` 실행, 출력 없이 성공 확인
### 2026-06-26 Phase 1~3 재점검 및 보완
- 목적: 신규 재분류 기준의 Phase 1~3에 맞춰 추천 API/모델/활동 타입 위치와 응답 필드를 `Recommendation` 하위 구조로 정리
- 수행 내용:
- PRD와 현재 `SodaLive/Sources/V2/Main/Home`, `SodaLive/Sources/V2/Component` 구현 상태를 비교해 Phase 1 기준점과 제외 범위 확인
- 추천 API/Repository를 `SodaLive/Sources/V2/Main/Home/Recommendation/Repository` 아래로 이동하고 `MainHomeRecommendationApi`, `MainHomeRecommendationRepository`로 이름 정리
- 추천 응답 모델과 활동 타입을 `SodaLive/Sources/V2/Main/Home/Recommendation/Models` 아래로 이동
- `HomeRecommendationResponse.banners` 타입을 `RecommendationBannerResponse`로 명확히 하고 PRD 핵심 필드(`roomId`, `creatorProfileImage`, `targetId`, `price`, `coverImage`, `isPointAvailable`, `totalChatCount`, `originalWorkTitle`, `audioUrl`) 반영
- `RecommendedActivityType``LIVE`, `LIVE_REPLAY`, `AUDIO`, `COMMUNITY` 변환과 `I18n.HomeRecommendation` ko/en/ja 문구 유지 확인
- `SodaLive.xcodeproj/project.pbxproj`의 이동/이름 변경된 Swift 파일 참조 갱신
- 검증:
- `rg --files SodaLive/Sources/V2/Main/Home SodaLive/Sources/V2/Component SodaLive/Sources/Home SodaLive/Sources/I18n | sort` 실행, V2 홈/공용 컴포넌트 및 기존 홈 파일 목록 확인
- `rg "추천 필모그래피|또 다른 모습|figma.com|localhost:3845" SodaLive/Sources/V2/Main/Home SodaLive/Sources/V2/Component` 실행, 검색 결과 없음 확인
- `rg "/api/v2/home/recommendations|getRecommendations" SodaLive/Sources/V2/Main/Home/Recommendation/Repository SodaLive/Sources/Home` 실행, 신규 추천 endpoint가 `Recommendation/Repository`에서만 검색되고 기존 `SodaLive/Sources/Home`에는 없음 확인
- `rg "roomId|creatorProfileImage|targetId|price|coverImage|isPointAvailable|totalChatCount|originalWorkTitle|audioUrl" SodaLive/Sources/V2/Main/Home/Recommendation/Models/MainHomeRecommendationResponse.swift` 실행, PRD 핵심 필드 반영 확인
- `rg "LIVE_REPLAY|activityLive|activityAudio|activityCommunity|ライブ|オーディオ|コミュニティ" SodaLive/Sources/V2/Main/Home/Recommendation/Models/RecommendedActivityType.swift SodaLive/Sources/I18n/I18n.swift` 실행, 활동 타입 변환과 I18n 문구 확인
- `plutil -lint SodaLive.xcodeproj/project.pbxproj` 실행, `OK` 확인
- `git diff --check` 실행, 출력 없이 성공 확인
- `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build` 실행, `BUILD SUCCEEDED` 확인
### 2026-06-26 MainHome 탭별 폴더 구조 반영
- 목적: `MainHomeView`에 추천/랭킹/팔로잉 콘텐츠 조립이 누적되지 않도록 탭별 하위 폴더와 루트 View 구조를 PRD/계획 문서에 반영