CQRS 및 MediatR을 활용한 C# 아키텍처 최적화
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
웹 개발
대상자
C#/.NET 개발자, Domain-Driven Design(DDD) 구현에 관심 있는 중급~고급 개발자
핵심 요약
- CQRS(명령/질의 분리): 명령(명령어)과 질의(읽기)를 분리하여 독립적인 확장성과 최적화 가능
- MediatR 활용:
IRequestHandler
인터페이스를 통해 의존성 제거 및 테스트 가능성 향상 - DTO 사용 필수:
ProductDto
와 같은 도메인 모델 노출 방지로 보안 및 유지보수성 강화 - ValidationPipeline:
FluentValidation
을 통한 예외 처리 자동화 및 코드 품질 개선
섹션별 세부 요약
1. CQRS 개념 정의
- 명령(Command): 상태 변경 작업(예:
Create
,Update
,Delete
) - 질의(Query): 데이터 조회 작업(예:
GetById
) - 분리 장점: 각 레이어의 최적화 전략 독립 (예: 쓰기 = 엄격한 검증, 읽기 = 성능 최적화)
2. MediatR 구현 전략
- 패키지 설치:
dotnet add package MediatR
및MediatR.Extensions.Microsoft.DependencyInjection
- Handler 구조:
```csharp
public class CreateProductHandler : IRequestHandler
```
- DI 등록:
services.AddValidatorsFromAssemblyContaining
();
3. 예제 코드 구조
- 명령 정의:
```csharp
public record CreateProductCommand(string Name, decimal Price) : IRequest
```
- 핸들러 구현:
```csharp
public async Task
```
- 컨트롤러 사용:
```csharp
[HttpPost] public async Task
```
4. 검증 및 예외 처리
- FluentValidation 사용:
```csharp
public class CreateProductValidator : AbstractValidator
```
- ValidationPipeline 적용:
```csharp
services.AddTransient(typeof(IPipelineBehavior<,>), typeof(ValidationBehavior<,>));
```
5. 단위 테스트 전략
- Mock 객체 사용:
```csharp
var mockRepo = new Mock
var handler = new CreateProductHandler(mockRepo.Object);
```
- 검증 로직:
```csharp
mockRepo.Verify(r => r.AddAsync(It.IsAny
```
결론
- CQRS + MediatR 적용 팁:
- DTO 사용 강제:
ProductDto
반환으로 도메인 노출 방지 - ValidationPipeline 자동화:
FluentValidation
으로 검증 로직 중복 최소화 - 초기 구조 설정:
dotnet new webapi -n YourApp
명령어로 프로젝트 생성 후 MediatR 패키지 설치 - 유연한 적용: 전체 CQRS 구현이 필요하지 않아도 명령/질의 분리로 코드 구조 개선 가능