TIL

251210 TIL MVVM 패턴

23g 2025. 12. 10.

 

참말로 헷갈리는 MVVM 패턴

 

기존에 MVC로 되어있던 내 프로젝트를 MVVM으로 리팩토링 하는 중에

MVVM을 제대로 이해하지 못하고 코드만 바꿔대고 있는거 같아 다시 해보는 공부..

 

Model: 데이터와 비즈니스 로직의 원천

Model 계층은 애플리케이션의 데이터와 그 데이터를 처리하는 핵심 규칙을 담고 있습니다. 

 

View: 데이터의 시각적 표현 및 사용자 입력

View는 비즈니스 로직을 가져서는 안 됩니다. 예를 들어, 데이터를 포맷팅하거나 조건에 따라 계산하는 로직은 View에 존재해서는 안 되며, 오직 ViewModel이 가공해준 데이터를 보여주는 역할에만 충실해야 합니다.

 

ViewModel: View를 위한 추상화된 모델

MVVM의 중추인 ViewModel은 View를 위한 Model(Model for View)입니다. Model이 가진 순수 데이터를 View가 보여주기 편한 형태로 변환하고, View의 상태를 관리하는 역할을 수행합니다.

 

신입 개발자가 주의해야 할 안티 패턴 (Anti-Patterns)

MVVM을 처음 학습하고 적용할 때 흔히 저지르는 실수들과 그 해결책을 정리합니다.

1. ViewModel 내부의 UIKit 참조

  • 실수: ViewModel 파일 상단에 import UIKit을 선언하고, UIImage, UIFont, UIColor 등을 ViewModel의 속성으로 가지는 경우.
  • 문제점: ViewModel이 View의 구현 디테일에 종속됩니다. 이는 테스트를 어렵게 만들고(UIKit은 메인 스레드 의존적), ViewModel의 순수성을 해칩니다.
  • 해결: ViewModel은 데이터(String, Data, HexCode)만 반환하고, View가 이를 받아서 UI 객체(UIImage, UIColor)로 변환하도록 합니다.

2. Massive ViewModel

  • 실수: ViewController의 코드를 그대로 ViewModel로 옮기기만 하는 경우. 로직 분리 없이 위치만 이동시킨 것은 "쓰레기를 다른 서랍으로 옮기는 것"과 같습니다.
  • 문제점: ViewModel 자체가 수천 줄이 되어 유지보수가 어려워집니다.
  • 해결: ViewModel은 **프레젠테이션 로직(Presentation Logic)**만 담당해야 합니다.
    • 데이터 포맷팅 -> Formatter
    • 네트워크 통신 -> Service / Repository
    • 데이터 저장 -> Storage 로 역할을 더 잘게 쪼개야 합니다.

3. 순환 참조 (Retain Cycle)

  • 실수: 클로저나 Combine의 sink, assign 내부에서 self를 강하게 참조(Strong Reference)하는 경우.
  • 문제점: View와 ViewModel이 서로를 붙잡고 놓아주지 않아 메모리 누수(Memory Leak)가 발생합니다. 앱이 종료될 때까지 메모리가 해제되지 않습니다.
  • 해결: 반드시 [weak self]를 사용하여 약한 참조(Weak Reference)로 캡처해야 합니다.

 

이걸 머릿속에 넣어야 하는데 !

어렵군???

댓글