iOS 앱이 커질수록 상태 관리와 화면 흐름 관리가 점점 복잡해진다. 특히 여러 화면이 서로 데이터를 공유하거나, 비동기 작업과 네비게이션이 섞이기 시작하면 코드 구조가 빠르게 복잡해질 수 있다.
이 문제를 해결하기 위해 등장한 아키텍처 중 하나가 TCA (The Composable Architecture)이다.
TCA는 상태(State), 액션(Action), 리듀서(Reducer)를 중심으로 앱의 로직을 명확하게 분리하고, 테스트 가능하며 확장 가능한 구조를 만드는 것을 목표로 한다.
TCA란 무엇인가
TCA는 Point-Free에서 만든 Swift 기반 아키텍처 라이브러리이다.
앱의 상태 관리와 비즈니스 로직을 예측 가능하고 테스트 가능한 방식으로 구성하도록 도와준다.
TCA의 핵심 특징은 다음과 같다.
- 단일 상태 관리
- 명확한 데이터 흐름
- 테스트 가능한 구조
- Composable 구조
TCA의 핵심 구성 요소
TCA는 다음 네 가지 요소로 구성된다.
- State
- Action
- Reducer
- Store
각 요소는 앱의 로직을 명확하게 분리하는 역할을 한다.
State
State는 화면에서 필요한 모든 데이터를 저장하는 구조체이다.
struct CounterState {
var count: Int = 0
}
UI에서 사용하는 데이터는 모두 State 안에 정의된다.
Action
Action은 사용자 이벤트나 시스템 이벤트를 표현한다.
enum CounterAction {
case incrementButtonTapped
case decrementButtonTapped
}
버튼 클릭, API 응답, 화면 이동 등 앱에서 발생하는 이벤트는 모두 Action으로 표현한다.
Reducer
Reducer는 Action을 받아 State를 변경하는 역할을 한다.
import ComposableArchitecture
let counterReducer = Reducer<CounterState, CounterAction, Void> { state, action, _ in
switch action {
case .incrementButtonTapped:
state.count += 1
return .none
case .decrementButtonTapped:
state.count -= 1
return .none
}
}
Reducer는 앱의 비즈니스 로직이 들어가는 핵심 부분이다.
Store
Store는 State와 Reducer를 연결하는 역할을 한다.
let store = Store(
initialState: CounterState(),
reducer: counterReducer,
environment: ()
)
Store는 화면에서 상태를 읽고 액션을 보내는 중심 객체이다.
SwiftUI에서 TCA 사용하기
SwiftUI에서는 Store를 View에 전달하여 상태를 관리한다.
struct CounterView: View {
let store: Store<CounterState, CounterAction>
var body: some View {
WithViewStore(self.store) { viewStore in
VStack {
Text("\(viewStore.count)")
.font(.largeTitle)
HStack {
Button("-") {
viewStore.send(.decrementButtonTapped)
}
Button("+") {
viewStore.send(.incrementButtonTapped)
}
}
}
}
}
}
View는 상태를 읽고 Action을 보내는 역할만 담당한다.
TCA의 장점
TCA를 사용하면 다음과 같은 장점이 있다.
- 상태 관리가 명확하다
- 데이터 흐름이 단방향이다
- 테스트 코드 작성이 쉽다
- 모듈화가 가능하다
특히 대규모 프로젝트에서 구조가 안정적이다.
TCA의 단점
하지만 TCA에는 다음과 같은 단점도 있다.
- 초기 학습 비용이 높다
- 코드 양이 많아질 수 있다
- 작은 프로젝트에는 과할 수 있다
그래서 보통 규모가 큰 프로젝트에서 더 많이 사용된다.
실제 프로젝트에서 사용하는 구조
실제 TCA 프로젝트에서는 다음과 같은 폴더 구조를 많이 사용한다.
Feature
├── HomeFeature
│ ├── HomeReducer
│ ├── HomeView
│ └── HomeState
│
├── ProfileFeature
│
└── SettingsFeature
각 화면을 Feature 단위로 나누어 관리하는 방식이 일반적이다.
TCA에서 자주 사용하는 기능
최근 TCA에서는 다음 기능들이 많이 사용된다.
- @Reducer
- @ObservableState
- StackState
- NavigationStackStore
- Dependency
이 기능들을 활용하면 SwiftUI와 자연스럽게 통합할 수 있다.
언제 TCA를 사용하면 좋을까
TCA는 다음과 같은 상황에서 특히 효과적이다.
- 대규모 앱
- 상태 관리가 복잡한 앱
- 테스트가 중요한 프로젝트
- 모듈화가 필요한 프로젝트
특히 SwiftUI와 함께 사용할 때 강력한 구조를 만들 수 있다.
정리
- TCA는 상태 기반 아키텍처이다.
- State, Action, Reducer, Store 네 가지 요소로 구성된다.
- 단방향 데이터 흐름을 기반으로 동작한다.
- 대규모 SwiftUI 프로젝트에서 많이 사용된다.
TCA (Composable Architecture) 관련 글
- TCA (Composable Architecture) 개념 정리 (Swift / iOS)
- TCA Feature 모듈 구조 설계 방법 (SwiftUI / Composable Architecture)
- TCA Reducer 구조 설계 방법 (SwiftUI / Composable Architecture)
- TCA Store scope 사용 방법 (SwiftUI / Composable Architecture)
- TCA Dependency 사용 방법 (SwiftUI / Composable Architecture)
- TCA Async / Effect 사용 방법 (SwiftUI / Composable Architecture)
- TCA BindingAction 사용 방법 (SwiftUI / Composable Architecture)
- TCA 테스트 코드 작성 방법 (SwiftUI / Composable Architecture)
- TCA NavigationStack 구조 구현 방법 (SwiftUI / Composable Architecture)
- TCA StackState 사용 방법 정리 (SwiftUI / Composable Architecture)
- TCA NavigationStackStore 사용 방법 (SwiftUI / Composable Architecture)
- TCA Delegate 패턴 화면 이동 구현 방법 (SwiftUI / Composable Architecture)
- TCA TabView 구조 설계 방법 (SwiftUI / Composable Architecture)
- TCA Optional State Navigation 패턴 정리 (SwiftUI / Composable Architecture)
'IT' 카테고리의 다른 글
| TCA StackState 사용 방법 정리 (SwiftUI / Composable Architecture) (0) | 2026.03.15 |
|---|---|
| TCA NavigationStack 구조 구현 방법 (SwiftUI / Composable Architecture) (0) | 2026.03.15 |
| UIButton Gradient Border 구현 방법 (iOS / UIKit) (0) | 2026.03.14 |
| UIButton Shadow 적용 방법 (iOS / UIKit) (0) | 2026.03.14 |
| UIButton Configuration 사용 방법 정리 (iOS 15+) (0) | 2026.03.14 |