왕논의 연구실

Coordinator 패턴 + Factory 패턴 본문

iOS/Swift

Coordinator 패턴 + Factory 패턴

ywangnon 2025. 3. 19. 23:22

Coordinator 패턴 + Factory 패턴을 함께 사용하는 이유와 방법

iOS 앱 개발에서 화면 전환을 효과적으로 관리하기 위해 Coordinator 패턴을 많이 사용합니다.
여기에 Factory 패턴을 결합하면 유지보수성과 확장성이 더욱 향상됩니다.

이번 글에서는 Coordinator 패턴과 Factory 패턴을 함께 사용하는 이유
어떻게 적용하는지에 대해 설명하겠습니다. 🚀


✅ 1. Coordinator 패턴과 Factory 패턴의 개념

📌 Coordinator 패턴이란?

Coordinator 패턴은 화면 전환을 별도의 객체(Coordinator)가 담당하는 패턴입니다.

  • 화면 이동 로직을 한 곳에서 관리
  • ViewController 간 의존성을 줄여 유지보수가 쉬움
  • 새로운 화면이 추가될 때 Coordinator만 수정하면 됨

📌 Factory 패턴이란?

Factory 패턴은 객체 생성을 한 곳에서 관리하는 패턴입니다.

  • 특정 객체(ViewController)를 생성하는 책임을 Factory 클래스가 담당
  • 객체 생성을 중앙에서 관리할 수 있음
  • 다양한 조건에 따라 적절한 객체를 생성할 수 있음

✅ 2. Coordinator 패턴과 Factory 패턴을 함께 사용하는 이유

1️⃣ 다양한 조건에 따라 화면을 동적으로 생성해야 할 때

예를 들어, 사용자가 앱을 실행할 때 로그인 여부에 따라 다른 첫 화면을 보여줘야 하는 경우

if isLoggedIn {
    navigateToMainScreen()
} else {
    navigateToLoginScreen()
}

이처럼 화면을 조건에 따라 생성해야 하는 경우 Factory 패턴이 유용합니다.


2️⃣ Coordinator 내부에서 ViewController를 직접 생성하지 않도록 하기 위해

보통 Coordinator는 화면 이동만 담당해야 하는데,
ViewController를 직접 생성하면 Coordinator의 역할이 너무 많아지고 유지보수가 어려워집니다.

❌ 좋지 않은 방식 (Coordinator에서 ViewController 직접 생성)

class MainCoordinator: Coordinator {
    func start() {
        let homeVC = HomeViewController()  // ❌ 직접 생성
        let settingsVC = SettingsViewController() // ❌ 직접 생성
        let tabBarController = UITabBarController()
        tabBarController.viewControllers = [homeVC, settingsVC]
    }
}

화면을 변경하려면 Coordinator를 직접 수정해야 함


3️⃣ ViewController 생성 방식을 일관되게 유지하기 위해

Factory 패턴을 사용하면 모든 ViewController 생성 로직을 한 곳에서 관리할 수 있습니다.
이렇게 하면 코드 일관성이 유지되고, 변경이 쉬워집니다.


✅ 3. Coordinator + Factory 패턴 적용 예제

이제 실제 코드 예제를 보면서 어떻게 적용하는지 알아보겠습니다! 🚀


📌 1️⃣ ViewControllerFactory 구현

📌 Factory 패턴을 사용해 ViewController를 생성하는 클래스

class ViewControllerFactory {
    static func createViewController(type: ViewControllerType) -> UIViewController {
        switch type {
        case .home:
            return HomeViewController()
        case .settings:
            return SettingsViewController()
        case .login:
            return LoginViewController()
        }
    }
}

enum ViewControllerType {
    case home
    case settings
    case login
}

📌 Factory 패턴을 사용하면:
ViewControllerFactory.createViewController(.home) 처럼 코드가 간결해짐
✅ 새로운 ViewController를 추가할 때 Factory만 수정하면 됨


📌 2️⃣ Coordinator에서 Factory를 사용하여 화면을 생성

📌 Coordinator에서 직접 ViewController를 생성하지 않고, Factory에서 생성된 인스턴스를 사용합니다.

class MainCoordinator: Coordinator {
    private let tabBarController: UITabBarController

    init(tabBarController: UITabBarController) {
        self.tabBarController = tabBarController
    }

    func start() {
        let homeVC = ViewControllerFactory.createViewController(type: .home)
        let settingsVC = ViewControllerFactory.createViewController(type: .settings)

        tabBarController.viewControllers = [
            UINavigationController(rootViewController: homeVC),
            UINavigationController(rootViewController: settingsVC)
        ]
    }
}

📌 개선점:
MainCoordinator화면 이동만 관리하고 ViewController 생성 책임을 Factory에 넘김
✅ 새로운 화면을 추가하려면 Factory만 수정하면 됨 (Coordinator 수정 불필요)


📌 3️⃣ 로그인 여부에 따라 다른 화면을 보여주는 경우

📌 앱 시작 시 로그인 여부에 따라 다른 화면을 Factory에서 생성하도록 설정할 수 있습니다.

class AppCoordinator: Coordinator {
    private let window: UIWindow

    init(window: UIWindow) {
        self.window = window
    }

    func start() {
        let navigationController = UINavigationController()

        let initialVC: UIViewController
        if UserManager.shared.isLoggedIn {
            initialVC = ViewControllerFactory.createViewController(type: .home)
        } else {
            initialVC = ViewControllerFactory.createViewController(type: .login)
        }

        navigationController.viewControllers = [initialVC]
        window.rootViewController = navigationController
        window.makeKeyAndVisible()
    }
}

📌 개선점:
로그인 여부에 따라 화면이 달라질 때도 Factory에서 일관되게 관리
AppCoordinator는 화면 이동만 관리하고, ViewController 생성은 Factory에 위임


✅ 4. Coordinator + Factory 패턴을 함께 사용하면 좋은 경우

💡 1. 앱에서 특정 조건에 따라 다른 화면을 보여줘야 할 때

  • 로그인 여부에 따라 홈 화면 or 로그인 화면을 다르게 보여줄 경우
    💡 2. ViewController를 동적으로 생성해야 할 때
  • 다양한 탭이나 기능이 추가되는 경우
    💡 3. ViewController 생성을 일관되게 유지하고 싶을 때
  • Factory에서 모든 ViewController 생성 로직을 관리

🚀 정리: Coordinator + Factory 패턴을 함께 사용하는 이유

기존 방식 ❌ Coordinator + Factory 방식 ✅
Coordinator에서 직접 ViewController 생성 Factory에서 ViewController를 생성
새로운 ViewController 추가 시 Coordinator도 수정해야 함 Factory만 수정하면 됨
ViewController 생성 코드가 여러 곳에 중복됨 Factory에서 일괄 관리 가능
유지보수가 어렵고 변경 시 코드 수정량이 많음 유지보수가 쉽고 확장성이 뛰어남

📌 Coordinator 패턴과 Factory 패턴을 함께 사용하면 화면 전환 관리가 더욱 유연하고 유지보수가 쉬워집니다!

'iOS > Swift' 카테고리의 다른 글

CoreBluetooth  (0) 2025.04.03
Apple API Guidelines - Naming  (0) 2025.03.19
의존성 역전 원칙(DIP)이란?  (0) 2025.03.17
Coordinator 패턴을 활용한 화면 전환 관리 비교  (0) 2025.03.16
Coordinator 패턴을 적용한 앱 예제  (0) 2025.03.16