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
'Nest.js를 배워보자 > 14. NestJS 프로젝트 실전 아키텍처 정리' 카테고리의 다른 글
| 실무형 프로젝트 구조 예시 (Feature-First + DDD/Clean) (0) | 2025.12.03 |
|---|---|
| 모놀리식 vs 마이크로서비스 아키텍처 (MSA) (0) | 2025.12.03 |