Coordinator Pattern in MVVM
Coordinator 패턴의 필요성
Coordinator Pattern in MVVM
Coordinator 패턴의 필요성
1. 화면 전환 및 네비게이션 분리
기존에는 ViewController가 다른 ViewController로의 화면 전환 및 네비게이션을 처리하고 있어, SOLID 원칙 중 단일 책임 원칙에 어긋났습니다. Coordinator 패턴을 도입하여 네비게이션 로직을 별도의 Coordinator 객체로 분리함으로써, 화면 전환과 비즈니스 로직을 모듈화하고 단일 책임을 준수할 수 있습니다.
2. 화면 전환 로직의 중앙 집중화
기존에는 화면 전환 코드가 여러 곳에 흩어져 있어 관리 및 유지보수가 어려웠습니다. Coordinator 패턴을 통해 화면 전환 로직을 중앙에서 관리함으로써 일관된 네비게이션 흐름을 제공하고 유지보수성을 향상시킵니다.
3. ViewController의 무거운 역할 분리
ViewController가 비즈니스 로직, 화면 전환, 외부 서비스 연동 등 다양한 역할을 담당하는 문제가 지속되었습니다. Coordinator를 패턴을 도입하여 ViewController의 역할을 화면 표시에 집중시키고, 비즈니스 로직이나 다른 역할은 Coordinator에 위임함으로써 코드의 가독성 및 유지보수성을 향상시킵니다.
MVVM 아키텍처에서 Coordinator 적용 시 기대효과
1. 단일 책임 원칙 준수
Coordinator는 네비게이션 로직에만 집중하고, ViewModel은 비즈니스 로직에 집중함으로써 단일 책임 원칙을 준수하고 각 컴포넌트 간의 의존성을 낮춥니다.
2. 의존성 및 의존성 역전 원칙
Coordinator — ViewController
의존성 역전 원칙 준수
- ViewController는 NavigationController 등에 대한 직접적인 의존성을 피하고, Coordinator를 통해 간접적으로 네비게이션을 처리합니다.
결합도 감소
- ViewController가 Coordinator에 의존하면서 결합도가 낮아져, 확장성이 향상됩니다.
Coordinator — ViewModel
인터페이스 기반 연결
- ViewModel은 Coordinator에 직접 의존하지 않고, 인터페이스를 통해 간접적으로 연결됩니다. 이로써 ViewModel은 자체 비즈니스 로직에만 집중할 수 있습니다.
3. 모듈화
동일한 Coordinator를 여러 ViewModel에서 재사용할 수 있어 코드 재사용성이 높아집니다. Coordinator와 ViewModel 각각을 독립적으로 테스트 가능한 환경을 제공합니다. 역할이 분명히 나뉘어져 있어 코드의 가독성을 높이고, 유지보수성을 강화하여 앱 전체적인 아키텍처를 더욱 효과적으로 관리할 수 있게 됩니다.
기본 구현
Coordinator Protocol
[embed]
AnyObject
- Coordinator 특성상 구조체로도 구현 가능하나, 여러 곳에서 공유되어야 하므로 클래스로 구현
childCoordinators
- 하위 Coordinator 저장
navigationController
- ViewController를 표시하는 NavigationController 저장
start()
- Coordinator가 제어권을 갖게 하는 메서드
- Coordinator를 완전히 생성하고, 준비가 완료될 때만 활성화 가능
BaseCoordinator
[embed]
addChildCoordinator(_ coordinator:)
- 하위 Coordinator를 추가하는 기능
removeChildCoordinator(_ coordinator:)
- 하위 Coordinator를 제거하는 기능
Child Coordinator
여러 개의 Coordinator가 상위 Coordinator에 의존할 수 있습니다. 이를 통해 각 Coordinator는 자신이 관리하는 하위 Coordinator에게 네비게이션 처리를 위임할 수 있습니다. 각 Coordinator는 특정 부분의 네비게이션 로직에만 집중하면서, 다른 Coordinator에 대한 의존성을 최소화하고 모듈화된 독립성을 유지합니다.
MainCoordinator
[embed]
showDetail()
- 하위 Coordinator(DetailCoordinator) 생성
- MainCoordinator와 childCoordinator 간 관계 설정
- 하위 Coordinator(DetailCoordinator) start() 메서드 실행
ChildCoordinator
[embed]
parentCoordinator
- 상위 코디네이터 저장
뒤로가기
1. didDisappear 호출 버전
[embed]
2. UINavigationControllerDelegate 활용
[embed]
UINavigationControllerDelegate
- MainCoordinator가 Navigation과의 상호작용을 직접 가지하기 위해 프로토콜 채택
- 현재는 BaseCoordinator 클래스를 상속하기에 정상 작동하나, 프로토콜만을 이용하여 만들었을시, 프로토콜 채택을 위한 NSObject 상속 필요
navigationController(_ navigationController:, didShow:, animated:)
- 실제로 화면이 전환된 후에 호출되기 때문에 화면 전환 이후의 작업을 처리
navigationController.transitionCoordinator?.viewController(forKey: .from)
- 현재 화면 전환 상태에서 이전의 화면을 가져옴
navigationController.viewControllers.contains(fromViewController)
- 현재 뷰 컨트롤러들에 이전의 화면이 여전히 포함되어있는지 확인
- 포함되어 있다면, 이는 화면이 아직 완전히 전환되지 않았음을 의미하므로 메서드 종료
데이터 전달
1. property
[embed]
2. delegate
[embed]
DetailCoordinatorDelegate
- delegate protocol 정의
- 작업을 통해 받은 데이터를 사용하고 싶은 Coordinator에서 채택
taskCompleted(with data: Any?)
- 작업 완료시 호출되는 메서드
didCompelteTask(_ coordinator:, data:)
- 데이터를 받아와서 처리
showDetail()
- delegate 설정 부분 추가
Concrete Type-to-Protocol
Networking Protocol
[embed]
DataHandling Protocol
[embed]
MainCoordinator
[embed]
MainViewController
[embed]
MainViewControoler의 coordinator는 기존의 concrete type인 MainCoordinator가 아닌 (Networking & DataHandling) 프로토콜로 변환하였습니다. 프로토콜을 사용함으로 ViewController와 Coordinator간 의존성을 줄여 유연성을 향상시키고, 느슨한 결합을 통해 가독성, 코드 재사용성, 유지보수 기능을 강화할 수 있습니다.
결론
Coordinator 패턴과 MVVM 아키텍처를 결합하면 각각의 강점을 살려 확장성이 높은 앱 아키텍처를 구성할 수 있습니다. Coordinator는 네비게이션 로직에, ViewModel은 비즈니스 로직에 집중하여 각 모듈이 독립적으로 테스트 가능하고, 코드의 가독성과 유지보수성을 향상시킵니다. 또한, MVVM 아키텍처는 데이터의 일관성과 테스트 용이성을 제공하여 안정적이고 유연한 앱 개발을 가능케 합니다.
Reference
- https://medium.com/nbt-tech/mvvm-%EA%B7%B8%EB%A6%AC%EA%B3%A0-coordinator-a8d4f9d0fc8a
- https://www.hackingwithswift.com/articles/71/how-to-use-the-coordinator-pattern-in-ios-apps?source=post_page-----a8d4f9d0fc8a--------------------------------
- https://www.hackingwithswift.com/articles/175/advanced-coordinator-pattern-tutorial-ios
- https://wojciechkulik.pl/ios/mvvm-coordinators-rxswift-and-sample-ios-application-with-authentication?source=post_page-----a8d4f9d0fc8a--------------------------------
- https://medium.com/nerd-for-tech/mvvm-coordinators-ios-architecture-tutorial-fb27eaa36470
메타데이터
- post_id
- 37b04b65c4c2
- slug
- coordinator-pattern-in-mvvm-37b04b65c4c2
- url
- https://medium.com/@chso294/coordinator-pattern-in-mvvm-37b04b65c4c2
- canonical_url
- https://medium.com/@chso294/coordinator-pattern-in-mvvm-37b04b65c4c2
- author_url
- https://medium.com/@chso294
- status
- ok
- fetched_at
- 2026-06-27 23:56:40