티스토리 뷰
TripStyle에서는 TabBarController에서 3개의 탭을 관리하고 있고, 로그인 플로우까지 총 4개의 화면들이 이어진다.
탭바 아이템을 클릭했을 때 각각의 모듈의 시작점이 호출되는데, Coordinator 패턴을 통해서 이를 관리하는게 좋을 것 같다고 생각했다.
모듈간 의존성을 살펴보면 App (SceneDelegate, AppDelegate) -> Feature (ViewController, ViewModel을 가지고 있는 모듈)
이런 방향으로 되어 있는데, 고민해야 할 부분이 각 화면들의 Coordinator의 적합한 위치와 TabBarCoordinator, AppCoordinator, Coordinator Protocol 들에 대한 위치이다.
TabBarCoordinator, AppCoordinator는 모든 Feature들을 알아야한다.
그렇게 되면 App -> (?) -> Feature 와 같은 모듈이 중간에 하나 더 있어야 한다.
그렇게 된다면 App 모듈의 SceneDeleagate에서 (?)에 있는 AppCoordinator 혹은 TabBarCoordinator를 호출하여 앱의 Entry를 지정할 수 있게 된다.
그렇다면 Feature 모듈에 있는 (FeedCoordinator, LoginCoordinator, MyPageCoordinator, ..) 것들은 어떻게 구현해야할까?
현재 모듈 간 의존성을 보면 App -> (TabBarCoordinator, AppCoordinator) -> Feature 의 순으로 되어 있다.
모든 Coordinator들이 채택해서 사용할 수 있는 Protocol이 저 모듈 어딘가에 존재해야한다.
조건은 Feature에서 사용시, 해당 모듈의 기능을 사용할 수 있게끔 하는 것이 핵심인데, 그럼 Feature에 존재하거나 혹은 Feature 하위 모듈에 존재하면 된다.
그렇다면 App -> (AppCoordinator, TabBarCoordinator) -> Feature -> (Coordinator, CoordinatorFinish) 과 같은 모듈간 의존성을 가지면 된다.
먼저 TabBarCoordinator를 살펴보면
private func connectTabCoordinator(of page: TabBarItem, to tabNavigationController: UINavigationController) {
switch page {
case .feed:
let coordinator = DefaultFeedCoordinator(tabNavigationController)
coordinator.finishDelegate = self
self.childCoordinators.append(coordinator)
coordinator.start()
case .myPage:
let coordinator = DefaultMyPageCoordinator(tabNavigationController)
coordinator.finishDelegate = self
self.childCoordinators.append(coordinator)
coordinator.start()
}
}
TabBarItem을 클릭했을 때, 해당 Item의 Coordinator를 호출해야한다.
다음은 AppCoordinator의 코드를 살펴보면
public func start() {
showTabBarFlow()
}
public func showLoginFlow() {
let loginCoordinator = DefaultLoginCoordinator(self.navigationController)
loginCoordinator.finishDelegate = self
loginCoordinator.start()
childCoordinators.append(loginCoordinator)
}
public func showTabBarFlow() {
let tabBarCoordinator = DefaultTabBarCoordinator(self.navigationController)
tabBarCoordinator.finishDelegate = self
tabBarCoordinator.start()
childCoordinators.append(tabBarCoordinator)
}
AppCoordinator에서는 TabBarCoordinator와 LoginCoordinator를 알아야한다. (자동로그인 기능)
이런 모듈간 의존성을 가지게 구현한다면 Coordinator 패턴을 tuist에 적용할 수 있다..!
'[Project] TripStyle' 카테고리의 다른 글
[iOS/Swift] TripStyle 개발 일지 01 (Tuist) (2) | 2023.11.22 |
---|