NestJS adoption

자유로운 Node.js 코드를 운영 가능한 경계로 나누기

NestJS의 가치는 문법 장식이 아니라 HTTP 경계, 비즈니스 규칙, 의존성 연결, 공통 정책을 서로 다른 위치에 고정하는 데 있습니다. Express 또는 Fastify 어댑터 위에 같은 애플리케이션 구조를 얹을 수 있다는 점도 선택 기준에 포함됩니다.

NestJS는 요청 처리 위치를 고정해 테스트 가능한 경계를 만든다 Adapter HTTP 입출력 Guard / Pipe 권한과 검증 Controller 요청 계약 Provider 규칙 실행 코드가 커질수록 라우터 안의 분기를 밖으로 밀어내고, 정책은 guard/pipe/interceptor/filter로 고정한다.
Module

기능 단위 공개 범위

@Module({
  imports, controllers,
  providers, exports
})

기능 경계를 만들고, 외부 모듈이 사용할 provider만 exports로 노출합니다.

Controller

요청 형식과 라우팅 경계

@Controller('users')
@Get(':id')
findOne(@Param('id') id)

URL, 메서드, 요청 DTO를 얇게 받고 실제 규칙은 provider에 위임합니다.

Provider

주입 가능한 비즈니스 로직

@Injectable()
class UsersService {
  constructor(repo) {}
}

서비스, 저장소, 클라이언트, 팩토리를 DI 컨테이너가 연결해 테스트 대역을 바꾸기 쉽게 만듭니다.

Request pipeline
Adapter

Express / Fastify

네트워크 입출력과 HTTP 서버 구현을 담당합니다.

Guard + Pipe

권한과 입력 변환

인증·인가를 먼저 확인하고 DTO 검증과 변환을 수행합니다.

Controller

엔드포인트 계약

요청 데이터를 읽고 응답 형태를 결정하는 얇은 계층입니다.

Provider

도메인 규칙 실행

저장소, 외부 API, 캐시 등 실제 작업 단위를 조합합니다.

Interceptor + Filter

응답과 예외 정책

로깅, 변환, 예외 매핑을 계층 바깥에서 일관되게 적용합니다.

Express만으로 충분한 경우와 NestJS가 맞는 경우

기준 얇은 Express/Koa NestJS 구조
규모 라우트가 적고 공통 정책이 제한적 도메인별 모듈과 권한 정책이 계속 늘어남
협업 팀 규칙을 문서와 리뷰로 유지 파일 위치와 의존성 연결이 프레임워크 규칙으로 고정
테스트 핸들러 중심 통합 테스트 비중이 큼 provider 단위 대역 주입과 module 단위 테스트가 쉬움

도입 시 설계 체크

컨트롤러 요청·응답 계약만 남기고 비즈니스 분기는 서비스로 이동
프로바이더 외부 의존성은 토큰과 인터페이스로 숨겨 테스트 대역 준비
모듈 imports와 exports가 순환 참조를 만들지 않는지 먼저 확인
공통 정책 guard, pipe, interceptor, filter의 책임을 중복 없이 분리