설계 01 · 단방향
토글은 낙관적으로, 예산은 비관적으로
체크리스트는 토글이 잦아 서버 응답을 기다리면 조작감이 죽습니다. 반대로 예산 수정은 틀린 값이 잠깐이라도 보이면 안 됩니다.
같은 ReactorKit 단방향 안에서 흐름별로 전략을 나눴습니다. 토글은 UI 반영을 먼저 방출하고 서버 반영을 뒤에 잇는 낙관적 concat, 예산은 로딩→서버→재조회의 비관적 순서.
Action→Mutation→State 규칙은 그대로 두고 mutate의 방출 순서만 바꿉니다. 화면마다 다른 요구를 하나의 아키텍처 규칙 안에서 소화했습니다.
case let .toggleCheckListItem(id, isCompleted): // 1) UI 먼저: 목록이 즉시 반응 let uiUpdate = Observable.just( Mutation.updateItem(id, isCompleted)) // 2) 서버 반영은 뒤에 let domainUpdate = useCase .updateCompletion(id, isCompleted) return .concat([uiUpdate, domainUpdate]) // 예산 수정은 반대: 로딩 → 서버 → 재조회 return .concat([setLoading(true), update, refetch()])