Back End/🌈 ASP.NET
MVC 패턴 vs MVVM 패턴
James Wetzel
2025. 6. 9. 18:44
두 패턴 모두 소프트웨어 개발, 특히 UI(사용자 인터페이스)를 가진 애플리케이션 개발에서 코드를 구조화하고 관심사를 분리하기 위한 디자인 패턴입니다. 목표는 비슷하지만, 접근 방식과 각 구성 요소의 역할에서 차이가 있습니다.
1. MVC 패턴 (Model-View-Controller)
MVC는 UI를 가진 애플리케이션에서 가장 오래되고 널리 사용되는 패턴 중 하나입니다. 각 구성 요소가 명확한 역할을 가지고 있어, 코드를 체계적으로 관리하고 확장성을 높이는 데 도움을 줍니다.
- Model (모델):
- 역할: 애플리케이션의 데이터와 비즈니스 로직을 담당합니다.
- 특징:
- 데이터를 표현(예: 데이터베이스에서 가져온 객체, 비즈니스 규칙을 포함한 클래스).
- 데이터의 상태를 관리하고, 데이터를 조작하는 메서드를 포함합니다.
- 뷰나 컨트롤러에 직접 의존하지 않습니다.
- 예시:
Product
클래스,UserService
(사용자 데이터 처리 로직).
- View (뷰):
- 역할: 사용자에게 데이터를 시각적으로 표시하는 부분입니다. (UI)
- 특징:
- 모델의 데이터를 받아 사용자에게 보여줍니다.
- 사용자의 입력을 받아서 컨트롤러로 전달합니다.
- 컨트롤러와 모델을 직접 알지 못하며, 단지 데이터를 표시하고 사용자 이벤트를 전달하는 역할만 합니다.
- 수동적으로 모델의 변경 사항을 반영하거나, 컨트롤러를 통해 업데이트됩니다.
- 예시: 웹 페이지(HTML/CSS), WPF/WinForms의 XAML/컨트롤.
- Controller (컨트롤러):
- 역할: 모델과 뷰 사이의 중재자(Mediator) 역할을 하며, 사용자의 입력(이벤트)을 처리합니다.
- 특징:
- 뷰로부터 사용자 입력을 받습니다.
- 이 입력을 해석하고, 필요한 경우 모델에게 데이터 변경을 요청합니다.
- 모델에서 변경된 데이터를 받아 뷰를 업데이트하도록 지시합니다.
- 자신은 데이터를 직접 처리하거나 UI를 직접 그리지 않습니다.
- 예시: ASP.NET Core MVC의
HomeController
,ProductController
.
MVC의 흐름:
- 사용자가 뷰에서 상호작용 (예: 버튼 클릭).
- 뷰가 이 이벤트를 컨트롤러로 전달.
- 컨트롤러는 이벤트에 따라 모델에게 데이터 처리 요청.
- 모델이 데이터 처리 후, 상태가 변경되었음을 컨트롤러에 알림.
- 컨트롤러는 변경된 모델 데이터를 뷰에 전달하여 뷰를 업데이트하도록 지시.
2. MVVM 패턴 (Model-View-ViewModel)
MVVM은 주로 데이터 바인딩(Data Binding) 기술이 풍부한 UI 프레임워크(예: WPF, UWP, Xamarin, Angular, Vue, React의 상태 관리)에서 강력한 장점을 가집니다. MVC의 파생형으로 볼 수도 있습니다.
- Model (모델):
- 역할: MVC의 모델과 동일합니다. 애플리케이션의 데이터와 핵심 비즈니스 로직을 담당합니다.
- 특징: UI와 독립적입니다.
- View (뷰):
- 역할: 사용자에게 데이터를 시각적으로 표시하고, 사용자의 입력을 받습니다.
- 특징:
- MVC 뷰와 비슷하지만, ViewModel에 직접적으로 데이터 바인딩됩니다.
- 사용자 입력(이벤트)을 직접 ViewModel의 명령(Command)에 바인딩하여 전달합니다.
- UI 요소와 ViewModel 간의 양방향 데이터 바인딩이 핵심입니다.
- 뷰는 ViewModel을 알지만, ViewModel은 뷰를 알지 못합니다.
- 예시: WPF/Xamarin의 XAML, React/Angular/Vue의 컴포넌트 템플릿.
- ViewModel (뷰모델):
- 역할: 뷰를 위한 모델이라고 생각할 수 있습니다. 뷰와 모델 사이의 중재자이자, 뷰의 상태와 뷰가 필요로 하는 데이터를 노출합니다.
- 특징:
- 데이터 바인딩: 뷰가 바인딩할 수 있는 속성(Properties)과 명령(Commands)을 노출합니다.
- 모델과의 상호작용: 모델로부터 데이터를 가져오거나 모델에 데이터를 저장하도록 요청합니다.
- 뷰 상태 관리: 뷰에 특화된 로직(예: UI 요소의 활성/비활성 상태, 메시지 표시 등)을 포함할 수 있습니다.
INotifyPropertyChanged
: 속성이 변경될 때 뷰에 알림을 보내 뷰가 자동으로 업데이트되도록 합니다.- 뷰에 직접 의존하지 않으므로, 뷰모델은 쉽게 테스트할 수 있습니다.
- 예시:
ProductViewModel
(뷰에 표시될 제품 정보와 관련된 메서드를 포함).
MVVM의 흐름:
- 사용자가 뷰에서 상호작용 (예: 버튼 클릭).
- 뷰의 UI 요소가 ViewModel의
Command
에 바인딩되어, 명령 실행. - ViewModel은 명령에 따라 모델에게 데이터 처리 요청.
- 모델이 데이터 처리 후, ViewModel에 결과 전달.
- ViewModel의 속성(Properties)이 업데이트되고,
INotifyPropertyChanged
를 통해 뷰에 알림. - 뷰는 데이터 바인딩에 따라 자동으로 업데이트.
간략한 차이점 요약
특징 | MVC (Model-View-Controller) | MVVM (Model-View-ViewModel) |
---|---|---|
중재자 | Controller (뷰와 모델 사이에서 사용자 입력 처리 및 뷰 업데이트 지시) | ViewModel (뷰를 위한 모델 역할, 뷰와 모델 간의 데이터 및 명령 바인딩) |
뷰와 모델 관계 | 컨트롤러를 통해 간접적으로 상호작용 (컨트롤러가 뷰를 업데이트) | ViewModel을 통해 데이터 바인딩으로 직접 상호작용 (뷰가 ViewModel 속성에 바인딩) |
테스트 용이성 | 컨트롤러 로직은 테스트하기 쉽지만, 뷰 로직은 어려울 수 있음 | ViewModel이 뷰 로직의 상당 부분을 캡슐화하여 뷰모델 테스트 용이 |
UI 기술과의 관계 | 특정 UI 기술에 덜 의존적 (웹, 데스크톱 모두 널리 사용) | 데이터 바인딩이 강력한 UI 프레임워크(WPF, Angular, React, Vue)에 특히 적합 |
핵심 기술 | 요청-응답 주기, 이벤트 핸들링 | 데이터 바인딩, Command , INotifyPropertyChanged |
간단히 말해, MVC는 컨트롤러가 뷰를 "수동으로" 업데이트하는 방식이고, MVVM은 뷰모델과 뷰가 "자동으로" 데이터 바인딩되는 방식이라고 생각할 수 있습니다. MVVM은 특히 UI와 데이터의 긴밀한 동기화가 필요한 복잡한 클라이언트 애플리케이션에서 더 강력한 장점을 발휘합니다.
728x90
반응형