12 KiB
레거시 메인 직접 진입 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/testlocal 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 -
RED: 두 production 파일의 V2 target과 레거시 target 부재를 검증하는 source test를 작성한다.
-
RED 확인:
./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.MainV2DirectEntrySourceTest" --max-workers=1이 기존MainActivitytarget 때문에 실패하는지 확인한다. -
GREEN: 두 파일의 import와 Intent target만
MainV2Activity로 교체한다. -
GREEN 확인: 같은 focused test가 성공하는지 확인한다.
-
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
./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에서
MainV2DirectEntrySourceTest2개가 각각MainV2Activityimport 부재 assertion으로 실패함을 확인했다. - 2026-09-18: GREEN에서 같은 focused test 2개가 성공했다. 두 대상 파일의 레거시
MainActivityimport/Intent 검색 결과는 0건이며git diff --check도 성공했다. - 2026-09-18:
:app:compileDebugKotlin은 성공했다. 전체:app:testDebugUnitTest는 1,263개 중 이번 변경과 무관한ChatMainFragmentLayoutTest:71,ChatMainTitleBarActionSourceTest:162개가 실패했다. - 2026-09-18:
:app:ktlintCheck는 기존live.reservation_statuspackage underscore 규칙 위반으로 실패했다. 후속 요청에 따라 package 선언과 manifest/import 참조를live.reservation.status로 변경했다. - 2026-09-18: Oracle 리뷰 결과 차단 사항 없이 승인됐다. 호출 순서 assertion 보강은 비차단 참고 사항으로 남겼다.
- 2026-09-18: 후속 ktlint 수정 RED에서
LiveReservationPackageSourceTest2개가 기존reservation_statuspackage/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 -
RED: foreground live route 선택적 지연, loading 인계, 종료 callback 제거를 검증하는 source test를 추가한다.
-
RED 확인:
./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.MainV2ActivitySourceTest" --max-workers=1이 새 동작 부재로 실패하는지 확인한다. -
GREEN: 기존
routeLoadingDialog,isDeferredRouteLoading,isLiveEntryLoading을 재사용해onNewIntent()대상 경로만 1초 지연하고 종료 시 callback을 제거한다. -
GREEN 확인: 같은 focused test와 직접 영향 회귀 테스트가 성공하는지 확인한다.
-
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 재검토.
-
RED:
hasPositiveId()가executeBundleRoute()와 동일한 Elvis fallback 순서를 사용하는지 검증한다. -
RED 확인: focused test에서 기존 OR 판별 때문에 assertion이 실패하는지 확인한다.
-
GREEN:
hasPositiveId()값 선택 순서만 최소 수정한다. -
GREEN 확인: focused test와 Phase 2 Gate를 다시 실행한다.
-
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 |
Phase 2 Gate
./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 -
RED: 새 디렉터리에 6개 파일이 존재하고 기존 디렉터리가 없음을 검증하는 source test를 추가한다.
-
RED 확인: focused test가 새 경로 부재 assertion으로 실패하는지 확인한다.
-
GREEN: Kotlin 파일을 새 경로로 이동하고 source test의 파일 경로를 갱신한다.
-
GREEN 확인: package source test와 direct-entry source test가 성공하는지 확인한다.
-
REFACTOR: resource 이름은 변경하지 않고 compile, ktlint, diff check 결과를 기록한다.
Phase 3 Gate
./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에서
MainV2ActivitySourceTest14개와 direct-entry/audio/Live Action focused 회귀가 성공했다.:app:compileDebugKotlin,:app:ktlintCheck,git diff --check도 성공했다. - 2026-09-18: 전체
:app:testDebugUnitTest는 1,267개 중 기존ChatMainFragmentLayoutTest:71,ChatMainTitleBarActionSourceTest:162개만 실패했다. - 2026-09-18: 5개 병렬 리뷰에서 보안·자동 QA·맥락 검토는 통과했고, 목표·코드 품질 리뷰가
REV-P2-001fallback 판별 불일치를 확정했다. - 2026-09-18:
P2-R1RED에서MainV2ActivitySourceTest15개 중 신규 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에서
LiveReservationPackageSourceTest3개 중 신규 경로 정합성 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:162개만 실패했다. - 2026-09-18: Phase 3 목표·자동 QA·코드 품질·보안·맥락 검토 5개가 모두 통과했으며 확정 발견 사항은 없다.