지난 시간 동안 학습한 NestJS의 모든 구성 요소는 계층형 아키텍처(Layered Architecture)와 의존성 주입(DI)이라는 두 가지 핵심 원리를 기반으로 유기적으로 동작합니다.
요청 처리 흐름 (복습):
Request → Middleware → Guard → Interceptor(Pre) → Pipe → Controller → Service → Repository → Database
Response ← Interceptor(Post) ← Exception Filter ← Controller ← Service ← Repository
역할 분리:
의존성 주입 (DI):
@Injectable()이 붙은 클래스(프로바이더)들을 관리합니다.애플리케이션이 커질수록, 모든 컨트롤러와 서비스를 하나의 거대한 app.module.ts에 등록하는 것은 비효율적입니다.
모듈은 관련된 기능(컨트롤러, 서비스, 리포지토리 등)을 하나의 독립적인 단위로 캡슐화하는 역할을 합니다.
설계 원칙:
UsersModule, MoviesModule, AuthModule과 같이 도메인 또는 기능별로 모듈을 분리합니다.exports): 각 모듈은 기본적으로 내부의 프로바이더를 캡슐화합니다. 다른 모듈에서 사용해야 하는 프로바이더(e.g., UsersService)가 있다면, exports 배열에 명시적으로 추가하여 외부로 공개해야 합니다.imports): MoviesModule이 UsersModule에서 공개한 UsersService를 사용해야 한다면, MoviesModule의 imports 배열에 UsersModule을 추가합니다.장점:
imports 배열을 통해 명시적으로 관리됩니다.| 구분 | REST API | GraphQL |
|---|---|---|
| 엔드포인트 | 여러 개 (e.g., /users, /movies) | 단 하나 (e.g., /graphql) |
| 데이터 요청 | 서버가 정의한 고정된 구조로 받음 | 클라이언트가 필요한 데이터의 구조를 직접 정의하여 요청 |
| 장점 | • 직관적이고 단순함 • HTTP 캐싱 등 생태계 성숙 | • Over/Under-fetching 문제 해결 • 프론트엔드 개발 유연성 증대 |
| NestJS 구현 | Controller | Resolver |
안정적인 애플리케이션을 위해서는 반드시 테스트 코드를 작성해야 합니다. NestJS는 테스트를 위한 훌륭한 환경을 기본적으로 제공합니다.
테스트 피라미드 전략:
Supertest를 사용하여 실제 HTTP 요청을 보내고, 모든 계층을 거친 최종 응답을 검증. 느리지만 가장 높은 신뢰도를 제공.NestJS는 모듈, 컨트롤러, 프로바이더라는 구조화된 아키텍처와 의존성 주입(DI)을 통해, 대규모 서버 애플리케이션을 체계적으로 구축할 수 있는 강력한 프레임워크입니다.
TypeORM을 통해 데이터베이스와의 상호작용을 객체 지향적으로 처리하고, class-validator와 파이프로 데이터 유효성을 검증하며, 가드와 JWT로 인증/인가를 구현했습니다.
또한, @nestjs/config로 설정을 안전하게 관리하고, E2E 테스트로 애플리케이션의 안정성을 보장하는 방법을 학습했습니다.
다음 학습 로드맵: