Files
sodalive-ios/docs/20260818_메인_탭_당겨서_새로고침/plan-task.md

24 KiB

메인 탭 당겨서 새로고침 구현 계획

문서 항목 내용
상태 구현 완료
작성일 2026-08-18
요구사항 기준 docs/20260818_메인_탭_당겨서_새로고침/prd.md
API 기준 기존 홈/콘텐츠/대화 API 계약 재사용, 신규 API 없음
현재 Phase Phase 1~3 완료
현재 활성 Goal 없음

목표

메인 , 콘텐츠, 대화 탭에서 현재 선택된 내부 탭·필터 상태를 유지한 채 사용자가 당겨서 최신 데이터를 다시 조회할 수 있게 한다.

현재 상태

Phase 상태 완료 Task 활성/다음 Goal 차단 또는 남은 조건
1 완료 1/1 없음 없음
2 완료 1/1 없음 없음
3 완료 1/1 없음 없음
  • 동시에 하나의 미완료 goal만 운용한다.
  • 완료된 Task와 검증 기록은 되돌리거나 삭제하지 않는다. 후속 수정은 회귀 수정 Task와 새 goal ID를 추가한다.
  • 구현 체크박스는 완료 상태를 반영하고, 사용자 수동 검증 체크박스는 실제 확인 전까지 미완료로 둔다.

범위

포함

  • 메인 홈 내부 추천, 랭킹, 팔로잉 현재 선택 상태 새로고침.
  • 메인 콘텐츠 내부 추천, 랭킹, 전체 현재 선택 상태 새로고침.
  • 콘텐츠 랭킹의 현재 AudioRankingType, 콘텐츠 전체의 현재 MainContentAllType, ContentSort, SeriesPublishedDaysOfWeek 유지.
  • 대화 탭의 현재 MainChatFilter 유지와 첫 페이지 재조회.
  • loading, empty, error, content 상태에서 모두 새로고침 가능하도록 상태 화면 구조 점검.

제외

  • 마이 탭 새로고침.
  • 하단 탭 전체 일괄 새로고침.
  • 신규 API endpoint, 신규 dependency, 신규 공통 refresh abstraction.
  • 자동 갱신, polling, push 기반 갱신.

기술적 제약

  • 기술 스택: Swift, SwiftUI, Combine, Moya, CocoaPods 기반 iOS 앱.
  • 아키텍처: 기존 View -> ViewModel -> Repository -> Api(TargetType) 흐름을 유지한다.
  • UI: SwiftUI .refreshable 또는 동등한 iOS 기본 refresh affordance를 우선 사용한다.
  • 데이터·보안: 기존 인증 header, token 저장, 언어 header 흐름을 변경하지 않는다.
  • 의존성: 신규 dependency를 추가하지 않는다.
  • 계약: 제공되지 않은 endpoint, DTO, enum, 오류 status/key를 추정하지 않는다.
  • 구현: 모든 구현 Task는 RED → GREEN → REFACTOR 순서를 체크박스에 명시한다. 현재 저장소는 테스트 번들 타깃이 명확하지 않으므로 테스트 작성이 불가능한 Task는 대체 검증 방법을 사용한다.
  • 검증: xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive" -configuration Debug build와 수동 QA를 필수 Gate로 둔다.

Task TDD 작성 규칙

테스트 작성이 현실적으로 가능한 경우 아래 순서를 따른다.

  • RED: 가장 작은 실패 test를 작성한다.
  • RED 확인: focused test를 실행해 요구 동작이 없어서 발생한 의도한 assertion 실패를 확인한다.
  • GREEN: RED를 통과시키는 최소 구현을 작성한다.
  • GREEN 확인: 같은 focused test를 다시 실행해 성공을 확인한다.
  • REFACTOR: 새 동작을 바꾸지 않는 범위에서 이번 Task가 만든 중복만 정리하고, focused test·직접 영향 회귀·lint를 다시 실행해 실제 결과를 Progress에 기록한다.

현재 docs/agent-guides/build-test-verification.md 기준으로 테스트 번들 타깃이 확인되지 않는다. 테스트 타깃이 없는 상태에서는 각 구현 Task에 TDD 예외 사유대체 검증 방법을 기록하고 빌드와 수동 QA로 Gate를 통과시킨다.

Phase 1 홈 탭 새로고침

Phase 결과: 홈 탭의 현재 내부 선택 상태에서 당겨서 새로고침을 실행할 수 있다.

선행조건: PRD REFRESH-001~004, HOME-REFRESH-001~003 확정.

Phase 완료 조건: P1-T1P1-GATE 완료, 검증 기록 누적.

구현 항목

Task 1.1 홈 내부 탭별 refresh 연결

Goal 실행 P1-T1:추천, 랭킹, 팔로잉에서 현재 선택된 내부 탭의 기존 fetch 경로를 당겨서 새로고침에 연결한다.

  • 시작 조건: PRD HOME-REFRESH-001~003, REFRESH-003 확정.
  • 완료 증거: 홈 내부 3개 탭의 새로고침 동작과 빈/오류 상태 재시도 확인.
  • 범위 밖: 콘텐츠/대화 탭 변경, 공통 refresh abstraction 생성.
  • TDD 예외 사유: 현재 테스트 번들 타깃이 확인되지 않는 SwiftUI 화면 동작 변경이다.
  • 대체 검증 방법: 구현 diff 검토, xcodebuild 빌드, 시뮬레이터 또는 기기 수동 QA.

Files:

  • Modify: SodaLive/Sources/V2/Main/Home/Recommendation/MainHomeRecommendationView.swift
  • Modify: SodaLive/Sources/V2/Main/Home/Recommendation/MainHomeRecommendationViewModel.swift
  • Modify: SodaLive/Sources/V2/Main/Home/Ranking/MainHomeRankingView.swift
  • Modify: SodaLive/Sources/V2/Main/Home/Ranking/MainHomeRankingViewModel.swift
  • Modify: SodaLive/Sources/V2/Main/Home/Following/MainHomeFollowingView.swift
  • Modify: SodaLive/Sources/V2/Main/Home/Following/MainHomeFollowingViewModel.swift

Interfaces:

  • Consumes: 기존 fetchRecommendations(), fetchRankings(), fetchFollowing() 메서드.

  • Produces: 각 홈 내부 View의 pull-to-refresh 사용자 동작.

  • 상태 확인: 각 View의 현재 loading, empty, error, content 분기를 확인하고 새로고침 가능한 ScrollView 배치가 필요한 지점을 표시한다.

  • GREEN: 최소 구현으로 각 View에 새로고침 동작을 연결한다. 필요 시 ViewModel에 refresh()처럼 기존 fetch를 감싸는 얇은 메서드만 추가한다.

  • GREEN 확인:추천, 랭킹, 팔로잉에서 당겨서 새로고침 후 선택된 내부 탭이 유지되는지 수동 확인한다.

  • REFACTOR: 이번 Task에서 만든 중복만 정리하고 신규 공통 abstraction은 만들지 않는다.

완료 조건

  • P1-T1의 체크박스와 완료 증거가 모두 충족됐다.
  • 홈 내부 탭 3개가 PRD 요구사항과 추적된다.
  • 알려진 문서와 구현의 차이가 없다.

검증 방법

Phase 1 Gate

Goal 실행 P1-GATE: 홈 탭 새로고침 사용자 흐름과 공통 품질 기준을 최종 판정한다.

  • 시작 조건: P1-T1 완료.
  • 완료 증거: 아래 자동·수동 검증 통과와 Progress 기록.
  • 범위 밖: 콘텐츠/대화 탭 구현.
xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive" -configuration Debug build

Expected: exit code 0. 홈 탭 진입 후 추천, 랭킹, 팔로잉 각각에서 당겨서 새로고침이 동작하고 내부 선택 상태가 유지된다.

