You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
refactor(setting): 남은 이벤트 스트림 2곳을 UiState·MVI로 전환하고 재유입을 막는다 #1502
ReceiverRegisterViewModel / ReceiverRegisterScreen은 완료 조건에서 뺐다. 교체 대상 receiver-register-post로 #944 전환이 가져간다(PM 폼 값·이메일 등록 버튼 결정 대기). 그때까지 기존 _events 선언은 Konsist 가드의 기준선으로만 인정한다.
2026-09-27 develop 6e7e08a 기준 PushNotificationViewModel은 ViewModel과 MutableStateFlow·MutableSharedFlow를 사용한다. #2033에서 옮긴 app 알림 권한 ViewModel과 별개이므로 이 대상은 아직 남는다.
구현 계약:
MviViewModel<Intent, UiState, ReducerEvent>를 상속하고 공개 입력을 onIntent로 모은다.
비동기 결과는 dispatch로 전달하며 상태 전이는 순수 reduce에서만 수행한다.
UI 신호는 nullable UiState 필드에 두고 ObserveSignal 및 Consume Intent로 소비한다. 늦은 소비가 더 새로운 다른 신호를 지우지 않게 한다.
MVI 전환(#1811)과 방향이 충돌해 blocked_by #1800 을 걸었습니다. 착수 전에 판정이 필요합니다.
이 이슈는 #228 을 근거로 «ViewModel 이벤트를 Channel 로 쏘지 않고 UI state 에 흡수» 하고, 재유입을 konsist 로 막자고 합니다. 그런데 #1800 이 도입하려는 MviViewModel 베이스는 Channel<MviEffect> 를 일회성 이벤트의 정본으로 삼습니다.
privateval_effect=Channel<F>(Channel.BUFFERED)
val effect:Flow<F> =_effect.receiveAsFlow()
지금 순서대로 하면 이렇게 됩니다.
setting 의 Channel 5곳을 UI state 흡수로 고친다
konsist 로 «presentation ViewModel 은 Channel 금지» 를 못박는다
일회성 신호는 이 이슈가 정리하는 대로 UiState 의 nullable 필드에 두고(#228 규약, AfternoteDetailUiState.Success.deleteResult 선례), 소비만 Intent.ConsumeXxx 로 들어옵니다. onXxxConsumed() 를 public fun 으로 따로 노출하지 않는다는 것만 달라집니다.
이 이슈의 작업 5건은 그대로 유효하고, 오히려 먼저 끝나 있는 편이 #1805 전환이 쉽습니다. konsist 규칙도 그대로 세우시면 됩니다 — MVI 베이스는 Channel 을 쓰지 않으므로 걸리지 않습니다. 다만 #1801 이 세울 「MviViewModel 상속체는 MutableStateFlow·Channel 을 선언하지 않는다」 규칙과 겹치므로, 두 규칙은 하나로 합치는 편이 낫습니다 — 따로 두면 나중에 서로를 덮습니다.
changed the title [-]refactor(setting): ViewModel 이벤트 Channel 5곳이 UI state 흡수 규약(#228) 밖에 남아 있다 — 재유입 차단 규칙 포함[/-][+]refactor(setting): 이벤트 스트림 6곳을 UiState·MVI로 전환하고 재유입을 막는다[/+]on Sep 8, 2026
Activity
OnlyReadOneBook commentedon Sep 3, 2026
MVI 전환(#1811)과 방향이 충돌해
blocked_by #1800을 걸었습니다. 착수 전에 판정이 필요합니다.이 이슈는 #228 을 근거로 «ViewModel 이벤트를
Channel로 쏘지 않고 UI state 에 흡수» 하고, 재유입을 konsist 로 막자고 합니다. 그런데 #1800 이 도입하려는MviViewModel베이스는Channel<MviEffect>를 일회성 이벤트의 정본으로 삼습니다.지금 순서대로 하면 이렇게 됩니다.
Channel5곳을 UI state 흡수로 고친다Channel금지» 를 못박는다Channel(effect)로 되돌린다MviViewModel상속체를 전부 막는다두 규약이 같은 문제(구성 변경·프로세스 사망 중 이벤트 유실)를 다른 방식으로 풉니다. 어느 쪽을 정본으로 삼을지는 #1800 이 착수 조건으로 판정합니다 — 그 이슈 본문에 판정 항목과 두 선택지의 귀결을 실어 뒀습니다.
MviViewModel에서effect채널을 빼고 일회성 이벤트를UiState필드로 모델링합니다. 이 이슈의 마이그레이션 5건은 그대로 유효합니다.Channel금지» 가 아니라 «MviViewModel밖에서 직접Channel선언 금지» 로 바뀝니다.어느 쪽이든 #1800 판정 전에 이 이슈를 진행하면 산출물이 재작성됩니다.
OnlyReadOneBook commentedon Sep 3, 2026
앞 코멘트를 정정합니다. 충돌이 아닙니다 —
blocked_by #1800을 해제하고, 반대로 #1805(setting MVI 전환)가 이 이슈를 기다리도록 걸었습니다.MVI 가 요구하는 것은 「일회성 효과를 상태 전이에서 분리한다」까지고, 그것을
Channel로 나르는 것은 RuleUp 구현의 선택이지 아키텍처 계약이 아닙니다. 전달 수단은 이 레포 규약을 따르면 됩니다.그래서 #1800 의 베이스에서
MviEffect타입 파라미터를 뺐습니다 — 4타입이 아니라 3타입입니다.일회성 신호는 이 이슈가 정리하는 대로
UiState의 nullable 필드에 두고(#228 규약,AfternoteDetailUiState.Success.deleteResult선례), 소비만Intent.ConsumeXxx로 들어옵니다.onXxxConsumed()를 public fun 으로 따로 노출하지 않는다는 것만 달라집니다.이 이슈의 작업 5건은 그대로 유효하고, 오히려 먼저 끝나 있는 편이 #1805 전환이 쉽습니다. konsist 규칙도 그대로 세우시면 됩니다 — MVI 베이스는
Channel을 쓰지 않으므로 걸리지 않습니다. 다만 #1801 이 세울 「MviViewModel상속체는MutableStateFlow·Channel을 선언하지 않는다」 규칙과 겹치므로, 두 규칙은 하나로 합치는 편이 낫습니다 — 따로 두면 나중에 서로를 덮습니다.[-]refactor(setting): ViewModel 이벤트 Channel 5곳이 UI state 흡수 규약(#228) 밖에 남아 있다 — 재유입 차단 규칙 포함[/-][+]refactor(setting): 이벤트 스트림 6곳을 UiState·MVI로 전환하고 재유입을 막는다[/+]12 remaining items
fix(setting): 알림 설정 화면이 멈추면 떠 있던 마케팅 동의 실패 안내도 거둔다 (#1502)
github-actions commentedon Sep 28, 2026
이 이슈를 맡은 PR 은 #2211 다 (base
refactor/963-current-push-save-reporting).base 가 기본 브랜치(
develop)가 아니라서 GitHub 은 이 이슈의 Development 칸에아무것도 표시하지 않는다. 본문에
Closes #N이 있어도 마찬가지다 — 그 링크는 기본 브랜치를target 하는 PR 에서만 만들어진다.
PR 이 닫히거나 머지되면 이 이슈의
pr-open라벨은 다음 리컨사일에서 떨어진다.chore(setting): propagate current setting parent (#1502)
test(setting): propagate save error viewport check (#1502)
refactor(setting): 연결 계정·알림 설정의 이벤트 스트림을 MVI 상태 신호로 바꾸고 재유입을 막는다 (#1502)
fix(setting): 알림 설정 화면이 멈추면 떠 있던 마케팅 동의 실패 안내도 거둔다 (#1502)
refactor(setting): 연결 계정·알림 설정의 이벤트 스트림을 MVI 상태 신호로 바꾸고 재유입을 막는다 (#1502)
fix(setting): 알림 설정 화면이 멈추면 떠 있던 마케팅 동의 실패 안내도 거둔다 (#1502)
refactor(setting): 연결 계정·알림 설정의 이벤트 스트림을 MVI 상태 신호로 바꾸고 재유입을 막는다 (#1502)
fix(setting): 알림 설정 화면이 멈추면 떠 있던 마케팅 동의 실패 안내도 거둔다 (#1502)