클린 아키텍처 in .NET 설명 (The Dependency Rule)
Source: Dev.to
EF Core를 업그레이드하면서 300개의 파일을 수정해야 했거나, 단일 비즈니스 규칙을 단위 테스트하려다 먼저 실행 중인 데이터베이스가 필요하다는 것을 깨달았다면—이미 Clean Architecture가 해결하려는 문제를 경험한 것입니다.
이것이 요약 버전입니다. 전체 심층 분석(네 개 레이어, 실제 .NET 8 코드와 EF Core + MediatR, 솔직한 트레이드‑오프, 그리고 대부분의 팀이 실제로 배포하는 실용적인 2‑프로젝트 버전)은 아래에 링크되어 있으며, 비디오 walkthrough도 포함되어 있습니다.
하나의 규칙
Clean Architecture에는 기억해 둘 가치가 있는 규칙이 정확히 하나 있습니다:
소스 코드 의존성은 안쪽을 향해만 지정될 수 있다.
동심원 형태를 떠올려 보세요. 비즈니스 로직은 중앙에 위치하고 아무것도 참조하지 않습니다. 프레임워크, 데이터베이스, UI는 외부 링에 존재하며 중앙을 의존합니다—반대는 절대 없습니다. 의존성을 뒤집으면 나머지는 자연스럽게 맞춰집니다.
네 개 레이어
Domain
- 엔티티, 값 객체, 순수 비즈니스 규칙.
- 프레임워크 코드 전무:
[Table],[Key], EF Core 사용 금지.
Application
- Use case(명령/쿼리 핸들러).
IOrderRepository,IClock과 같이 필요한 인터페이스를 정의합니다.
Infrastructure
- 구현체: EF Core, HTTP 클라이언트, 이메일, 파일 시스템 등.
- Application이 선언한 인터페이스를 구현합니다.
Presentation (Web/API)
- 입력을 검증하고, Use case에 전달하며, 응답을 포맷하는 얇은 컨트롤러.
- 비즈니스 로직 없음.
마법은 역전입니다: Application은 무엇이 필요한지 선언하고, Infrastructure는 어떻게 제공하며, DI 컨테이너가 시작 시에 이를 연결합니다. Use case는 EF Core를 전혀 참조하지 않으므로 간단한 가짜 객체만으로도 테스트할 수 있습니다.
public class PlaceOrderHandler : IRequestHandler
{
private readonly IOrderRepository _orders;
private readonly IClock _clock;
public PlaceOrderHandler(IOrderRepository orders, IClock clock)
{
_orders = orders;
_clock = clock;
}
public async Task Handle(PlaceOrderCommand cmd, CancellationToken ct)
{
var order = Order.Place(cmd.CustomerId, MapItems(cmd.Items), _clock.UtcNow);
await _orders.AddAsync(order, ct);
return order.Id;
}
}
DateTime.UtcNow, HttpContext, 데이터베이스가 전혀 없습니다. 이 핸들러는 몇 밀리초 안에 테스트할 수 있습니다.
컴파일러가 강제함
솔루션을 프로젝트별로 나누면 의존성 규칙이 스스로 강제됩니다:
Domain.csproj -> 참조 없음
Application.csproj -> Domain 참조
Infrastructure.csproj -> Application + Domain 참조
Web.csproj -> 모든 프로젝트 참조
누군가 Application 프로젝트 안에서 using Microsoft.EntityFrameworkCore를 시도하면 빌드가 실패합니다. 아키텍처는 코드 리뷰가 아니라 컴파일러에 의해 강제됩니다.
사용하지 말아야 할 경우
무료가 아닙니다—파일 수 증가, 간접성 증가, 온보딩 난이도 상승 등. CRUD 관리 도구, MVP, 단기 프로젝트에는 건너뛰세요. 실제 비즈니스 규칙이 존재하고, 팀 규모가 3명 이상이며, 수년간 유지될 프로젝트에 적용하는 것이 좋습니다.
리소스
- 비디오 walkthrough: YouTube 채널
- 전체 가이드 — 완전한 .NET 8 코드, 네 개 레이어 심층 분석, 흔히 발생하는 함정, 실용적인 버전: https://prepstack.co.in/blog/clean-architecture-csharp-complete-guide