WPF의 디렉토리 구조 및 MVVM 패턴
WPF 프로젝트의 디렉토리 구조
솔루션 파일 (.sln)
솔루션 파일(.sln)은 Visual Studio 솔루션의 구성 요소를 정의하는 파일로 디렉토리 최상위에 있다. 이 파일은 하나 이상의 프로젝트를 포함할 수 있으며, 개발자가 프로젝트를 열고 빌드하는 데 중요한 역할을 한다.
프로젝트 파일 (.csproj)
프로젝트 파일(.csproj)은 C# 프로젝트의 설정을 정의하는 파일이다. 이 파일에는 프로젝트의 빌드 구성, 참조하는 라이브러리, 컴파일할 소스 파일 목록 등이 포함된다. 프로젝트 파일은 프로젝트의 빌드와 배포를 관리하며, 다양한 설정을 통해 프로젝트의 동작을 정의할 수 있다.
- Properties: 프로젝트의 속성을 포함하며, 주로
AssemblyInfo.cs
파일이 위치한다. 이 파일은 어셈블리의 메타데이터를 정의하며, 빌드와 배포 시 중요한 역할을 한다. - References: 프로젝트에서 참조하는 외부 라이브러리나 어셈블리들. 프로젝트가 의존하는 외부 코드나 프레임워크를 관리한다.
- App.xaml: 응용 프로그램의 리소스, 스타일, 테마 등을 정의하는 파일. 애플리케이션의 전반적인 설정과 리소스를 관리하며, 공통 스타일과 리소스를 정의한다.
- MainWindow.xaml: 기본적으로 생성되는 주 윈도우 파일. 사용자 인터페이스의 메인 엔트리 포인트가 된다.
- MainWindow.xaml.cs:
MainWindow.xaml
의 코드 비하인드 파일. 이벤트 핸들러와 로직이 구현된다.
이 기본 구조를 바탕으로, 프로젝트의 복잡성에 따라 폴더와 파일을 추가하여 조직화할 수 있다.
MVVM 패턴일 경우 디렉토리 구성
MVVM (Model-View-ViewModel) 패턴은 WPF 애플리케이션에서 가장 널리 사용되는 디자인 패턴이다.
- Model: 데이터와 비즈니스 로직을 포함하는 클래스들이 위치하는 폴더. 이 폴더에는 데이터베이스 모델, 비즈니스 엔티티, 데이터 접근 로직이 포함된다.
- View: 사용자 인터페이스 요소를 포함하는 XAML 파일들이 위치하는 폴더. 이 폴더에는 화면을 구성하는 XAML 파일과 그 코드 비하인드 파일이 포함된다.
- ViewModel: 뷰와 모델 사이의 중개자 역할을 하는 클래스들이 위치하는 폴더. 뷰 모델은 데이터 바인딩과 커맨드를 처리하며, 뷰와 모델 간의 로직을 관리한다.
간단한 예시
다음은 MVVM 패턴을 적용한 WPF 프로젝트의 디렉토리 구조 예시이다.
MyWpfApp.sin
MyWpfApp/
├── Model/
│ ├── Customer.cs
│ └── Order.cs
├── View/
│ ├── MainWindow.xaml
│ └── CustomerView.xaml
├── ViewModel/
│ ├── MainViewModel.cs
│ └── CustomerViewModel.cs
├── App.xaml
├── App.xaml.cs
└── MyWpfApp.csproj
새로운 클래스(.cs) 파일과 XAML 파일 배치 기준
새로운 클래스(.cs) 파일과 XAML 파일을 배치할 때의 기준은 다음과 같다.
-
Model 클래스: 데이터와 비즈니스 로직을 포함하는 클래스는
Model
폴더에 배치한다. 예를 들어, 고객 데이터를 처리하는Customer.cs
파일은Model
폴더에 위치시킨다. 이는 비즈니스 로직과 데이터 구조가 독립적으로 관리되도록 한다. -
View 클래스: 사용자 인터페이스 요소를 포함하는 XAML 파일은
View
폴더에 배치한다. 예를 들어, 고객 정보를 표시하는CustomerView.xaml
파일은View
폴더에 위치시킨다. 이는 UI 요소가 논리적으로 분리되어 관리되도록 한다. -
ViewModel 클래스: 뷰와 모델 사이의 중개자 역할을 하는 클래스는
ViewModel
폴더에 배치한다. 예를 들어,CustomerView.xaml
과 연결된 로직을 처리하는CustomerViewModel.cs
파일은ViewModel
폴더에 위치시킨다. 이는 프레젠테이션 로직과 UI 로직이 독립적으로 관리되도록 한다.
이러한 디렉토리 구조를 유지함으로써 코드의 가독성과 유지보수성을 높일 수 있으며, 각 계층 간의 역할이 명확하게 분리되어 협업 시에도 효율적으로 작업할 수 있다. 또한, 각 컴포넌트의 테스트 용이성을 높여, 전체 시스템의 안정성을 향상시킬 수 있다.