From e466774a8a805d27388d8baed59857f1a9a54713 Mon Sep 17 00:00:00 2001 From: Yu Sung Date: Wed, 15 Jul 2026 14:41:46 +0900 Subject: [PATCH] =?UTF-8?q?docs(main):=20=EB=B3=B5=EA=B7=80=20=EC=B4=88?= =?UTF-8?q?=EA=B8=B0=ED=99=94=20=EB=B0=A9=EC=A7=80=20=EA=B3=84=ED=9A=8D?= =?UTF-8?q?=EC=9D=84=20=EC=B6=94=EA=B0=80=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plan-task.md | 30 ++++++++++++++ .../prd.md | 41 +++++++++++++++++++ 2 files changed, 71 insertions(+) create mode 100644 docs/20260715_메인_복귀시_중복_초기화_방지/plan-task.md create mode 100644 docs/20260715_메인_복귀시_중복_초기화_방지/prd.md diff --git a/docs/20260715_메인_복귀시_중복_초기화_방지/plan-task.md b/docs/20260715_메인_복귀시_중복_초기화_방지/plan-task.md new file mode 100644 index 00000000..8a766243 --- /dev/null +++ b/docs/20260715_메인_복귀시_중복_초기화_방지/plan-task.md @@ -0,0 +1,30 @@ +# 메인 복귀 시 중복 초기화 방지 계획 + +### Phase 1: 현재 동작 확인 + +- [x] **Task 1.1: MainView 생명주기와 내비게이션 구조 확인** + - 확인: `SodaLive/Sources/V2/Main/MainView.swift` + - 확인: `SodaLive/Sources/ContentView.swift` + - 확인: `SodaLive/Sources/App/AppState.swift` + - 검증 기준: `MainView`가 `NavigationStack` 루트에 유지되고 복귀 시 첫 번째 `.onAppear`의 요청이 반복되는 구조를 확인한다. + +### Phase 2: 중복 초기화 차단 + +- [x] **Task 2.1: MainView 인증 데이터 초기화에 1회 가드 적용** + - 수정: `SodaLive/Sources/V2/Main/MainView.swift` + - 검증 기준: 로그인 상태에서 `hasLoadedMainData`가 `false`인 경우에만 인증 데이터 요청이 실행된다. + - 검증 기준: `contentView`와 push 메시지용 두 번째 `.onAppear`는 변경되지 않는다. + +### Phase 3: 검증 + +- [x] **Task 3.1: 변경 범위 및 Debug 빌드 검증** + - 확인: `SodaLive/Sources/V2/Main/MainView.swift` + - 실행 명령: `git diff --check` + - 실행 명령: `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive" -configuration Debug -destination 'generic/platform=iOS Simulator' -derivedDataPath /private/tmp/SodaLiveDerivedData CODE_SIGNING_ALLOWED=NO build` + - 기대 결과: 공백 오류와 컴파일 오류 없이 빌드가 성공한다. + +## 검증 기록 + +- 2026-07-15: `ContentView`와 `AppState`를 확인해 일반 상세 이동은 `navigationPath`에 destination을 추가하고, 메인 복귀는 path를 제거하는 구조임을 확인했다. `MainView`의 인증 데이터 요청은 첫 번째 `.onAppear`에 있어 복귀마다 다시 실행될 수 있다. +- 2026-07-15: `MainView`에 `hasLoadedMainData` 상태를 추가하고, 토큰이 존재하면서 아직 로드하지 않은 경우에만 인증 데이터 초기화 요청을 실행하도록 변경했다. `contentView`와 push 메시지용 두 번째 `.onAppear`는 변경하지 않았다. +- 2026-07-15: `git diff --check`가 exit 0으로 통과했다. Simulator 접근이 필요한 빌드는 샌드박스 밖에서 실행했으며, 위 `xcodebuild` 명령이 기존 경고만 출력하고 `** BUILD SUCCEEDED **` 및 exit 0으로 완료됐다. diff --git a/docs/20260715_메인_복귀시_중복_초기화_방지/prd.md b/docs/20260715_메인_복귀시_중복_초기화_방지/prd.md new file mode 100644 index 00000000..16929026 --- /dev/null +++ b/docs/20260715_메인_복귀시_중복_초기화_방지/prd.md @@ -0,0 +1,41 @@ +# PRD: 메인 복귀 시 중복 초기화 방지 + +## 목표 + +- 다른 페이지에서 `MainView`로 복귀할 때 메인 컨테이너의 인증 데이터 초기화 요청이 반복되지 않게 한다. +- `contentView`와 각 탭 하위 화면의 기존 새로고침 동작은 유지한다. + +## 문제/배경 + +- `MainView`는 `NavigationStack`의 루트로 유지되지만, destination에서 복귀하면 첫 번째 `.onAppear`가 다시 실행된다. +- 이때 `pushTokenUpdate()`, 회원 정보, 이벤트 팝업, 재생 추적 요청이 매번 반복된다. + +## 성공 기준 + +- 로그인 상태에서 메인 인증 데이터 초기화 요청은 동일한 `MainView` 생명주기 동안 한 번만 실행된다. +- 비로그인 최초 진입은 로드 완료로 처리하지 않아 이후 로그인한 메인 진입에서 초기화 요청이 실행된다. +- `contentView` 구성과 push 메시지 복귀 처리는 변경하지 않는다. +- `SodaLive` Debug 빌드가 성공한다. + +## 제외 범위 + +- 탭 하위 화면의 `.onAppear` 및 데이터 새로고침 정책 변경 +- `AppState` 내비게이션 구조 변경 +- `softRestart()`가 의도적으로 `MainView`를 재생성하는 동작 변경 +- 기존 사용자 작업인 이벤트 팝업 배경 및 프로젝트 버전 설정 변경 + +## 핵심 요구사항 + +- `MainView`가 소유하는 로컬 `@State`로 초기화 완료 여부를 관리한다. +- 토큰이 비어 있을 때는 초기화 완료 상태를 설정하지 않는다. +- 기존 첫 번째 `.onAppear`의 인증 데이터 요청에만 가드를 적용한다. + +## 기술/운영 제약 + +- 수정 범위는 `SodaLive/Sources/V2/Main/MainView.swift`로 제한한다. +- 현재 프로젝트에 테스트 번들 타깃이 없으므로 정적 확인과 공식 Debug 빌드로 검증한다. +- 기존 작업 트리 변경을 보존한다. + +## 미결정 사항 + +- 해당 없음.