수동 검증:

  • 추천 콘텐츠 상태에서 새로고침한다.
  • 랭킹 콘텐츠 상태에서 새로고침한다.
  • 팔로잉 콘텐츠 또는 로그인 필요/빈 상태에서 새로고침한다.
  • 새로고침 실패 시 기존 오류 표시 정책을 유지한다.

Phase 2 콘텐츠 탭 새로고침

Phase 결과: 콘텐츠 탭의 현재 내부 선택 상태와 필터 조건에서 당겨서 새로고침을 실행할 수 있다.

선행조건: P1-GATE 완료.

Phase 완료 조건: P2-T1P2-GATE 완료, 검증 기록 누적.

구현 항목

Task 2.1 콘텐츠 내부 탭별 refresh 연결

Goal 실행 P2-T1: 콘텐츠 추천, 랭킹, 전체에서 현재 선택된 내부 탭과 필터 상태의 기존 fetch 경로를 당겨서 새로고침에 연결한다.

  • 시작 조건: PRD CONTENT-REFRESH-001~003, REFRESH-003~004 확정.
  • 완료 증거: 콘텐츠 내부 3개 탭과 전체 하위 필터 상태의 새로고침 확인.
  • 범위 밖: 홈/대화 탭 변경, 전체 데이터 일괄 refresh.
  • TDD 예외 사유: 현재 테스트 번들 타깃이 확인되지 않는 SwiftUI 화면 동작 변경이다.
  • 대체 검증 방법: 구현 diff 검토, xcodebuild 빌드, 시뮬레이터 또는 기기 수동 QA.

Files:

  • Modify: SodaLive/Sources/V2/Main/Content/Recommendation/MainContentRecommendationView.swift
  • Modify: SodaLive/Sources/V2/Main/Content/Recommendation/MainContentRecommendationViewModel.swift
  • Modify: SodaLive/Sources/V2/Main/Content/Ranking/MainContentRankingView.swift
  • Modify: SodaLive/Sources/V2/Main/Content/Ranking/MainContentRankingViewModel.swift
  • Modify: SodaLive/Sources/V2/Main/Content/All/MainContentAllView.swift
  • Modify: SodaLive/Sources/V2/Main/Content/All/MainContentAllViewModel.swift

Interfaces:

  • Consumes: 기존 fetchRecommendations(), fetchRankings(), fetchFirstPage() 메서드와 선택 상태 selectedType, selectedSort, selectedDayOfWeek, selectedType.

  • Produces: 콘텐츠 내부 View의 pull-to-refresh 사용자 동작.

  • 상태 확인: 콘텐츠 추천, 랭킹, 전체의 loading, empty, error, content 분기를 확인한다.

  • GREEN: 최소 구현으로 각 View에 새로고침 동작을 연결한다. 콘텐츠 전체는 현재 type/sort/dayOfWeek를 유지하고 첫 페이지를 다시 조회한다.

  • GREEN 확인: 콘텐츠 추천, 랭킹, 전체에서 당겨서 새로고침 후 선택된 내부 탭과 필터가 유지되는지 확인한다.

  • REFACTOR: 새로 만든 중복만 정리하고 신규 공통 abstraction은 만들지 않는다.

완료 조건

  • P2-T1의 체크박스와 완료 증거가 모두 충족됐다.
  • 콘텐츠 내부 탭 3개와 전체 하위 필터 상태가 PRD 요구사항과 추적된다.
  • 알려진 문서와 구현의 차이가 없다.

검증 방법

Phase 2 Gate

Goal 실행 P2-GATE: 콘텐츠 탭 새로고침 사용자 흐름과 공통 품질 기준을 최종 판정한다.

  • 시작 조건: P2-T1 완료.
  • 완료 증거: 아래 자동·수동 검증 통과와 Progress 기록.
  • 범위 밖: 대화 탭 구현.
xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive" -configuration Debug build

Expected: exit code 0. 콘텐츠 탭 진입 후 추천, 랭킹, 전체 각각에서 당겨서 새로고침이 동작하고 현재 선택 상태가 유지된다.

