Repository navigation
refactor(setting): 수신자 목록 ViewModel의 MVI 전환 #1805
Description
작업 유형
refactor — 동작 변경 없는 구조·책임·경계 개선
주 담당 모듈
setting — 설정
개요
설정 MVI 전환의 독립 잔여인 ReceiverListViewModel과 실제 소비 화면을 전환한다. InsertPasswordViewModel은 #1064 / PR #2005가 삭제하는 미사용 선언이므로 전환 대상에서 제외한다. 기존 11개 전체를 다시 작업 대상으로 잡지 않는다.
다른 이슈·PR에서 함께 구현한 범위
- refactor(setting): 남은 이벤트 스트림 2곳을 UiState·MVI로 전환하고 재유입을 막는다 #1502 / refactor: 설정 MVI와 저장·Repository 책임을 최종 계약으로 통합 (#1502) #1967: ConnectedAccounts, ProfileEdit, ReceiverRegister, ReceiverEdit, DeliveryCondition, PushNotification 6개. Channel·SharedFlow 제거와 MviViewModel/Intent/reduce 전환을 한 번에 적용하고 신호 소비 및 이벤트 스트림 재유입 가드를 추가했다.
- 서버 조회 실패가 로그아웃·빈 목록·OFF 기본값으로 위장 — 오류·재시도 상태 미결선 #708 / fix(setting): 오류 상태 처리를 안정화한다 (#708) #1925: SettingViewModel. 조회 오류·재시도 변경과 함께 프로필·로그아웃·탈퇴의 3개 Flow를 단일 UiState로 전환했다. fix(setting): 설정 하위 화면 4종의 재진입 갱신 (#703 분리) #1920 / #1930의 복귀 갱신은 이 최종 계약 위에서 구현한다.
- fix(setting): 패스키 목록·등록 호출과 실패 처리 구현분 분리 (#555) #1944 / fix(setting): 패스키 목록·등록 호출과 실패 처리를 연결한다 (#1944) #1927: 기존 PassKeyViewModel와 AppLockSetupViewModel, 신규 PassKeyListViewModel. 등록·취소·결과 소비와 PIN 재설정 소비처까지 같은 PR에서 최종 MVI 계약을 사용한다. 신규 ViewModel을 만들자마자 이 이슈로 다시 옮기지 않는다.
위 PR들은 열린 리뷰 대상이다. 각 구현·검증·머지는 해당 이슈와 PR에서 추적하며 이 이슈가 중복 구현하거나 대신 완료 처리하지 않는다.
남은 독립 범위
- ReceiverListViewModel 및 실제 화면 소비처
- 각 상태 전이를 순수 reducer로 이동하고 외부 입력은 onIntent 하나로 받는다.
- 기존 목록 구독·재구독과 화면의 검색·선택 동작을 유지한다. 기존 ViewModel에 없는 오류·로딩·비밀번호 정책을 새로 추가하지 않는다.
MviViewModel과 ObserveSignal은 develop에서 이미 사용할 수 있다. 남은 ReceiverListViewModel은 #1502의 이벤트 스트림 흡수 대상이나 #1802의 온보딩 파일럿 소비처와 겹치지 않으므로 이 두 이슈를 전체 착수 차단으로 유지하지 않는다. 별도의 ObserveFlag helper를 전제로 새 의존성을 만들지 않는다. 실제 구현 전에 열린 담당 이슈·PR과 새로운 재작성 관계가 생겼는지 다시 확인한다.
완료 조건
- ReceiverListViewModel이 MviViewModel을 상속하고 onIntent 단일 진입점을 사용한다.
- 상태 변경은 reduce에서 처리하고 일회성 상태는 소비 Intent를 통해 해제한다.
- 실제 Navigation 3 소비처를 새 계약에 맞추고 불필요한 공개 범위를 추가하지 않는다.
- 전환한 ViewModel을 Konsist 예외 목록에서 제거한다. 다른 열린 PR이 이미 제거한 항목은 다시 작업하지 않는다.
- 기존 동작과 오류·소비·중복 요청 경계를 회귀 테스트로 검증하고 관련 compile/ktlint를 통과한다.
자식 이슈
No response
참고
#1695 / #2173의 Navigation 3 entry와 같은 PR에서 최종 목록 MVI 소비를 구현한다. 단순 네비게이션 콜백 통합은 이 이슈 범위 밖이다. 실기기 QA가 필요한 변경이 새로 생기면 실제 변경 경계를 기준으로 검증 범위를 정한다.
2026-09-27 구현 순서 정정
#1429의 좁은 저장소 계약을 소비하고 #1695와 함께 PR #2173에서 완료합니다. ReceiverListViewModel의 단일 UiState, 순수 reducer, ObservationStarted/ObservationStopped 진입을 실제 Nav3 entry에 연결했습니다. 구독 전 요청 없음, 중복 구독 방지, 5초 유예, 재진입 최신 목록, 세션 경계 빈 목록을 회귀 검증합니다. #1502의 다른 ViewModel은 이 목록 전환의 선행이 아닙니다.
Activity
[-]refactor(setting): MVI 전환 — ViewModel 11개 + Channel 5개 흡수[/-][+]refactor(setting): MVI 전환 — ViewModel 11개[/+]7 remaining items
github-actions commentedon Sep 13, 2026
이 이슈를 맡은 PR 은 #2018 다 (base
refactor/1502-setting-state-mvi).base 가 기본 브랜치(
develop)가 아니라서 GitHub 은 이 이슈의 Development 칸에아무것도 표시하지 않는다. 본문에
Closes #N이 있어도 마찬가지다 — 그 링크는 기본 브랜치를target 하는 PR 에서만 만들어진다.
PR 이 닫히거나 머지되면 이 이슈의
pr-open라벨은 다음 리컨사일에서 떨어진다.refactor(setting): Nav3 목록 진입을 최종 MVI 관찰 계약에 연결한다 (#1805)
github-actions commentedon Sep 27, 2026
이 이슈는 필수 메타데이터를 판정할 수 없어 자동으로 닫았습니다.
작업 유형이 없거나 허용된 값이 아닙니다.주 담당 모듈이 없거나 허용된 값이 아닙니다.이슈 등록 양식에 맞게 본문을 보완한 뒤 다시 열어 주세요.
github-actions commentedon Sep 27, 2026
이 이슈를 맡은 PR 은 #2173 다 (base
refactor/1429-setting-repositories).base 가 기본 브랜치(
develop)가 아니라서 GitHub 은 이 이슈의 Development 칸에아무것도 표시하지 않는다. 본문에
Closes #N이 있어도 마찬가지다 — 그 링크는 기본 브랜치를target 하는 PR 에서만 만들어진다.
PR 이 닫히거나 머지되면 이 이슈의
pr-open라벨은 다음 리컨사일에서 떨어진다.