docs(main): V2 직접 진입 문서를 정리한다
This commit is contained in:
@@ -0,0 +1,184 @@
|
||||
# 레거시 메인 직접 진입 V2 전환 구현 계획
|
||||
|
||||
> **For agentic workers:** 구현은 TDD 순서로 수행하고 각 검증 결과를 이 문서에 누적한다.
|
||||
|
||||
| 문서 항목 | 내용 |
|
||||
|---|---|
|
||||
| 상태 | 구현 중 |
|
||||
| 작성일 | 2026-09-18 |
|
||||
| 요구사항 기준 | `docs/20260918_레거시_메인_직접_진입_v2_전환/prd.md` |
|
||||
| API 기준 | 해당 없음 |
|
||||
| 현재 Phase | Phase 3 예약 status package 경로 정합성 |
|
||||
| 현재 활성 Goal | `P3-T1` |
|
||||
|
||||
## 목표
|
||||
|
||||
레거시 `MainActivity`를 직접 여는 두 사용자 흐름이 기존 부가 동작을 유지하면서 `MainV2Activity`로 진입한다.
|
||||
|
||||
## 범위
|
||||
|
||||
### 포함
|
||||
|
||||
- `LiveRoomActivity` 딥링크 confirm Intent target 교체
|
||||
- `LiveReservationCancelActivity` 다른 수다 예약 Intent target 교체
|
||||
- source regression test와 focused build 검증
|
||||
|
||||
### 제외
|
||||
|
||||
- 레거시 Fragment 및 `MainActivity` 내부 변경
|
||||
- 라우팅 공통화 또는 리팩터링
|
||||
- 기기·에뮬레이터 UI 테스트
|
||||
|
||||
## 기술적 제약
|
||||
|
||||
- Kotlin/Android 기존 Intent 패턴을 유지한다.
|
||||
- 신규 의존성이나 추상화를 추가하지 않는다.
|
||||
- `app/src/test` local unit source test만 추가한다.
|
||||
|
||||
## Phase 1
|
||||
|
||||
**Phase 결과:** 두 직접 진입 경로가 V2 메인을 사용한다.
|
||||
|
||||
### Task 1.1 직접 진입 target 전환
|
||||
|
||||
**Goal 실행 `P1-T1`:** 두 경로의 target만 `MainV2Activity`로 최소 교체한다.
|
||||
|
||||
**Files:**
|
||||
|
||||
- Modify: `app/src/main/java/kr/co/vividnext/sodalive/live/room/LiveRoomActivity.kt`
|
||||
- Modify: `app/src/main/java/kr/co/vividnext/sodalive/live/reservation/status/LiveReservationCancelActivity.kt`
|
||||
- Create: `app/src/test/java/kr/co/vividnext/sodalive/v2/main/MainV2DirectEntrySourceTest.kt`
|
||||
|
||||
- [x] **RED:** 두 production 파일의 V2 target과 레거시 target 부재를 검증하는 source test를 작성한다.
|
||||
- [x] **RED 확인:** `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.MainV2DirectEntrySourceTest" --max-workers=1`이 기존 `MainActivity` target 때문에 실패하는지 확인한다.
|
||||
- [x] **GREEN:** 두 파일의 import와 Intent target만 `MainV2Activity`로 교체한다.
|
||||
- [x] **GREEN 확인:** 같은 focused test가 성공하는지 확인한다.
|
||||
- [x] **REFACTOR:** 추가 리팩터링 없이 관련 source test, compile, lint를 실행한다.
|
||||
|
||||
### 시나리오 계약
|
||||
|
||||
| 시나리오 | 통과 조건 | 검증 surface | Test ID |
|
||||
|---|---|---|---|
|
||||
| 라이브 푸시 confirm | `MainV2Activity` target이며 bundle과 두 flag가 유지된다. | source test | `라이브룸 딥링크 confirm은 MainV2Activity로 이동한다` |
|
||||
| 예약 취소 다른 수다 예약 | `finishAffinity()` 후 `MainV2Activity`를 시작한다. | source test | `예약 취소의 다른 수다 예약은 MainV2Activity로 이동한다` |
|
||||
| 인접 회귀 | 대상 두 파일에 레거시 `MainActivity` import/target이 없다. | source scan | 위 두 test의 부재 assertion |
|
||||
|
||||
### Phase 1 Gate
|
||||
|
||||
```bash
|
||||
./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.MainV2DirectEntrySourceTest" --max-workers=1
|
||||
./gradlew :app:compileDebugKotlin --max-workers=1
|
||||
./gradlew :app:ktlintCheck --max-workers=1
|
||||
git diff --check
|
||||
```
|
||||
|
||||
**Expected:** 모든 명령 exit code 0, 두 경로에서 `MainActivity::class.java` 직접 진입 0건.
|
||||
|
||||
## Phase 1 Verification Log
|
||||
|
||||
- 2026-09-18: 구현 전 계획 확정. 검증 결과는 Task 진행에 따라 누적한다.
|
||||
- 2026-09-18: RED에서 `MainV2DirectEntrySourceTest` 2개가 각각 `MainV2Activity` import 부재 assertion으로 실패함을 확인했다.
|
||||
- 2026-09-18: GREEN에서 같은 focused test 2개가 성공했다. 두 대상 파일의 레거시 `MainActivity` import/Intent 검색 결과는 0건이며 `git diff --check`도 성공했다.
|
||||
- 2026-09-18: `:app:compileDebugKotlin`은 성공했다. 전체 `:app:testDebugUnitTest`는 1,263개 중 이번 변경과 무관한 `ChatMainFragmentLayoutTest:71`, `ChatMainTitleBarActionSourceTest:16` 2개가 실패했다.
|
||||
- 2026-09-18: `:app:ktlintCheck`는 기존 `live.reservation_status` package underscore 규칙 위반으로 실패했다. 후속 요청에 따라 package 선언과 manifest/import 참조를 `live.reservation.status`로 변경했다.
|
||||
- 2026-09-18: Oracle 리뷰 결과 차단 사항 없이 승인됐다. 호출 순서 assertion 보강은 비차단 참고 사항으로 남겼다.
|
||||
- 2026-09-18: 후속 ktlint 수정 RED에서 `LiveReservationPackageSourceTest` 2개가 기존 `reservation_status` package/import/manifest 참조 때문에 실패했다. 이후 package 선언과 참조를 `live.reservation.status`로 교체했고, `LiveReservationPackageSourceTest`, `MainV2DirectEntrySourceTest`, `:app:compileDebugKotlin`, `:app:ktlintCheck`, production/manifest underscore package 참조 검색이 모두 성공했다.
|
||||
|
||||
## Phase 2
|
||||
|
||||
**Phase 결과:** foreground 라이브룸에서 다른 라이브룸으로 이동할 때 V2 메인이 로딩을 표시하며 1초 뒤 입장을 시작한다.
|
||||
|
||||
### Task 2.1 foreground 라이브룸 딥링크 지연 처리
|
||||
|
||||
**Goal 실행 `P2-T1`:** `SINGLE_TOP`을 유지하면서 대상 라이브룸 딥링크에만 기존 deferred loading 흐름을 적용한다.
|
||||
|
||||
**Files:**
|
||||
|
||||
- Modify: `app/src/main/java/kr/co/vividnext/sodalive/v2/main/MainV2Activity.kt`
|
||||
- Modify: `app/src/test/java/kr/co/vividnext/sodalive/v2/main/MainV2ActivitySourceTest.kt`
|
||||
|
||||
- [x] **RED:** foreground live route 선택적 지연, loading 인계, 종료 callback 제거를 검증하는 source test를 추가한다.
|
||||
- [x] **RED 확인:** `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.MainV2ActivitySourceTest" --max-workers=1`이 새 동작 부재로 실패하는지 확인한다.
|
||||
- [x] **GREEN:** 기존 `routeLoadingDialog`, `isDeferredRouteLoading`, `isLiveEntryLoading`을 재사용해 `onNewIntent()` 대상 경로만 1초 지연하고 종료 시 callback을 제거한다.
|
||||
- [x] **GREEN 확인:** 같은 focused test와 직접 영향 회귀 테스트가 성공하는지 확인한다.
|
||||
- [x] **REFACTOR:** 신규 추상화 없이 중복만 정리하고 compile, ktlint, diff 검증 결과를 기록한다.
|
||||
|
||||
### Task 2.R1 비라이브 ID fallback 판별 회귀 수정
|
||||
|
||||
**Goal 실행 `P2-R1`:** `REV-P2-001`에서 확인된 route 판별과 실제 실행의 ID fallback 차이를 제거한다.
|
||||
|
||||
- **시작 조건:** `REV-P2-001` 확정.
|
||||
- **대상 파일:** `MainV2Activity.kt`, `MainV2ActivitySourceTest.kt`
|
||||
- **수정 범위:** 문자열 ID가 숫자로 파싱되면 그 값의 양수 여부를 사용하고, 파싱되지 않을 때만 Long extra로 fallback한다.
|
||||
- **회귀 테스트:** 문자열 ID `0`/음수와 양수 Long extra가 함께 있어도 실제 router와 동일하게 live fallback을 선택하는 source contract.
|
||||
- **완료 증거:** RED assertion 실패, focused GREEN, Phase 2 Gate 재실행, review 재검토.
|
||||
|
||||
- [x] **RED:** `hasPositiveId()`가 `executeBundleRoute()`와 동일한 Elvis fallback 순서를 사용하는지 검증한다.
|
||||
- [x] **RED 확인:** focused test에서 기존 OR 판별 때문에 assertion이 실패하는지 확인한다.
|
||||
- [x] **GREEN:** `hasPositiveId()` 값 선택 순서만 최소 수정한다.
|
||||
- [x] **GREEN 확인:** focused test와 Phase 2 Gate를 다시 실행한다.
|
||||
- [x] **REFACTOR:** 추가 변경 없이 리뷰 보고서와 Verification Log에 증거를 누적한다.
|
||||
|
||||
### 시나리오 계약
|
||||
|
||||
| 시나리오 | 통과 조건 | 검증 surface | Test ID |
|
||||
|---|---|---|---|
|
||||
| foreground 라이브 이동 | `LiveRoomActivity.isForeground`이고 실제 live route일 때 loading을 표시하고 1000ms 뒤 처리한다. | source test | `MainV2Activity는 foreground 라이브 딥링크만 로딩과 함께 지연한다` |
|
||||
| 종료 경계 | Activity 종료 시 pending route callback과 loading dialog가 남지 않는다. | source test | `MainV2Activity는 종료할 때 지연 딥링크와 로딩을 정리한다` |
|
||||
| 인접 회귀 | 채팅·오디오·일반 딥링크는 즉시 처리되고 direct entry의 `CLEAR_TOP | SINGLE_TOP`이 유지된다. | source test | 기존 audio/direct-entry test 및 선택적 지연 test |
|
||||
|
||||
### Phase 2 Gate
|
||||
|
||||
```bash
|
||||
./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.MainV2ActivitySourceTest" --tests "kr.co.vividnext.sodalive.v2.main.MainV2DirectEntrySourceTest" --tests "kr.co.vividnext.sodalive.v2.main.MainV2AudioNotificationRouteSourceTest" --tests "kr.co.vividnext.sodalive.v2.live.action.*" --max-workers=1
|
||||
./gradlew :app:compileDebugKotlin --max-workers=1
|
||||
./gradlew :app:ktlintCheck --max-workers=1
|
||||
git diff --check
|
||||
```
|
||||
|
||||
**Expected:** 모든 명령 exit code 0, foreground live route만 1초 지연, 기존 direct-entry flags 유지.
|
||||
|
||||
## Phase 3
|
||||
|
||||
**Phase 결과:** `live.reservation.status` package 선언과 물리 디렉터리 구조가 일치한다.
|
||||
|
||||
### Task 3.1 예약 status package 경로 이동
|
||||
|
||||
**Goal 실행 `P3-T1`:** 기존 package 선언을 유지하며 대상 Kotlin 파일 6개를 `live/reservation/status/`로 이동한다.
|
||||
|
||||
**Files:**
|
||||
|
||||
- Move: `app/src/main/java/kr/co/vividnext/sodalive/live/reservation_status/*.kt`
|
||||
- To: `app/src/main/java/kr/co/vividnext/sodalive/live/reservation/status/*.kt`
|
||||
- Modify: `app/src/test/java/kr/co/vividnext/sodalive/live/LiveReservationPackageSourceTest.kt`
|
||||
- Modify: `app/src/test/java/kr/co/vividnext/sodalive/v2/main/MainV2DirectEntrySourceTest.kt`
|
||||
|
||||
- [x] **RED:** 새 디렉터리에 6개 파일이 존재하고 기존 디렉터리가 없음을 검증하는 source test를 추가한다.
|
||||
- [x] **RED 확인:** focused test가 새 경로 부재 assertion으로 실패하는지 확인한다.
|
||||
- [x] **GREEN:** Kotlin 파일을 새 경로로 이동하고 source test의 파일 경로를 갱신한다.
|
||||
- [x] **GREEN 확인:** package source test와 direct-entry source test가 성공하는지 확인한다.
|
||||
- [x] **REFACTOR:** resource 이름은 변경하지 않고 compile, ktlint, diff check 결과를 기록한다.
|
||||
|
||||
### Phase 3 Gate
|
||||
|
||||
```bash
|
||||
./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.live.LiveReservationPackageSourceTest" --tests "kr.co.vividnext.sodalive.v2.main.MainV2DirectEntrySourceTest" --max-workers=1
|
||||
./gradlew :app:compileDebugKotlin --max-workers=1
|
||||
./gradlew :app:ktlintCheck --max-workers=1
|
||||
git diff --check
|
||||
```
|
||||
|
||||
**Expected:** 대상 6개 파일은 `live/reservation/status/`에만 존재하고 모든 명령 exit code 0.
|
||||
|
||||
## Verification Log
|
||||
|
||||
- 2026-09-18: Phase 2 RED에서 신규 선택적 지연·종료 정리 test 2개가 기존 즉시 처리 때문에 실패했고 기존 test 12개는 통과했다.
|
||||
- 2026-09-18: Phase 2 GREEN에서 `MainV2ActivitySourceTest` 14개와 direct-entry/audio/Live Action focused 회귀가 성공했다. `:app:compileDebugKotlin`, `:app:ktlintCheck`, `git diff --check`도 성공했다.
|
||||
- 2026-09-18: 전체 `:app:testDebugUnitTest`는 1,267개 중 기존 `ChatMainFragmentLayoutTest:71`, `ChatMainTitleBarActionSourceTest:16` 2개만 실패했다.
|
||||
- 2026-09-18: 5개 병렬 리뷰에서 보안·자동 QA·맥락 검토는 통과했고, 목표·코드 품질 리뷰가 `REV-P2-001` fallback 판별 불일치를 확정했다.
|
||||
- 2026-09-18: `P2-R1` RED에서 `MainV2ActivitySourceTest` 15개 중 신규 fallback test 1개만 실패했다. 최소 수정 후 같은 test와 Phase 2 focused 회귀, compile, ktlint, diff check가 성공했다.
|
||||
- 2026-09-18: 수정 후 전체 `:app:testDebugUnitTest`는 1,268개 중 동일한 기존 채팅 source test 2개만 실패했다. 목표·코드 품질 Oracle 재검토는 모두 `REV-P2-001` 해결 및 신규 blocker 없음으로 승인했다.
|
||||
- 2026-09-18: Phase 3 RED에서 `LiveReservationPackageSourceTest` 3개 중 신규 경로 정합성 test 1개가 새 디렉터리 부재로 실패했다.
|
||||
- 2026-09-18: Phase 3 GREEN에서 package/direct-entry source test 5개, `:app:compileDebugKotlin`, `:app:ktlintCheck`, `git diff --check`가 성공했다. 대상 Kotlin 파일 6개는 `live/reservation/status/`에만 존재하고 resource 변경은 없다.
|
||||
- 2026-09-18: 전체 `:app:testDebugUnitTest`는 1,269개 중 기존 `ChatMainFragmentLayoutTest:71`, `ChatMainTitleBarActionSourceTest:16` 2개만 실패했다.
|
||||
- 2026-09-18: Phase 3 목표·자동 QA·코드 품질·보안·맥락 검토 5개가 모두 통과했으며 확정 발견 사항은 없다.
|
||||
Reference in New Issue
Block a user