수동 검증:

  • 콘텐츠 추천에서 새로고침한다.
  • 콘텐츠 랭킹에서 랭킹 타입을 바꾼 뒤 새로고침하고 선택 타입이 유지되는지 확인한다.
  • 콘텐츠 전체 > 오디오에서 sort를 바꾼 뒤 새로고침하고 type/sort가 유지되는지 확인한다.
  • 콘텐츠 전체 > 시리즈에서 요일과 sort를 바꾼 뒤 새로고침하고 type/dayOfWeek/sort가 유지되는지 확인한다.
  • 빈/오류 상태에서도 새로고침을 재시도할 수 있는지 확인한다.

Phase 3 대화 탭 새로고침

Phase 결과: 대화 탭의 현재 필터에서 당겨서 첫 페이지를 다시 조회할 수 있다.

선행조건: P2-GATE 완료.

Phase 완료 조건: P3-T1P3-GATE 완료, 검증 기록 누적.

구현 항목

Task 3.1 대화 필터별 refresh 연결

Goal 실행 P3-T1: 대화 전체, AI, DM 현재 필터의 기존 첫 페이지 fetch 경로를 당겨서 새로고침에 연결한다.

  • 시작 조건: PRD CHAT-REFRESH-001~002, REFRESH-003~004 확정.
  • 완료 증거: 대화 3개 필터의 새로고침과 pagination 초기화 확인.
  • 범위 밖: 채팅방 상세 라우팅 변경, 신규 DM 기능.
  • TDD 예외 사유: 현재 테스트 번들 타깃이 확인되지 않는 SwiftUI 화면 동작 변경이다.
  • 대체 검증 방법: 구현 diff 검토, xcodebuild 빌드, 시뮬레이터 또는 기기 수동 QA.

Files:

  • Modify: SodaLive/Sources/V2/Main/Chat/MainChatView.swift
  • Modify: SodaLive/Sources/V2/Main/Chat/MainChatViewModel.swift

Interfaces:

  • Consumes: 기존 selectedFilter, fetchFirstPage(filter:), fetchNextPageIfNeeded(currentItem:).

  • Produces: 대화 View의 pull-to-refresh 사용자 동작.

  • 상태 확인: 대화 탭의 loading, empty, error, content 분기와 ScrollView 배치를 확인한다.

  • GREEN: 최소 구현으로 현재 selectedFilter를 유지한 첫 페이지 새로고침을 연결한다.

  • GREEN 확인: 전체, AI, DM 각 필터에서 새로고침 후 필터가 유지되고 rooms, hasMore, nextCursor가 첫 페이지 응답 기준으로 갱신되는지 확인한다.

  • REFACTOR: 새로 만든 중복만 정리하고 신규 공통 abstraction은 만들지 않는다.

완료 조건

  • P3-T1의 체크박스와 완료 증거가 모두 충족됐다.
  • 대화 필터 3개와 pagination 초기화가 PRD 요구사항과 추적된다.
  • 알려진 문서와 구현의 차이가 없다.

검증 방법

Phase 3 Gate

Goal 실행 P3-GATE: 대화 탭 새로고침 사용자 흐름과 최종 회귀 범위를 판정한다.

  • 시작 조건: P3-T1 완료.
  • 완료 증거: 아래 자동·수동 검증 통과와 Progress 기록.
  • 범위 밖: 실패와 무관한 다음 기능 구현.
xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive" -configuration Debug build

Expected: exit code 0. 대화 전체, AI, DM 필터에서 당겨서 새로고침이 동작하고 필터와 pagination 상태가 올바르게 유지·초기화된다.

수동 검증:

  • 대화 전체에서 새로고침한다.
  • 대화 AI에서 새로고침하고 필터가 유지되는지 확인한다.
  • 대화 DM에서 새로고침하고 필터가 유지되는지 확인한다.
  • 빈/오류 상태에서도 새로고침을 재시도할 수 있는지 확인한다.
  • 새로고침 후 스크롤 하단에서 다음 페이지 조회가 이어지는지 확인한다.

