반응형
Coordinator 패턴이란?
코디네이터(Coordinator) 패턴은 iOS 앱에서 ViewController의 "화면 전환" 책임을 분리하여, 별도의 객체인 코디네이터가 화면 흐름과 네비게이션을 관리하도록 하는 디자인 패턴이다.
이 패턴의 핵심 목적은 ViewController의 역할을 단순화하고, 화면 간 전환에 따른 결합도를 낮추는 것이 목적이다.
왜 코디네이터 패턴이 필요할까?
Coordinator 객체는 화면 전환(네비게이션)과 관련된 모든 로직을 담당하게 되는데 ViewController는 더 이상 다른 ViewController를 직접 생성하거나, 네비게이션을 직접 수행하지 않는다.
ViewController는 단지 자신의 코디네이터에게 "다음 화면으로 이동해달라"고 요청만 할 뿐이다.
Coordinator 프로토콜 예시
swiftprotocol Coordinator: AnyObject {
var childCoordinators: [Coordinator] { get set }
var navigationController: UINavigationController { get set }
func start()
}
- childCoordinators: 하위 플로우(예: 회원가입, 상세화면 등)를 관리하는 코디네이터 배열
- navigationController: 화면 전환에 사용할 네비게이션 컨트롤러
- start(): 해당 플로우의 시작점(초기 화면을 띄우는 역할)
동작 방식
- 앱의 시작점(AppDelegate/SceneDelegate)에서 루트 코디네이터(AppCoordinator 등)를 생성하고, start()를 호출하여 화면 흐름을 시작합니다.
- 루트 코디네이터는 필요에 따라 하위 코디네이터(TabBarCoordinator, HomeCoordinator 등)를 생성하고, 각 코디네이터의 start()를 호출합니다.
- 각 코디네이터는 자신이 담당하는 ViewController를 생성하고, 필요 시 ViewController에 자신(coordinator)을 주입합니다.
- ViewController에서 화면 전환이 필요할 때, 직접 push/present하지 않고 자신의 코디네이터에게 요청합니다.
장점
- 단일 책임 원칙(SRP) 준수: ViewController는 UI와 이벤트만, Coordinator는 네비게이션만 담당.
- 유지보수성: 화면 전환 로직이 한 곳에 모여 있어 수정이 쉽고, ViewController 간의 결합도가 낮아집니다.
- 재사용성: ViewController를 다른 플로우에서도 쉽게 재사용할 수 있습니다.
- 테스트 용이성: 네비게이션 로직을 별도로 테스트할 수 있습니다.
결론
코디네이터 패턴은 ViewController의 네비게이션 책임을 분리해 코드의 결합도를 낮추고, 유지보수성과 확장성을 높이는 iOS 아키텍처 패턴이다. 실제 구현은 프로젝트와 팀의 스타일에 따라 조금씩 다를 수 있지만, 핵심은 "화면 전환 책임을 ViewController가 아닌 Coordinator가 진다"는 점이다.
반응형