Nest.js를 배워보자/14. NestJS 프로젝트 실전 아키텍처 정리

계층형 구조 (Layered Architecture) vs 클린 아키텍처 (Clean Architecture)

_Blue_Sky_ 2025. 12. 3. 12:58
728x90

두 아키텍처 모두 애플리케이션의 관심사를 분리하는 데 중점을 두지만, 의존성의 방향과 추상화 정도에서 큰 차이를 보입니다.

1. 계층형 구조 (Layered Architecture)

계층형 구조는 가장 전통적이고 흔하게 사용되는 아키텍처 패턴입니다. 관심사를 수평적 계층으로 분리하며, 의존성은 일반적으로 단방향입니다 (상위 계층이 하위 계층에만 의존).

💡 특징 및 NestJS에서의 구현

  • 구조: 일반적으로 Presentation (Controller), Business Logic (Service), Data Access (Repository/ORM)의 3계층으로 구성됩니다.
  • 의존성: 위에서 아래로만 의존합니다. 예를 들어, Service는 Repository를 호출하지만, Repository는 Service를 알지 못합니다.
  • 장점: 이해하기 쉽고, NestJS의 기본 구조(Controller-Service-Module)와 자연스럽게 매핑되어 빠른 개발 시작이 가능합니다.
  • 단점: 유연성이 낮습니다. 핵심 비즈니스 로직(Service)이 데이터베이스(Repository)와 강하게 결합되는 경향이 있어, DB 변경 시 Service 코드를 수정해야 하는 단점이 있습니다. 테스트 코드 작성 시 실제 DB Mocking이 필요할 수 있습니다.

      
728x90

2. 클린 아키텍처 (Clean Architecture)

클린 아키텍처는 핵심 비즈니스 규칙이 외부 요소(프레임워크, DB, UI)로부터 독립적이도록 설계된 아키텍처입니다. 의존성 역전 원칙(Dependency Inversion Principle, DIP)을 핵심적으로 따르며, 동심원(Concentric Rings) 형태로 구조화됩니다.

💡 특징 및 NestJS에서의 구현

  • 구조: 네 개의 주요 원(Entities, Use Cases, Interactors, Frameworks & Drivers)으로 구성되며, NestJS에서는 주로 Domain/Entities, Application/UseCases, Infrastructure/Adapters 폴더 구조로 구현됩니다.
  • 의존성: 의존성의 방향은 항상 안쪽으로 향합니다. 가장 바깥쪽 원은 안쪽 원을 알지만, 안쪽 원은 바깥쪽 원을 절대 알지 못합니다. (프레임워크나 DB는 비즈니스 로직에 의존함)
  • 장점:
    • 독립성: 핵심 비즈니스 로직(Use Cases)이 데이터베이스나 프레임워크로부터 완벽하게 독립됩니다.
    • 테스트 용이성: 핵심 로직을 테스트할 때, 실제 DB나 외부 라이브러리를 Mocking할 필요 없이 순수한 비즈니스 로직만 테스트할 수 있습니다.
    • 유연성: DB 종류나 웹 프레임워크를 교체하기가 매우 쉽습니다.
  • 단점: 초기 설계 및 설정에 더 많은 시간과 복잡한 추상화(인터페이스, 추상 클래스) 작업이 필요하며, 작은 프로젝트에는 오버헤드가 될 수 있습니다.
      
728x90

3. 비교 요약

구분 계층형 구조 (Layered) 클린 아키텍처 (Clean)
핵심 원칙 관심사의 수평적 분리 의존성 역전 원칙 (DIP)
의존성 방향 상위 -> 하위 (단방향) 항상 안쪽으로 (핵심 로직이 외부에 독립됨)
복잡도 낮음 (쉬움) 높음 (추상화 필요)
유연성 낮음 (DB 변경 시 로직 수정 필요) 매우 높음 (DB/프레임워크 독립)
NestJS 구현 Controller -> Service -> Repository Controller -> Use Case (Service) -> Interface -> Adapter (Repository)
적합한 프로젝트 소규모, 단순 CRUD, 빠른 프로토타이핑 대규모, 복잡한 비즈니스 로직, 장기 유지보수 프로젝트

 

728x90