실행 순서와 의존성

순서 Goal 선행조건 병행 가능 차단 시 다음 행동
1 P1-T1 PRD 확정 아니요 홈 탭 상태 분기 재확인
2 P1-GATE P1-T1 아니요 실패 소유 Task의 회귀 수정 goal 생성
3 P2-T1 P1-GATE 아니요 콘텐츠 탭 상태 분기 재확인
4 P2-GATE P2-T1 아니요 실패 소유 Task의 회귀 수정 goal 생성
5 P3-T1 P2-GATE 아니요 대화 탭 상태 분기 재확인
6 P3-GATE P3-T1 아니요 실패 소유 Task의 회귀 수정 goal 생성
P1-T1 -> P1-GATE -> P2-T1 -> P2-GATE -> P3-T1 -> P3-GATE

변경 금지 항목

  • 확정된 요구사항을 근거 없이 변경하지 않는다.
  • 기존 완료 체크박스와 Progress·Decision Log·검증 기록을 삭제하거나 덮어쓰지 않는다.
  • 신규 endpoint, DTO, dependency, 공통 refresh abstraction을 만들지 않는다.
  • 요청 범위 밖의 리팩터링과 UI 재설계를 하지 않는다.
  • test를 삭제·skip·완화하거나 타입 오류를 우회해 Gate를 통과시키지 않는다.
  • JWT, password, signed URL, 개인 메시지 본문 같은 민감정보를 log·fixture·문서에 기록하지 않는다.

의사결정 및 중단 규칙

  • PRD와 구현 계획이 충돌하면 PRD를 우선하고 Decision Log에 정정 기록을 남긴다.
  • 구현 범위가 바뀌면 prd.md를 먼저 보강하고 plan-task.md 체크리스트를 업데이트한 뒤 코드를 수정한다.
  • 안전한 최소 기본값이 문서에 있으면 그 값만 구현한다. 안전하게 구현할 수 없으면 추정하지 않는다.
  • 체크박스 일부, 빌드 일부 또는 코드 작성만 끝난 상태에서는 goal을 complete로 갱신하지 않는다.
  • 완료 증거와 Progress 기록까지 충족한 뒤에만 goal을 complete로 갱신한다.

Progress

기존 기록을 삭제하거나 덮어쓰지 않고 실제 실행 결과를 차수별로 누적한다.

문서 작성 1차 실행 — 2026-08-18

  • 상태: 완료
  • 무엇을: prd.mdplan-task.md 신규 작성.
  • 왜: 코드 구현 전 요구사항과 구현 계획을 확정하기 위해 작성.
  • 어떻게:
    • docs/sample/sample-prd.md 확인 — 샘플 구조 확인.
    • docs/sample/sample-plan-task.md 확인 — 계획 문서 구조 확인.
    • docs/agent-guides/documentation-policy.md 확인 — 신규 문서 경로 규칙 확인.
    • 관련 V2 메인 홈/콘텐츠/대화 View와 ViewModel 확인 — 기존 fetch 경로와 선택 상태 확인.
  • 남은 항목: 코드 구현 전체.
  • 다음 행동: 사용자가 구현을 승인하면 P1-T1부터 진행.

P1-T1~P3-T1 1차 실행 — 2026-08-18

  • 상태: 구현 완료 / 사용자 수동 검증 대기
  • 무엇을: 홈, 콘텐츠, 대화 탭의 현재 선택 상태별 당겨서 새로고침과 Combine 완료 대기 연결.
  • 왜: 사용자가 현재 화면을 벗어나지 않고 최신 첫 페이지 또는 단일 조회 결과를 받을 수 있게 하기 위해 구현.
  • 어떻게:
    • xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive" -configuration Debug -sdk iphonesimulator -destination "generic/platform=iOS Simulator" build CODE_SIGNING_ALLOWED=NO — 성공, exit code 0, BUILD SUCCEEDED.
    • git diff --check — 성공, 오류 없음.
    • 코드 검토 — 홈/콘텐츠/대화 현재 선택 상태 유지, 빈/오류 상태 ScrollView 제공, 대화/콘텐츠 전체 첫 페이지 응답 기준 pagination 교체 확인.
    • visual-qa — 사용자 요청에 따라 미실행.
  • 남은 항목: 아래 사용자 수동 테스트 목록과 각 Phase Gate 체크박스 확인.
  • 다음 행동: 사용자가 수동 테스트를 수행하고 성공/실패 결과를 전달한다.

