INEEDACHACHA

TCA with SwiftUI (The Composable Architecture) 본문

iOS

TCA with SwiftUI (The Composable Architecture)

INEEDACHACHA 2024. 8. 1. 21:50

TCA

  • TCA(Composable Architecture)는 구성, 테스트 및 인체공학을 염두에 두고 일관되고 이해하기 쉬운 방식으로 애플리케이션을 구축하기 위한 라이브러리이다
  • SwiftUI, UIKit 등에 사용할 수 있으며 모든 애플 플랫폼(iOS, macOS, visionOS, tvOS, watchOS)에서 사용할 수 있다
  • 링크
    https://github.com/pointfreeco/swift-composable-architecture?tab=readme-ov-file

Composable Architecture

  • Composable Archituecture는 용 프로그램을 구축하는 데 사용할 수 있는 몇 가지 핵심 도구를 제공한다
  • SwiftUI를 사용할 때 직면하는 불규칙한 문제들을 해결할 수 있는 방법들을 제공한다

상태 관리

  • 간단한 값 유형을 사용하여 프로그램의 State를 관리하고, 이 State가 변하면 화면이 변하거나 다른 화면에서도 관찰할 수 있도록 한다

구성

  • 큰 기능을 작은 구성 요소로 나누어 분리된 자체 모듈로 추출하고 쉽게 접착하여 기능을 형성한다.
  • Dependency로 추출해서 매우 쉽게 접착해서 쓸 수 있다

사이드 이팩트

  • 응용 프로그램의 특정 부분이 가능한 한 가장 테스트 가능하고 이해하기 쉬운 방법으로 외부 세계와 대화하도록 하는 방법

테스트

  • 아키텍처에 구축된 기능을 테스트할 뿐만 아니라 여러 부분으로 구성된 기능에 대한 통합 테스트를 작성하고 부작용이 애플리케이션에 어떤 영향을 미치는지 파악하기 위해 엔드투엔드 테스트를 작성하는 방법이다
  • 상기를 통해 비즈니스 로직이 기대하는 방식으로 실행되고 있음을 강력하게 보장할 수 있다

TCA 구성

  • Composable Architecture를 사용하여 기능을 구축하려면 도메인을 모델링하는 몇 가지 타입과 값을 정의해야 한다
  • State: function이 Logic을 수행하고 UI를 랜더링하는 데 필요한 데이터를 보여주는 유형이다
    • State에 있는 데이터가 바뀌면 화면이 새로 랜더링 된다
  • Action: 기능적으로 발생할 수 있는 모든 작업을 나타내는 타입이다
    • Ex) buttonTapped, requestProfile 등
  • Reducer: 앱의 현재 상태를 액션이 동작했을 때 다음 상태로 변화시키는 기능을 나타낸다. 리듀서는 .run 등과 같은 effect 값을 return 하면서 수행할 수 있는 모든 Effect를 return할 책임이 있다
  • Store: 스토어가 리듀서와 이팩트를 실행할 수 있도록 모든 사용자의 작업을 스토어에 전송하고, 스토어의 상태 변화를 관찰하여 UI를 새로 랜더링한다
  • 상기와 같은 식으로 구성하면 테스트 가능성을 넓히고, 기능을 작게 나누고 또 합성해서 쓸 수 있다는 이점이 있다

TCA 데이터 흐름도

  • TCA에서 가장 중요한 것은 '단방향' 데이터 플로우 아키텍쳐라는 것
  • 데이터의 흐름이 일관되기 때문에 상태 변화를 추적하기가 쉽다
  • State는 Reducer를 통해 업데이트 되고 View에서는 Action을 보내기만 하고 직접 State를 변경하지 않는다

TCA의 고려해야 할 점

  • 기존 SwiftUI의 Property Wrapper들을 사용할 수 없다
  • 라이브러리에서 제공하는 방식대로만 개발해야 한다
  • 러닝 커브가 생각보다 크다
  • 구조적으로 외부 라이브러리에 의존하는 것이 위험한 부분이기도 하다

TCA의 장점

  • 코드의 통일성이 매우 좋음
    • 같은 패턴의 코드와, 논리적 흐름이 비슷하기에 가독성이 좋다
    • 따라서 공동 작업 및 코드리뷰의 효율 증가
  • @State, @Published, @ObsevedObject, @StateObject등 양방향에서 데이터를 변화시키지 않기 때문에 조금 더 테스트에 용이하다.
  • 지속적인 업데이트와 많은 사람들의 사용이 안정성을 보장

개선해야할 부분

  • 거대한 Action
  • 거대한 Feature
    • 작업을 하다보면 한 Tap의 홈 부분은 매우 큰 Feature를 가지게 될 확률이 높다.
    • delegate를 통해 상위로 올린 기능들이 쌓이게 된다.
    • 작은 Feature도 커다란 기능을 가질 수 있다.
    • 개선 방향: 8월에 배포가 되고 난 후 Feature나 Action 자체를 extension으로 파일을 나눌 생각이다.