본문 바로가기

프로젝트/LagomStyle

ViewModel 도입 - ViewController의 복잡도 개선

MVC 패턴을 사용하면서 ViewController의 복잡도가 점점 증가하는 문제가 발생했다.

UI 업데이트, 데이터 로딩, 네비게이션 처리 등의 로직이 하나의 ViewController에 집중되면서,
코드 가독성이 저하되고 유지보수가 어려워지는 상황이 발생했다.

이 문제를 해결하기 위해 MVVM 아키텍처를 도입하고, Input/Output 패턴을 적용하여 데이터 흐름을 개선하였다.

 

1️⃣ 문제: ViewController가 점점 비대해지는 문제 발생

프로젝트 초반에는 MVC 패턴을 적용하여 UI와 로직을 분리하려 했지만,
기능이 추가될수록 ViewController의 역할이 과도해지는 문제가 발생했다.

특히, 다음과 같은 문제들이 유지보수를 어렵게 만들었다.

  • ViewController 내부에서 UI 이벤트 관리, 데이터 핸들링, 네트워크 요청, 화면 전환 로직이 혼재됨
  • 새로운 기능을 추가할 때마다 ViewController의 코드가 계속 증가하여 가독성이 저하됨
  • ViewController가 특정 데이터 모델과 강하게 결합되어 있어, 로직을 재사용하기 어려움

 

2️⃣ 문제 분석: MVC의 한계

기능이 복잡해질수록, MVC 패턴의 근본적인 한계가 드러났다.

특히, View와 ViewController의 강한 결합으로 인해 다음과 같은 문제들이 발생했다.

 

❌ MVC 구조적 한계

  • View와 ViewController 간 결합도가 높음
  • UI 업데이트, 네트워크 요청, 비즈니스 로직이 모두 ViewController에서 처리됨
  • 특정 ViewController에서만 동작하도록 구현되면서 재사용성이 낮아짐
  • 확장성 부족
  • 새로운 기능을 추가할 때 ViewController 내부 코드가 점점 증가하여 유지보수가 어려워짐
  • 기능이 많아질수록 ViewController가 비대해지고, 코드 변경 시 사이드 이펙트 발생 가능성이 높아짐

 

3️⃣ 해결 방법: MVVM 도입 및 Input/Output 패턴 적용

MVC의 한계를 해결하기 위해 MVVM 아키텍처를 적용하여 ViewController의 역할을 단순화하고,

Input/Output 패턴을 도입하여 데이터 흐름을 명확하게 분리하였다.

 

📌 MVVM 도입 이유

 

ViewController의 역할 단순화

  • ViewController는 UI 업데이트에만 집중하도록 변경
  • 네트워크 요청 및 데이터 변환 등의 로직을 ViewModel로 이동하여 역할을 분리

 

코드 가독성 및 유지보수성 개선

  • ViewModel이 비즈니스 로직을 담당하고, UI와 독립적으로 동작하도록 구성
  • ViewController는 UI 이벤트를 ViewModel로 전달하고, ViewModel의 데이터를 구독하여 화면을 업데이트하는 구조로 변경

 

📌 Input / Output 패턴 적용

 

데이터 흐름을 명확하게 구분하여 ViewController와 ViewModel 간 역할을 분리

  • Input:
    • 사용자가 버튼을 클릭하거나 텍스트를 입력하면 ViewModel로 이벤트 전달
    • (예: “검색 버튼 클릭” → ViewModel이 검색 API 호출)
  • Output:
    • ViewModel이 비즈니스 로직을 처리한 후, ViewController에 가공된 데이터 전달
    • (예: “검색 결과” → ViewController가 UI 업데이트)

 

4️⃣ 적용 결과 및 성과

코드 가독성 개선

  • ViewController는 UI 업데이트에만 집중하며, 네트워크 및 데이터 로직은 ViewModel에서 처리
  • 각 클래스의 역할이 명확해지면서 코드 가독성이 향상됨

 

유지보수성 향상

  • ViewModel을 분리하여 코드 수정 시 영향 범위를 최소화
  • 네트워크 요청 및 데이터 가공 로직이 ViewController와 분리되어, 기능 추가 및 변경이 용이해짐

 

확장성 확보

  • 새로운 기능을 추가할 때, UI와 로직을 독립적으로 관리할 수 있어 확장성이 강화됨

5️⃣ 결론 및 향후 개선 방향

  • MVC의 한계였던 View와 ViewController의 강한 결합 문제를 해결하기 위해 MVVM을 도입
  • Input/Output 패턴을 적용하여 데이터 흐름을 명확히 관리함으로써, 유지보수성과 가독성을 개선
  • 향후에는 Coordinator 패턴을 도입하여, 네비게이션 로직까지 분리하여 화면 전환의 결합도를 낮출 계획