애플 생태계 개발은 주로 Swift로 많이 작성됩니다.
이렇게 작성된 코드들의 관리 방법또한 중요합니다. 3일뒤, 3주뒤, 3달뒤에 코드를 돌아볼 때 어느 파일에 어느 코드가 있을지 알아야 유지보수에 용이하기 때문입니다.
코드를 정리하고 구현하는데에는 일정한 규칙이 있습니다.
정형화된 하나의 규칙을 제안하는것 = '디자인 패턴(Design Pattern)'
정리된 코드들을 더 추상화된 비즈니스적 문제 해결 관점으로 정리하는것 = '아키텍처 패턴(Architecture Pattern)'
여기선 상태관리 및 의존성 라이브러리인 The Composable Architecture를 활용한 아키텍쳐 패턴에 대해 정리합니다.
기존의 패턴
Swift, SwiftUI로 선언형 UI를 구현하는 환경에서는 MVVM패턴이 많이 채택되어 왔습니다.
그 외 Ribs, Viper, MVP, Clean 등이 주로 사용됩니다.
대표적으로 Robert C. Martin(Uncle Bob)의 Clean Architecture도 있습니다.
MVC에서 View의 로직을 처리하는 책임은 Controller에 있습니다. 이는 ViewModel의 형태로 변화했고 이는 MVVM으로 발전했습니다.
SwiftUI에서 MVVM 아키텍처를 사용해야한다는 주장은 점점 줄었습니다. 그 근거는 다음과 같습니다.
ViewModel 객체의 존재 이유였던 State-Binding이 SwiftUI의 선언형 UI에 이미 반영되어있습니다.
SwiftUI의 View가 이미 View+ViewModel의 기능을 갖고있습니다.
ViewModel가 존재 이유를 잃고있다는 내용입니다.
MVVM
View <---> ViewModel <--> Model
Binding
class ViewController {
override func viewDidLoad() {
viewModel.username
.bind(to: label.rx.text)
.disposed(by: disposeBag)
}
}
SwiftUI
SwiftUI.View <--> Model Binding
이러한 배경에서 TCA가 등장했습니다.
TCA를 SwiftUI에서 사용해야한다는 내용도 아닙니다.
TCA는 SwiftUI에 의존적이고 러닝커브도 높습니다.
하지만 MVVM의 장점을 대부분 가져오면서 조금 더 특별한 이점이 있다고 합니다.
⭐️ TCA의 특별한 장점
1. 값타입에 기반한 안정적인 State의 변형
2. 유저 행동에 대한 로직을 처리하는 Action과 Effect의 일관성
3. 객체간 결합과 분리의 유용성
4. 비교적 편리한 테스트
사전지식이 필요합니다.
1. Swift의 타입에대한 이해(값, 참조)
https://clamp-coding.tistory.com/360
2. SwiftUI의 이해(@State, @Published, @Observable)등등
https://clamp-coding.tistory.com/512
3. inout 키워드의 이해
4. keyPath의 이해
https://clamp-coding.tistory.com/391
* 참고하면 좋은 글
https://gist.github.com/unnnyong/439555659aa04bbbf78b2fcae9de7661
https://www.linkedin.com/pulse/architectural-pattern-vs-design-praveen-kumar-kushwaha/
앞으로의 TCA 포스팅은 해당 책을 참고하여 공부하고 학습한 뒤 정리된 글입니다.
- https://axiomatic-fuschia-666.notion.site/Chapter-1-Hello-TCA-70c56437681547d4b85cd1363a157356
- https://gist.github.com/pilgwon/ea05e2207ab68bdd1f49dff97b293b17