P1-T1~P3-T1 리뷰 보정 — 2026-08-18

  • 상태: 구현 완료 / 사용자 수동 검증 대기
  • 무엇을: Combine 취소 시 refresh 대기 종료, 최초 loading 상태 새로고침, 콘텐츠 전체 최초 요청 중복 방지 보정.
  • 왜: checked continuation은 Combine 구독 취소 시 completion을 받지 못해 대기할 수 있고, 기존 최초 loading 화면에는 refresh 가능한 ScrollView가 없었기 때문이다.
  • 어떻게:
    • 7개 ViewModel — checked continuation 대신 $isLoading.values를 기다리도록 변경하고 이미 로딩 중이면 중복 요청 없이 기존 요청 완료를 기다림.
    • 7개 View — 최초 loading을 full-height ScrollView로 구성해 기본 .refreshable 동작 제공.
    • MainContentAllViewModel.fetchFirstPageIfNeeded()isLoading == false guard를 추가해 탭 재진입 중 page 0 중복 요청 차단.
    • xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive" -configuration Debug -sdk iphonesimulator -destination "generic/platform=iOS Simulator" build CODE_SIGNING_ALLOWED=NO — 성공, exit code 0, BUILD SUCCEEDED.
    • git diff --check — 성공, 오류 없음.
    • Oracle 최종 코드 리뷰 — criterion-blocking finding 없음, 무조건 승인.
  • 남은 항목: 아래 사용자 수동 테스트 목록과 각 Phase Gate 체크박스 확인.
  • 다음 행동: 사용자가 수동 테스트를 수행하고 성공/실패 결과를 전달한다.

P1-GATE~P3-GATE 사용자 수동 검증 — 2026-08-18

  • 상태: 완료
  • 무엇을: 홈, 콘텐츠, 대화 탭의 당겨서 새로고침과 선택 상태·pagination·오류 재시도 회귀를 사용자 수동 확인.
  • 왜: 실제 로그인 데이터와 네트워크 환경에서 사용자 동작 기준을 최종 판정하기 위해 수행.
  • 어떻게:
    • 사용자 수동 테스트 목록 전체 — 성공 확인.
    • PRD 기능·UI/UX 수용 기준 — 충족 확인.
  • 남은 항목: 없음.
  • 다음 행동: 없음.

사용자 수동 테스트 목록

사전 조건:

  • Debug 앱을 실제 기기 또는 iOS Simulator에서 실행한다.
  • 로그인 후 메인 화면에 진입한다.
  • 각 테스트에서 화면 상단 목록을 아래로 충분히 당겨 iOS 기본 새로고침 indicator가 보이는지 확인한다.

홈 탭

  • 홈 > 추천: 아래로 당기면 indicator가 API 응답까지 유지되고 최신 데이터가 표시된다. 선택 탭은 추천으로 유지된다.
  • 홈 > 랭킹: 아래로 당기면 랭킹이 다시 조회되고 선택 탭은 랭킹으로 유지된다.
  • 홈 > 팔로잉: 아래로 당기면 팔로잉 데이터가 다시 조회되고 선택 탭은 팔로잉으로 유지된다.
  • 홈 > 팔로잉 로그인 필요/빈/오류 상태: 상태 화면에서도 아래로 당겨 재시도할 수 있다.

