[TCA] 02. Store를 알아보자.

2026. 1. 13. 04:37·iOS/TCA
728x90
 

GitHub - pointfreeco/swift-composable-architecture: A library for building applications in a consistent and understandable way,

A library for building applications in a consistent and understandable way, with composition, testing, and ergonomics in mind. - pointfreeco/swift-composable-architecture

github.com

TCA 1.23.1 기준으로 작성합니다.

 

Store?

TCA에서 Store는 앱의 상태를 보관하고 관리하는 핵심 객체이다. Store는 아래와 같은 역할을 한다.

 

1. 현재 상태를 저장하고 유지

2. 액션을 받아서 Reducer를 통해 상태를 업데이트

3. Effect를 실행

4. 상태 변화를 관찰하고 View에 전달

 

Store의 기본 구조

let store = Store(initialState: Feature.State()) {
  Feature()
}

위의 코드 처럼 직접 생성해서 사용할 수도 있지만, Store를 직접 생성하기보다는 타입으로만 선언하는 경우가 더 많다. 

struct MyView: View {
  let store: StoreOf<Feature>
  
  var body: some View {
  ...
  }
}

Store는 보통 부모가 생성해서 자식에게 전달한다. View는 Store를 받아서 사용만 하지, 직접 만들진 않는다. 실제 Store 생성은 앱의 최상위나 부모 Feature에서만 일어난다. 

 

왜?

여러 이유가 있지만, 상태 공유와 일관성의 이유가 가장 크다. View마다 Store를 계속 생성하면 매번 새로운 State가 생성되기 때문에 상태가 공유되지 않는다. 부모가 Store를 만들고 부모로부터 Store를 공유 받으면 자식들이 같은 상태를 공유하기 때문에 상태의 일관성을 유지할 수 있다.

 

StoreOf

typealias StoreOf<R> = Store<R.State, R.Action> where R : Reducer
A convenience type alias for referring to a store of a given reducer’s domain.
특정 리듀서의 domain 저장소를 참조하는 typealias

Store 선언을 간단하게 만들어주는 typealias이다. 

 

let store: StoreOf<Feature>

위 코드처럼 간편하게 store를 선언할 수 있다.

 

ViewStore와 WithViewStore는 뭐야?

 

Documentation

 

pointfreeco.github.io

 

TCA 튜토리얼이나 예제를 찾아보면 ViewStore와 WithViewStore를 쓰는 예제가 많은데, TCA가 업데이트 되면서 둘 다 deprecated 되었다. 그래도 간단히 이해해 두면, 레거시 코드나 예제를 읽을 때 도움 되니 알아보자.

 

01
Deprecated :(


ViewStore
 : View에서 실제로 상태를 읽고 액션을 보내는 객체

WithViewStore : Store를 ViewStore로 변환하는 래퍼

 

ViewStore는 Store의 상태를 관찰 가능한 형태로 변환하여, View에서 상태를 읽고 액션을 보낼 수 있는 인터페이스를 제공한다. ViewStore를 사용하기 위해서는 WithViewStore라는 래퍼를 통해 Store를 ViewStore 변환해서 사용한다. 아래 코드를 참고하자.

var body: some View {
  WithViewStore(self.store, observe: { $0 }) { viewStore in
    VStack {
      Text("Current count: \(viewStore.count)")
      Button("Increment") { viewStore.send(.incrementButtonTapped) }
    }
  }
}

 

ViewStore는 성능 최적화에도 유리하다. observe 클로저를 통해 선택적으로 상태를 관찰할 수 있는데, 전체 상태를 관찰하는 대신 필요한 부분만 선택해서 관찰할 수 있다. 예를 들어 observe: \.count로 작성하면, count 필드만 변경될 때만 View가 리렌더링되어 성능 최적화에 유리하다. 

 

TCA가 업데이트 되면서 Deprecated되었는데, 이유 중 하나는 불필요한 보일러플레이트 코드이다. WithViewStore 래퍼로 감싸고 클로저를 작성하는 것은 코드가 길어지게 되기 때문이다. 가장 결정적인 이유는 iOS 17부터 도입된 SwiftUI의 @Observable 매크로는 자동으로 의존성을 추적하고 필요한 부분만 업데이트하여, ViewStore가 제공하던 성능 최적화를 더 간단하고 효율적으로 달성할 수 있게 되었다. 

 

let store: StoreOf<CountFeature>

var body: some View {
  VStack {
    Text("Current count: \(store.count)")
    Button("Increment") { store.send(.incrementButtonTapped) }
  }
}

지금은 Store에 직접 접근하여 사용한다. 

 

 

'iOS > TCA' 카테고리의 다른 글

[TCA] 04. TCA의 네비게이션 방식에 대해 알아보자.  (0) 2026.01.19
[TCA] 03. TCA의 바인딩 방식을 알아보자.  (0) 2026.01.13
[TCA] 1. The Composable Architecture ?  (0) 2025.10.17
'iOS/TCA' 카테고리의 다른 글
  • [TCA] 04. TCA의 네비게이션 방식에 대해 알아보자.
  • [TCA] 03. TCA의 바인딩 방식을 알아보자.
  • [TCA] 1. The Composable Architecture ?
여성일
여성일
  • 여성일
    성일노트
    여성일
  • 전체
    오늘
    어제
    • 분류 전체보기 N
      • 탭탭 - TapTap N
        • 리팩토링 N
        • 트러블슈팅
        • 개발일지
      • 애플 디벨로퍼 아카데미
        • 챌린지 회고
        • 하루의 날씨
      • Swift Student Challenge 202..
      • AI를 잘쓰는 개발자가 될래요
      • 우리 같이 협업하자
      • ToyProject - 사카마카 (살까말까 고민 ..
      • ToyProject - Book2OnNon (모바..
      • ToyProject - 바꿔조 (환율 계산기)
      • iOS N
        • iOS N
        • Vapor
        • Design Pattern
        • CoreData
        • Tuist
        • RxSwift
        • ReactorKit
        • TCA N
      • Swift
        • Swift 기본기
        • UIkit
        • SwiftUI
      • 원티드 프리온보딩 챌린지 iOS 과정
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.6
    여성일
    [TCA] 02. Store를 알아보자.
    상단으로

    티스토리툴바