왕논의 연구실

ViewModel의 위치? View vs ViewController 본문

iOS/Swift

ViewModel의 위치? View vs ViewController

ywangnon 2025. 5. 7. 23:54
반응형

🔍 두 방식의 차이 요약

구분 ViewModel을 ViewController에서 주입 ViewModel을 View에서 직접 참조
구조 ViewController가 View와 ViewModel을 연결 View가 ViewModel을 직접 소유
장점 역할 분리 명확, 테스트 용이 코드가 간결하고 SwiftUI에 가까움
단점 코드가 장황해질 수 있음 View가 똑똑해지고 재사용성 저하
흔한 사례 UIKit, 전통적 MVVM SwiftUI, 간단한 화면 구성
아키텍처적 해석 MVVM with Coordinator / Clean Architecture Passive MVVM or MVVM-ish

🎯 각 방식의 코드 구조와 의미

1. ViewModel을 ViewController에서 관리 (전통적 MVVM)

class MyViewController: UIViewController {
    let viewModel = MyViewModel()

    override func viewDidLoad() {
        super.viewDidLoad()
        myView.label.text = viewModel.title
        viewModel.onUpdate = { [weak self] in
            self?.myView.updateUI()
        }
    }
}
  • 구조적 이점: View는 dumb하게 유지, ViewModel의 로직 테스트 가능
  • 아키텍처: MVVM(C) 또는 Clean Architecture 스타일
  • 단점: 연결 코드 많고 번잡해짐

2. View 내부에 ViewModel을 직접 주입 (MVVM-ish, 특히 SwiftUI에서 흔함)

class MyView: UIView {
    var viewModel: MyViewModel! {
        didSet {
            label.text = viewModel.title
        }
    }
}
  • 장점: 코드가 직관적이고 간결
  • 단점: View가 로직을 갖기 시작함 → 테스트 어려움, 재사용성 떨어짐
  • 아키텍처: MVVM을 간단히 구현한 "MVVM Lite" 혹은 "Passive MVVM"

🏛️ 아키텍처 관점에서 해석하면...

방식 의미 아키텍처 패턴명
ViewModel을 ViewController에서 연결 뷰는 Dumb하게 유지하고 ViewModel은 외부에서 주입 MVVM with Coordinator / Clean MVVM
View가 ViewModel을 직접 가짐 구조는 MVVM처럼 보이나 실질적으로는 MVP나 MVC와 유사 Passive MVVM, or MVVM-ish

✅ 어떤 걸 써야 할까?

 

상황 추천 방식
UIKit 기반 앱에서 복잡한 화면, 테스트 고려 ViewModel 주입은 ViewController에서
SwiftUI 또는 간단한 화면 View에서 ViewModel을 직접 참조해도 OK
View 재사용성이 중요한 경우 View는 Dumb하게 유지 (ViewModel 접근 X)

🔚 결론

MVVM의 핵심은 구조의 명확한 책임 분리입니다.
View는 ‘어떻게 보여줄지’, ViewModel은 ‘무엇을 보여줄지’를 담당해야 합니다.

View가 ViewModel을 직접 조작하면 MVC로 퇴화하기 쉽고,
ViewController가 중간에서 연결해주면 아키텍처적으로 명확해집니다.

반응형