5.4 KiB
5.4 KiB
레거시 메인 직접 진입 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.mddocs/20260918_레거시_메인_직접_진입_v2_전환/reviews/phase2-live-deeplink-deferral-review.mddocs/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.statuspackage 파일의 물리 디렉터리를 package 경로와 일치시킨다.
4. Non-Goals
- 레거시
MainActivity내부 기능 또는 Fragment를 수정하지 않는다. - 다른 Activity/Fragment의 내비게이션 구조를 리팩터링하지 않는다.
- 새로운 라우팅 추상화나 의존성을 추가하지 않는다.
5. 핵심 사용자 흐름
- 라이브룸에서 다른 라이브 푸시를 누르고 이동을 확인하면 V2 메인이 딥링크 bundle을 처리해 대상 라이브로 이동한다.
- 이동한 라이브룸에서 나가면 V2 메인이 표시된다.
- 라이브 예약 취소 화면에서 "다른 수다 예약"을 누르면 기존 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가 두 경로의
MainV2Activitytarget과 레거시 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명을 유지한다. |