Files
sodalive-android/docs/20260918_레거시_메인_직접_진입_v2_전환/plan-task.md
T

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/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

  • RED: 두 production 파일의 V2 target과 레거시 target 부재를 검증하는 source test를 작성한다.

  • RED 확인: ./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.MainV2DirectEntrySourceTest" --max-workers=1이 기존 MainActivity target 때문에 실패하는지 확인한다.

  • 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에서 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

  • 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에서 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개가 모두 통과했으며 확정 발견 사항은 없다.