Case 01 · 단방향
토글은 낙관적으로, 예산은 비관적으로
체크리스트는 항목을 자주 켜고 끄는데, 서버 응답을 기다렸다 반영하면 누를 때마다 한 박자씩 늦게 반응합니다. 반대로 예산은 틀린 금액이 잠깐이라도 보이면 안 됩니다.
같은 ReactorKit 단방향 안에서 흐름별로 전략을 나눴습니다. 토글은 UI를 먼저 반영하는 낙관적 업데이트, 예산은 로딩→서버→재조회의 비관적 업데이트.
Action→Mutation→State 규칙은 그대로 두고 mutate의 방출 순서만 바꿉니다. 화면마다 다른 요구를 하나의 아키텍처 규칙 안에서 소화했습니다.
FullCheckListReactor.swift
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()])