# 레거시 메인 직접 진입 V2 전환 PRD
## 문서 정보
| 항목 | 내용 |
|---|---|
| 문서 상태 | 구현 완료 |
| 작성일 | 2026-09-18 |
| 최종 수정일 | 2026-09-18 |
| 대상 제품 | Android SodaLive 메인 라우팅 |
| 관련 구현 계획 | `docs/20260918_레거시_메인_직접_진입_v2_전환/plan-task.md` |
| 관련 review | `docs/20260918_레거시_메인_직접_진입_v2_전환/reviews/phase1-main-v2-direct-entry-review.md`
`docs/20260918_레거시_메인_직접_진입_v2_전환/reviews/phase2-live-deeplink-deferral-review.md`
`docs/20260918_레거시_메인_직접_진입_v2_전환/reviews/phase3-reservation-status-package-path-review.md` |
## 1. Overview
레거시 `MainActivity`를 직접 여는 두 사용자 흐름을 `MainV2Activity`로 전환한다. 기존 딥링크 데이터와 Activity stack 정리 동작은 유지한다.
## 2. Problem Statement
- 라이브룸에서 다른 라이브 푸시 이동을 확인하면 레거시 `MainActivity`를 경유한다.
- 라이브 예약 취소 화면의 "다른 수다 예약" 동작도 task를 비운 뒤 레거시 `MainActivity`를 연다.
- 이 때문에 후속 화면 종료 시 현재 제품 기준인 V2 메인이 아닌 레거시 메인이 표시될 수 있다.
## 3. Goals
- 두 직접 진입 경로가 `MainV2Activity`를 연다.
- 라이브룸 딥링크 경로의 `Constants.EXTRA_DATA`, `FLAG_ACTIVITY_CLEAR_TOP`, `FLAG_ACTIVITY_SINGLE_TOP`을 유지한다.
- 예약 취소 경로의 `finishAffinity()` 동작을 유지한다.
- 라이브룸이 foreground인 상태에서 V2 메인이 받은 라이브룸 딥링크만 1초 지연하고, 대기 및 입장 처리 중 기존 로딩 다이얼로그를 표시한다.
- `live.reservation.status` package 파일의 물리 디렉터리를 package 경로와 일치시킨다.
## 4. Non-Goals
- 레거시 `MainActivity` 내부 기능 또는 Fragment를 수정하지 않는다.
- 다른 Activity/Fragment의 내비게이션 구조를 리팩터링하지 않는다.
- 새로운 라우팅 추상화나 의존성을 추가하지 않는다.
## 5. 핵심 사용자 흐름
1. 라이브룸에서 다른 라이브 푸시를 누르고 이동을 확인하면 V2 메인이 딥링크 bundle을 처리해 대상 라이브로 이동한다.
2. 이동한 라이브룸에서 나가면 V2 메인이 표시된다.
3. 라이브 예약 취소 화면에서 "다른 수다 예약"을 누르면 기존 task를 정리하고 V2 메인이 표시된다.
## 6. 기능 요구사항
| ID | 상태 | 요구사항 | 수용 기준 | 계획 연결 |
|---|---|---|---|---|
| `ROUTE-001` | 확정 | 라이브룸 딥링크 확인 경로는 `MainV2Activity`를 사용한다. | target이 `MainV2Activity`이고 기존 bundle/flags가 유지된다. | `P1-T1` |
| `ROUTE-002` | 확정 | 예약 취소의 다른 수다 예약 경로는 `MainV2Activity`를 사용한다. | target이 `MainV2Activity`이고 `finishAffinity()`가 유지된다. | `P1-T1` |
| `ROUTE-003` | 확정 | 대상 두 파일에서 레거시 `MainActivity` 직접 참조를 제거한다. | source test에서 import와 Intent target 부재를 확인한다. | `P1-T1` |
| `ROUTE-004` | 확정 | `MainV2Activity.onNewIntent()`는 foreground 라이브룸에서 전달된 라이브룸 딥링크만 1초 지연한다. | 채팅·오디오·일반 딥링크는 기존 즉시 처리 경로를 유지하고 `SINGLE_TOP`도 유지된다. | `P2-T1` |
| `ROUTE-005` | 확정 | 지연 중에는 기존 `LoadingDialog`를 표시하고 라이브 입장 loading 상태로 표시 책임을 인계한다. | deferred 또는 live entry loading 중에만 다이얼로그가 표시되고 두 상태가 모두 끝나면 해제된다. | `P2-T1` |
| `ROUTE-006` | 확정 | Activity 종료 후 지연된 딥링크가 실행되지 않는다. | `onDestroy()`에서 해당 callback을 제거하고 다이얼로그를 해제한다. | `P2-T1` |
| `ROUTE-007` | 확정 | `live.reservation.status` package 파일은 `live/reservation/status/`에 위치한다. | 대상 6개 파일이 새 경로에 있고 기존 `live/reservation_status/` 경로는 존재하지 않는다. | `P3-T1` |
## 7. 오류 처리와 보안
- 기존 Intent extra와 Activity flag를 그대로 유지하므로 신규 오류 처리는 추가하지 않는다.
- 인증 정보, 토큰, URL을 새로 저장하거나 로그로 출력하지 않는다.
## 8. 테스트 및 수용 기준
- source test가 두 경로의 `MainV2Activity` target과 레거시 target 부재를 검증한다.
- focused unit test와 Kotlin compile이 성공한다.
- 사용자 요청에 따라 기기·에뮬레이터 UI 테스트는 수행하지 않는다.
- source test가 foreground 라이브룸 딥링크의 선택적 지연, 기존 loading 결합 조건, 종료 정리를 검증한다.
## 9. Decision Log
| 날짜 | 결정 | 이유 |
|---|---|---|
| 2026-09-18 | 두 직접 진입 경로를 함께 V2로 전환 | 사용자가 두 곳 모두 수정을 확정했다. |
| 2026-09-18 | 기존 flags, extras, `finishAffinity()` 유지 | 메인 target 외 동작 변경을 피한다. |
| 2026-09-18 | foreground 라이브룸 딥링크에만 1초 지연과 기존 로딩 다이얼로그를 적용 | 레거시 진입 경로가 제공하던 정리 시간을 재현하면서 다른 딥링크와 `MainV2Activity` 단일 인스턴스 동작을 유지한다. |
| 2026-09-18 | `reservation_status` 물리 디렉터리를 `reservation/status`로 이동 | package 선언과 소스 경로를 일치시키고 ktlint 허용 package명을 유지한다. |