콘텐츠 탭

  • 콘텐츠 > 추천: 아래로 당기면 추천 데이터가 다시 조회되고 선택 탭은 추천으로 유지된다.
  • 콘텐츠 > 랭킹: 주간/월간 등 기본값이 아닌 랭킹 타입을 선택한 뒤 새로고침해도 같은 타입이 유지된다.
  • 콘텐츠 > 전체 > 오디오: 타입과 정렬을 변경한 뒤 새로고침해도 선택한 타입/정렬이 유지되고 목록이 첫 페이지 결과로 교체된다.
  • 콘텐츠 > 전체 > 시리즈: 요일과 정렬을 변경한 뒤 새로고침해도 타입/요일/정렬이 유지되고 목록이 첫 페이지 결과로 교체된다.
  • 콘텐츠의 빈/오류 상태: 상태 화면에서도 아래로 당겨 재시도할 수 있다.

대화 탭

  • 대화 > 전체: 아래로 당기면 ALL 첫 페이지가 다시 조회되고 선택 필터는 유지된다.
  • 대화 > AI: 아래로 당기면 AI 첫 페이지가 다시 조회되고 선택 필터는 유지된다.
  • 대화 > DM: 아래로 당기면 DM 첫 페이지가 다시 조회되고 선택 필터는 유지된다.
  • 대화 빈/오류 상태: 상태 화면에서도 아래로 당겨 재시도할 수 있다.
  • 대화 목록 새로고침 후 하단까지 스크롤하면 다음 페이지가 중복 없이 이어서 추가된다.

공통 회귀

  • 새로고침 중 다른 내부 탭/필터로 강제 전환되지 않는다.
  • 새로고침 실패 시 기존 토스트 또는 오류/빈 상태가 표시되고 다시 당겨 재시도할 수 있다.
  • 하단 마이 탭에는 이번 변경으로 새로고침 동작이 추가되지 않았다.

Decision Log

날짜 ID 상태 결정 근거 영향 Goal/문서
2026-08-18 DEC-001 확정 당겨서 새로고침은 현재 선택된 내부 탭·필터·정렬 상태만 대상으로 한다. 사용자 A안 선택 P1-T1, P2-T1, P3-T1, prd.md
2026-08-18 DEC-002 확정 빈/오류 상태에서도 당겨서 새로고침을 허용한다. 사용자 A안 선택 P1-GATE, P2-GATE, P3-GATE, prd.md
2026-08-18 DEC-003 확정 신규 API, dependency, 공통 abstraction 없이 기존 fetch 경로를 연결한다. 최소 변경 원칙과 기존 ViewModel 구조 전체 Goal

발견된 문제

ID 심각도 상태 발견 내용 영향 Goal 처리 계획
ISSUE-001 Low 해결 현재 테스트 번들 타깃이 명확하지 않아 SwiftUI 새로고침 동작을 자동 테스트로 고정하기 어렵다. 전체 Gate Debug 빌드와 사용자 수동 검증을 완료 증거로 기록했다. 테스트 타깃이 추가되면 focused test를 후속 보강한다.

최종 보고 형식

구현 결과: 메인 홈, 콘텐츠, 대화 탭의 당겨서 새로고침 구현 완료 여부

- 변경: 홈/콘텐츠/대화 각 현재 선택 상태의 첫 페이지 또는 단일 조회 새로고침 연결
- 결정: DEC-001 현재 선택 상태만 새로고침, DEC-002 빈/오류 상태 새로고침 허용, DEC-003 신규 API/dependency/공통 abstraction 제외
- 검증:
  - `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive" -configuration Debug build` — 성공/실패와 exit code
  - 수동 검증 — 홈/콘텐츠/대화 내부 탭·필터별 새로고침 성공/실패와 불가 사유
- 남은 항목: 구현자가 확인한 외부 의존 또는 후속 범위, 없으면 없음
- 문서: `docs/20260818_메인_탭_당겨서_새로고침/prd.md`, `docs/20260818_메인_탭_당겨서_새로고침/plan-task.md`