-
[iOS] SwiftUI, TCA 모듈화 그리고 RIBs스위프트 2024. 5. 5. 00:34
개요
최근에 SwiftUI와 TCA 조합으로 개인 프로젝트를 진행하고 있습니다.
사내 새로운 서비스도 TCA를 사용할 것 같은데 아마 설계까지 해야 할 것 같습니다.
그런데 TCA로 제대로된 모듈화가 너무 어렵더라고요..
이에 대한 트러블 슈팅과 생각 정리를 좀 해봤습니다.
🚨 TCA에 대해 깊게 알고 작성한 글이 아니므로 잘 걸러서 들어주세요! 🚨
다른 좋은 방법이 있다면 말씀해 주시면 조언 부탁드리겠습니다. 🙇🏻🙇🏻♂️🙇🏻🙇🏻♂️
SwiftUI, 모듈화가 어려운 이유
SwiftUI의 장점은 너무 많습니다.
일단 선언형이라 직관적이며 UIKit에 비해 적은 코드로 UI를 그릴 수 있고 등등... 아주 많습니다.
그러나 제 생각에는 단점도 꽤나 치명적입니다. 바로 View에서 내비게이션(라우팅)을 관장합니다.
물론 View를 Builder 패턴으로 주입하는 것도 가능은 하겠으나 결국 Builder가 반환하는 View의 구체 타입을 알아야 합니다.
왜냐하면 View의 body 내부에는 'any View'가 들어갈 수 없기 때문입니다.
Body 내부에 구체 타입 주세요 이렇게 되면 결국 View는 다른 모듈의 구체 타입인 View를 알고 있게 됩니다.
즉 모듈끼리 강한 연결이 된다는 의미입니다.
이는 결국 반쪽짜리 모듈화가 된다는 의미기도 합니다.
TCA 모듈화
TCA도 똑같습니다.
Reducer에서 다른 Reducer의 State, Action을 알아야 합니다.
결국 연결될 수밖에 없습니다.
Reducer에서 ifLet, Path 등을 활용하여 다른 Reducer와 연결이 됩니다.
해결 방법 (시도만 함)
https://github.com/hogumachu/RIBs-TCA
GitHub - hogumachu/RIBs-TCA: Combination of RIBs and TCA.
Combination of RIBs and TCA. Contribute to hogumachu/RIBs-TCA development by creating an account on GitHub.
github.com
역시 익숙한 것이 좋습니다.
자주 사용했던 RIBs를 통해 시도했습니다.
위에 있던 문제는 사실 UIKit의 계층 구조를 따르면 쉽게 해결됩니다.
(자세한 내용은 해당 링크를 확인해 주세요)
장점
- SwiftUI의 UI 그리는 방식 사용 가능
- TCA의 좋은 기능 (@Dependency, 단방향 데이터 흐름 기타 등등) 사용 가능
- 내비게이션 로직 분리
RIBs에서 View 영역을 SwiftUI로 대체했으며 Interactor 내부의 동작을 TCA의 Reducer와 합친 것입니다.
개인적으로 생각했던 SwiftUI의 장점인 선언형과 빠른 UI 구성을 활용할 수 있습니다.
그리고 단점이라 생각한 View에서의 내비게이션도 제거하였습니다.
단점
- TCA의 좋은 기능을 사용하지 못함 (내비게이션)
- 러닝커브 2배 (RIBs, TCA)
- 불필요한 RxSwift에 대한 의존성 (RIBs는 RxSwift 의존성이 있음, ModernRIBs를 사용하면 해결되긴 함)
결론
다른 좋은 해결 방법이 있을 것 같은데 SwiftUI와 TCA에 대한 이해도가 낮아 다른 방식으로 풀어봤습니다.
기존에 RIBs를 사용했다면 부분적으로 SwiftUI (굳이 TCA가 없어도)를 추가하여 해결해도 좋을 것 같습니다.
그리고 RIBs를 아키텍처로 알고 있었는데 프레임워크라고 하더라고요 ㅋㅋ..
결국 RIBs로 프레임워크를 구성하고 내부의 아키텍처를 TCA로 하는 거라 어울리는 것 같기도 합니다.
3줄 요약
SwiftUI는 View에서 내비게이션 역할을 하기 때문에 인터페이스/구현체 구조의 모듈화가 어렵다.
UIKit의 View 계층 구조를 활용하면 이를 해결할 수 있다.
RIBs+TCA로 시도해 봤는데 잘 되었다.
'스위프트' 카테고리의 다른 글
[iOS] ViewController 테스트 작성하기 (1) 2024.01.28 [iOS] 테스트를 작성해야 하는 이유 (0) 2024.01.21 [iOS] 모듈화를 해야 하는 이유 (0) 2024.01.14 [iOS] ViewController Life Cycle (+ ViewIsAppearing) (0) 2023.09.02 [iOS] RxSwift를 이용하여 키보드 컨트롤하기 (NotificationCenter) (0) 2023.08.22