IT

TCA (Composable Architecture) 개념 정리 (Swift / iOS)

초코모찌롤 2026. 3. 15. 13:12
반응형

 

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) 관련 글

반응형