docs(main): V2 직접 진입 문서를 정리한다
This commit is contained in:
@@ -0,0 +1,75 @@
|
||||
# 레거시 메인 직접 진입 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`<br>`docs/20260918_레거시_메인_직접_진입_v2_전환/reviews/phase2-live-deeplink-deferral-review.md`<br>`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명을 유지한다. |
|
||||
Reference in New Issue
Block a user