Optimize C# Architecture with CQRS and MediatR: Scalable Des
AI Store에서 AI코딩으로 만들어진 앱을 만나보세요!
지금 바로 방문하기

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 MediatRMediatR.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 Handle(CreateProductCommand request, CancellationToken cancellationToken)

```

  • 컨트롤러 사용:

```csharp

[HttpPost] public async Task Create(CreateProductCommand command)

```

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()), Times.Once);

```

결론

  • CQRS + MediatR 적용 팁:
  • DTO 사용 강제: ProductDto 반환으로 도메인 노출 방지
  • ValidationPipeline 자동화: FluentValidation으로 검증 로직 중복 최소화
  • 초기 구조 설정: dotnet new webapi -n YourApp 명령어로 프로젝트 생성 후 MediatR 패키지 설치
  • 유연한 적용: 전체 CQRS 구현이 필요하지 않아도 명령/질의 분리로 코드 구조 개선 가능