안녕하세요. 잇프입니다. 이번에는 MVVM패턴에 대해서 이해하고, 이러한 패턴을 활용해서 프로젝트를 어떻게 구축하는지에 대해 포스팅해보도록 하겠습니다. 먼저 MVVM은 Model, View, View Model을 의미합니다.
MVC, MVVM, MVP등 이러한 패턴들은 조금 더 프로젝트를 진행함에 있어서 작업의 분업화와 이후 유지, 보수를 용이하게 하기 위해 나온 개념들입니다. MVVM또한 이와 같은 원리가 반영된 것입니다.
- MVVM 패턴에 대한 구조 설명
Model : 화면과 관련된 데이터요소와 비즈니스 로직을 작성하는 곳(DTO라고 생각해도 좋을 것 같습니다.)
ViewModel : 화면의 동작방식 및 흐름을 표현하는 곳(INotifyPropertyChanged, Command의 개념이 있습니다.)
View : 화면에 보여지는 구성요소 디자이너 적인 요소
(출처 : https://happybono.wordpress.com/2017/10/10/mvvm-i-mvvm-%ED%8C%A8%ED%84%B4%EC%97%90-%EB%8C%80%ED%95%9C-%EA%B8%B0%EB%B3%B8-%EA%B0%9C%EB%85%90/)
일반적으로 MVVM패턴을 쓰는 이유 이전의 MVC패턴에서 단점으로 생각되는 View와 Model의 의존성을 최소화 하기 위해서입니다. 그렇기 때문에 MVVM패턴에서는 데이터 바인딩이라는 기법을 쓰게 됐습니다. 데이터 바인딩이란 바인딩 대상과 바인딩 소스간에 상호작용으로 일어난다고 생각하시면 이해가 쉬울 것이라 생각합니다. 데이터 바인딩의 요소로는 OneWay방식, OneWayToSource방식, TwoWay방식이 있습니다. OneWay방식은 한쪽에서 그냥 데이터의 변경을 감지하고 사용자에게 그 상황을 알려주는 것이라면, TwoWay방식은 사용자가 입력한 결과가 즉각적으로 화면에서 변경되는 방식입니다.
두번째로 자주 쓰이는 것 중 하나는 Command입니다. 이것은 Button, MenuItem, ToolbarItem, ImageCell, ListView등의 Class를 제어하기 위해 만들어졌습니다. Command는 DataBinding이 ViewModel의 메서드를 호출할 수 있도록 도와주는 역할로 MVVM패턴 개발에서 조금 더 단순하게 만들어 줄 수 있습니다.
먼저 이번 포스팅에서는 INotifyPropertyChanged, ICommand의 인터페이스 작성 방법보다는 어떻게 폴더를 나누고 구조를 정할지 생각해보도록 하겠습니다. 간단하게 주소록을 만드는 프로젝트를 가정하고 폴더를 구현한다면 어떻게 해야할지 보도록 하겠습니다.
일단 파일 구성은 아래와 같이 나누도록 하겠습니다.
이처럼 각각의 폴더를 만들고 해당 폴더에서 작업하는 내용을 간략하게 적어보겠습니다.
1. Views 폴더
Views 폴더는 말그대로 사용자가 처음 접하는 화면입니다. 여기서 그리드 레이아웃을 이용해서 디자인을 하고 데이터바인딩을 통해 ViewModel과 연결하는 코드들이 작성되는 곳입니다.
2. Models 폴더
Models 폴더에서는 해당 프로젝트의 비즈니스로직이 작성되는 곳입니다. 예를 들어 주소록이라면 이름, 나이, 이메일 등의 가장 기본적인 변수들을 생성하는 곳이라고 보시면 됩니다.
3. ViewModels 폴더
ViewModels 폴더에서는 Model의 비즈니스 로직과 Command 폴더의 ICommand 인터페이스를 받아와서 처리하는 곳입니다. 여기서 작성된 코드가 View와 데이터 바인딩이 되신다고 보면 될 것 같습니다.
4. Command 폴더
Command 폴더에서는 버튼, 메뉴아이템, 리스트 뷰등의 상황에 맞게 데이터바인딩과의 관계를 정의해주는 공간입니다.
5. Resources 폴더
Resources 폴더는 View에서 보여지는 Style을 정의하는 곳입니다. 해당 프로젝트의 App.xaml이 가장 먼저 실행되면서 MainWindow를 호출하고, 다양한 스타일 리소스들을 연결하는 것입니다.
이후 포스팅에서는 간단하게 특정 주제를 정하고 C# WPF를 이용한 프로젝트를 하나 만들어볼까 생각합니다. 감사합니다. :D
'Programming > C# WPF' 카테고리의 다른 글
[C# WPF] Button Style Custom 방법 (0) | 2019.06.12 |
---|---|
[C# WPF] ICommand를 활용한 버튼 커맨드 방법 (0) | 2019.03.04 |
[C# WPF] Window화면 Custom하기 (0) | 2018.09.05 |
C# WPF] INotifyPropertyChanged 인터페이스를 이용한 데이터 바인딩 방법 (1) | 2018.04.17 |
C#] WPF에서 MariaDB 연결 및 데이터 불러오기 (4) | 2018.03.02 |