본문 바로가기
swift

iOS 코디네이터 패턴

by 승환파크 2025. 5. 19.

코디네이터 패턴이란

코디네이터(Coordinator) 패턴은 iOS 개발에서 앱의 네비게이션 흐름을 효율적으로 관리할 수 있도록 도와주는 디자인 패턴이다. 이 패턴은 뷰 컨트롤러 간의 의존성을 최소화하고, 네비게이션 로직을 각 뷰 컨트롤러에서 분리하여 코드의 유지보수성과 확장성을 높이는 것을 목표로 한다.

 

코디네이터 패턴의 필요성

1. UIViewController의 역할 분리: 일반적으로 iOS 앱에서는 UIViewController가 화면 표시와 네비게이션 제어를 동시에 처리하는 경우가 많다. 이는 코드가 복잡해지고, 네비게이션 로직이 여러 컨트롤러에서 분산되면서 유지보수성이 떨어질 수 있다.

2. 코드 중복 감소: 코디네이터 패턴을 사용하면 네비게이션 로직을 하나의 코디네이터 클래스에서 관리할 수 있으므로, 중복 코드가 줄어든다.

3. 테스트 용이성: 코디네이터를 사용하면 화면 간 이동 로직을 별도로 테스트할 수 있어, UI 테스트 작성이 더 간결해진다.

 

코디네이터 패턴의 기본구조

1. 코디네이터 프로토콜

protocol Coordinator {
    var childCoordinators: [Coordinator] { get set }
    func start()
}

2. 코디네이터 클래스

class MainCoordinator: Coordinator {
    var childCoordinators: [Coordinator] = []
    private let navigationController: UINavigationController
    
    init(navigationController: UINavigationController) {
        self.navigationController = navigationController
    }
    
    func start() {
        let viewController = MainViewController()
        viewController.coordinator = self
        navigationController.pushViewController(viewController, animated: true)
    }
    
    func showDetail() {
        let detailVC = DetailViewController()
        detailVC.coordinator = self
        navigationController.pushViewController(detailVC, animated: true)
    }
}

 

코디네이터의 동작 원리

1.코디네이터 인스턴스 생성: 앱의 네비게이션 컨트롤러 또는 탭바 컨트롤러와 함께 코디네이터가 생성된다.

2.start 메서드 호출: 코디네이터는 start 메서드를 통해 초기 화면을 지정하고 표시한다.

3.화면 간 네비게이션: 각 화면에서 코디네이터를 통해 새로운 화면으로 이동할 수 있다.

 

코디네이터 사용 방법

class SceneDelegate: UIResponder, UIWindowSceneDelegate {
    var window: UIWindow?
    var appCoordinator: AppCoordinator?

    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        guard let windowScene = (scene as? UIWindowScene) else { return }

        let window = UIWindow(windowScene: windowScene)
        let navigationController = UINavigationController()

        appCoordinator = AppCoordinator(navigationController: navigationController)
        appCoordinator?.start()

        window.rootViewController = navigationController
        window.makeKeyAndVisible()
        self.window = window
    }
}

여기서 AppCoordinator는 앱의 최상위 코디네이터로서 로그인, 메인 화면 등을 관리할 수 있다.

 

코디네이터의 확장

DI(Dependency Injection): 코디네이터 패턴과 DI를 결합하면, 각 화면이 필요한 의존성을 주입받아 더 유연하게 동작할 수 있다.

Assembly 패턴: 모듈화된 구성 요소를 조합하여 코디네이터가 관리할 수 있는 화면을 정의할 수 있다.

'swift' 카테고리의 다른 글

네트워크 통신  (2) 2024.07.10
Swift Delegate 패턴  (0) 2024.07.09
CoreData 와 UserDefaults  (0) 2024.07.09
메모리 관리 이해  (0) 2024.07.09
UIViewController 생명주기  (3) 2024.07.09