Repository navigation
refactor(platform): 소관 그래프를 Navigation 3 로컬 스택으로 이관 #1698
Copy link
Copy link
Closed
Labels
area:platformCI·빌드·릴리스·저장소 운영 영역CI·빌드·릴리스·저장소 운영 영역refactor동작 변경 없이 코드 구조·책임·경계를 개선하는 작업동작 변경 없이 코드 구조·책임·경계를 개선하는 작업
Description
작업 유형
refactor — 동작 변경 없는 구조·책임·경계 개선
주 담당 모듈
platform — Android 앱·CI·빌드·릴리스·저장소 운영
개요
Navigation 3 전환 중 플랫폼 담당 범위에서 즉시 진행할 수 있는 공통 계약과 Onboarding·Afternote·ReceivedAfternote·Receiver 로컬 그래프 이관만 소유한다. 다른 담당 그래프와 앱 전체 루트 교체는 #1702로 분리했다.
작업 범위:
- Navigation 3 runtime/UI, lifecycle ViewModel add-on과 serialization 의존성을 convention으로 정리한다.
- core:ui의 route/key 경계와 재사용 가능한 NavigationState·Navigator·entry decorator 계약을 만든다.
- 온보딩 그래프를 로컬 NavDisplay로 이관하고 SignUp·FindId 공유 ViewModel 수명을 보존한다.
- 애프터노트 작성자·수신 애프터노트 그래프를 이관하고 AfternoteHost·EditorFlow 공유 ViewModel, route 인자, 수신자 선택 결과 1회 소비를 보존한다.
- 수신자 그래프를 이관하고 DeliveryVerificationFlow의 5화면 공유 ViewModel 수명과 인증 완료 back 경계를 보존한다.
- 각 피처는 기존 루트 Nav2에 단일 host destination으로 연결하고, 로컬 스택 바닥의 back·외부 이동·바텀바 상태만 명시적 boundary로 앱 셸에 반환한다.
- SavedStateHandle.toRoute()에 의존한 인자 주입은 Nav3 key 직접 주입 또는 assisted injection으로 바꾼다.
- 결과를 실제 앱 경로에서 사용하며 최종 루트 전환 전용 dead code를 만들지 않는다.
완료 조건:
- Onboarding·Afternote·ReceivedAfternote·Receiver가 기존 루트 Nav2 아래 실제 사용되는 Nav3 로컬 스택으로 동작한다.
- 공유 ViewModel 동일성·정리 시점, route 인자, 화면 결과 1회 소비, back 경계가 현행과 동일하다.
- 탭 이탈·복귀와 프로세스 재생성에서 필요한 route·화면 상태가 복원된다.
- predictive back과 로컬 entry 제거 시 ViewModel clear를 검증한다.
- 관련 유닛·Robolectric·androidTest, Konsist, ktlint와 :app:compileDebugUnitTestKotlin이 통과한다.
- #1702가 소비할 entry·boundary 계약을 코드 또는 이슈에 남긴다.
범위 밖:
- 앱 루트 NavHost를 NavDisplay로 교체하고 Navigation 2를 제거하는 최종 통합: refactor(platform): 앱 루트를 Navigation 3 NavDisplay로 전환 #1702
- Setting·TimeLetter·MindRecord 내부 구현: refactor(setting): 설정 흐름을 Navigation 3 로컬 스택으로 이관 #1695, refactor(timeletter): 타임레터 흐름을 Navigation 3 로컬 스택으로 이관 #1696, refactor(mindrecord): Navigation 3 파일럿을 전체 entry 계약으로 확장 #1697
- App Links URI·인텐트·인증 후 목적지 재개: feat(platform): App Links URI 계약·인텐트 수신·인증 후 목적지 재개 #924
- FCM payload·PendingIntent·알림 목적지 배선: 알림 탭이 목적지로 갈 수 없는 구조 — MainActivity onNewIntent 부재, PendingIntent 빌더 2벌 중복 #1111
이 이슈는 다른 담당 이슈에 막히지 않으며 독립적으로 착수·완료·머지할 수 있다.
자식 이슈
없음
참고
- 분리 원본: feat(platform): App Links URI 계약·인텐트 수신·인증 후 목적지 재개 #924
- 최종 루트 전환: refactor(platform): 앱 루트를 Navigation 3 NavDisplay로 전환 #1702
- 회귀 기준: test(platform): Nav2 백스택 회귀 기준이 0건이다 — 탭 상태 복원·인증 스택 경계·flow-scoped VM 수명 전부 미검증 #1601
- 공식 마이그레이션 가이드: https://developer.android.com/guide/navigation/navigation-3/migration-guide
- Shared ViewModel recipe: https://developer.android.com/guide/navigation/navigation-3/recipes/sharedviewmodel
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
area:platformCI·빌드·릴리스·저장소 운영 영역CI·빌드·릴리스·저장소 운영 영역refactor동작 변경 없이 코드 구조·책임·경계를 개선하는 작업동작 변경 없이 코드 구조·책임·경계를 개선하는 작업
Activity
[-]refactor(platform): Navigation 3 전환 — 소관 그래프 선이관과 앱 루트 NavDisplay 교체[/-][+]refactor(platform): 소관 그래프를 Navigation 3 로컬 스택으로 이관[/+]OnlyReadOneBook commentedon Sep 2, 2026
온보딩 공유 ViewModel 목록에
FindPasswordViewModel추가작업 범위의 「온보딩 그래프를 로컬 NavDisplay로 이관하고 SignUp·FindId 공유 ViewModel 수명을 보존한다」에 하나가 더 붙는다.
#1624 (
feat/457-password-reset) 가 비밀번호 찾기 3화면을 세우면서 온보딩 그래프에 세 번째 그래프 스코프 공유 VM 을 추가한다.FindPasswordRoute·FindPasswordResetRoute·FindPasswordCompleteRouteOnboardingNavGraphFindPasswordViewModel—graphScopedParentEntry()+hiltViewModel(parentEntry)로 3 entry 가 동일 인스턴스 공유Nav3 엔 NavGraph 개념이 없어
getBackStackEntry(그래프)로 잡는 이 소유 방식이 그대로는 성립하지 않는다 —rememberViewModelStoreNavEntryDecorator()기반 스코프로 재작성 대상이다(#959 함정 2 참조:entryDecorators를 넘기면 기본 목록을 대체하므로rememberSaveableStateHolderNavEntryDecorator()도 함께 넣어야rememberSaveable이 안 깨진다).#1601 이 이관 위험으로 지목한 「그래프 스코프 공유 VM 7종」의 8번째다.
AppNavigationActions쪽 배선도 같이 온다 —replaceFindPasswordWithComplete()·replaceFindPasswordWithLogin()이popUpTo { inclusive = true }로 소비된 인증번호 화면을 비운다. Nav3 에선 로컬 스택 리스트 조작으로 바뀐다.20 remaining items
refactor(app,afternote): 수신자 등록 진입 배선을 떼어 Nav3 이관 뒤로 미룬다 (#1793)
test(app): 수신자 선택 왕복 계측을 라우트 대기에서 UI 앵커로 바꾼다 (#1698)
merge: #1698 의 계측 앵커 수정을 들인다
merge: #1698 의 계측 앵커 수정을 들인다
merge: #1792 를 거쳐 #1698 의 계측 앵커 수정을 들인다
fix(platform): assisted 상세 VM 을 creationCallback 으로 만들고 수명·back 계약을 잠…
merge: preserve Nav3 hosts and visibility fixes from develop (#1698)
docs(afternote): point receiver route KDoc to Nav3 host (#1698)
fix(ci): give API34 APK packaging a bounded 4Gi heap (#1698)