NEST BUILDING BLOCKS

모듈은 묶고, 컨트롤러는 받고, 서비스는 처리한다

NestJS의 기본 구조는 요청 진입점과 비즈니스 로직을 분리한다. 모듈은 이 구성요소들을 등록하고, 의존성 주입이 서로를 연결한다.

Module 기능 단위로 묶음
Controller HTTP 요청 처리
Service 비즈니스 로직 담당
@Module imports, controllers, providers 등록
@Controller 라우트와 핸들러 정의
@Injectable 주입 가능한 provider 선언

요청 처리 흐름

컨트롤러는 HTTP 경계에 머물고, 실제 작업은 서비스로 위임한다.

Client

요청 전송

브라우저나 앱이 API 엔드포인트로 HTTP 요청을 보낸다.

GET /users
Controller

라우팅과 응답

경로와 메서드를 매칭하고 필요한 로직을 서비스에 위임한다.

@Get()
findAll()
Service

비즈니스 처리

데이터 조회, 계산, 외부 API 호출 같은 핵심 작업을 수행한다.

getUsers()
Response

결과 반환

서비스 결과를 컨트롤러가 HTTP 응답으로 돌려준다.

200 OK

모듈은 등록표다

어떤 컨트롤러와 서비스가 같은 기능 단위에 속하는지 메타데이터로 선언한다.

@Module

UsersModule

사용자 기능에 필요한 라우트와 로직을 하나의 경계 안에 묶는다.

@Module({
  controllers: [UsersController],
  providers: [UsersService],
})
imports 다른 모듈의 기능을 가져온다
controllers 이 모듈이 처리할 HTTP 진입점
providers 서비스, 레포지토리, 팩토리 등록
exports 다른 모듈에 공개할 provider

책임을 나누는 이유

역할이 섞이면 테스트와 재사용이 어려워지므로 경계를 작게 유지한다.

분리

요청 처리와 로직 분리

컨트롤러는 HTTP 형식에 집중하고, 서비스는 도메인 작업에 집중한다.

재사용

서비스를 여러 곳에서 사용

같은 비즈니스 로직을 다른 컨트롤러나 서비스에서도 주입받아 쓸 수 있다.

테스트

작은 단위로 검증

컨트롤러 테스트에서는 서비스를 mock 처리하고, 서비스는 독립적으로 검증한다.