클린 아키텍처 in .NET 설명 (The Dependency Rule)

발행: (2026년 5월 25일 PM 02:23 GMT+9)
5 분 소요
원문: Dev.to

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명 이상이며, 수년간 유지될 프로젝트에 적용하는 것이 좋습니다.

리소스

0 조회
Back to Blog

관련 글

더 보기 »

dotnet Framework 수명 주기 도구

Introduction Learn how to create a dotnet Global Tool that lists all .NET Core frameworks with release and end‑of‑life information. 💡 For my other article on...

EF Core 명명된 쿼리 필터

Introduction EF Core 10 introduces named query filters, an enhancement over the traditional global query filters. Instead of a single combined filter per entit...