
안녕하세요 !
이번에는 TCA 구조라는 주제로 포스팅 하려합니다
우리는 TCA의 핵심 구성 요소인 State, Action, Environment, Reducer, Store에 대해 살펴보고, 이들이 어떻게 상호작용하는지 자세히 알아보도록 할게요~~
struct AppState {
var counter: Int
var isLoading: Bool
}
이 State는 카운터의 현재 값과 로딩 상태를 포함하는데요 State는 애플리케이션의 모든 변경 가능한 데이터를 담당한다고 생각하시면 되요!
enum AppAction {
case incrementCounter
case decrementCounter
case setLoading(Bool)
}
Action은 카운터를 증가시키거나 감소시키는 동작, 그리고 로딩 상태를 설정하는 동작을 의미하는데요 음 간단하게 Action한테 명령을 내리면 Action을 통해서 State값을 변경 시키는거라고 생각하면 될 것 같아요
struct AppEnvironment {
var mainQueue: AnySchedulerOf<DispatchQueue>
var uuid: () -> UUID
}
이 Environment는 메인 큐에서 작업을 실행하기 위한 스케줄러와 UUID를 생성하는 함수를 포함하고 이를 통해 테스트 시 의존성을 쉽게 대체할 수 있습니다
let appReducer = Reducer<AppState, AppAction, AppEnvironment> { state, action, environment in
switch action {
case .incrementCounter:
state.counter += 1
return .none
case .decrementCounter:
state.counter -= 1
return .none
case .setLoading(let isLoading):
state.isLoading = isLoading
return .none
}
}
이 Reducer는 각 Action에 대해 State를 어떻게 변경할지 정의합니다
let store = Store(
initialState: AppState(counter: 0, isLoading: false),
reducer: appReducer,
environment: AppEnvironment(
mainQueue: DispatchQueue.main.eraseToAnyScheduler(),
uuid: UUID.init
)
)
Store는 초기 State, Reducer, Environment를 받아 생성되고 이는 SwiftUI 뷰와 Reducer 사이의 중개자 역할을 합니다.
TCA의 이러한 구조는 상태 변화를 예측 가능하게 만들고, 비즈니스 로직을 테스트하기 쉽게 만들어요
또한, 각 기능들을 작은 단위로 나누고 재조합할 수 있어 코드의 재사용성과 유지보수성을 높여줘요
저가 개발하면서 느낀거지만 SwiftUI는 앱의 규모가 커질수록 관리하기가 어려지고 가독성이 많이 떨어져 TCA와 같은 단방향 구조는 SwfitUI와 정말 어울리는 프레임워크라는걸 많이 느꼈습니다 ㅜㅜㅜㅜ
여러분도 공부 열심히 하셔서 나중에 SwiftUI로 개발할 때 아무 무리없이 잘 적용할 수 있기를 바랄게요 ㅎㅎ
이상으로 포스팅 마무리 하겠습니다.
.
.
.
감사합니다.