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 로직이 독립적으로 관리되도록 한다.

이러한 디렉토리 구조를 유지함으로써 코드의 가독성과 유지보수성을 높일 수 있으며, 각 계층 간의 역할이 명확하게 분리되어 협업 시에도 효율적으로 작업할 수 있다. 또한, 각 컴포넌트의 테스트 용이성을 높여, 전체 시스템의 안정성을 향상시킬 수 있다.