코디네이터 패턴이란
코디네이터(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 |