← Back to list

Coordinator Pattern in MVVM

Coordinator 패턴의 필요성

MinsuJeon · 2023-11-16 07:48 · 0 claps · 7.2 min read
#coordinator-pattern #mvvm-c
Open on Medium ↗

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


메타데이터
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