NestJS는 효율적이고, 안정적이며, 확장성 높은 서버 사이드 애플리케이션을 구축하기 위한 Node.js 프레임워크입니다.
내부적으로는 Express.js (또는 Fastify) 위에서 동작하며, TypeScript를 완벽하게 지원합니다.
핵심 철학:
왜 NestJS를 사용하는가?: 순수한 Node.js나 Express.js는 자유도가 매우 높지만, 정해진 구조가 없어 개발자마다 코드가 파편화되고 대규모 프로젝트 관리가 어려워지는 단점이 있습니다. NestJS는 Spring이나 Angular처럼 의견이 있는(Opinionated) 프레임워크로서, 잘 정의된 아키텍처를 제공하여 이러한 문제를 해결하고 개발 생산성을 극대화합니다.
@nestjs/cli)CLI 설치:
npm i -g @nestjs/cli
새 프로젝트 생성:
nest new my-project
my-project라는 디렉토리가 생성되고, 필요한 모든 의존성 설치와 함께 기본적인 프로젝트 구조가 자동으로 만들어집니다.개발 서버 실행:
cd my-project
npm run start:dev
start:dev 스크립트는 파일 변경을 감지하여 자동으로 서버를 재시작해주는 Hot-Reloading 기능을 제공합니다.역할: 들어오는 HTTP 요청(Request)을 받고, 그 결과를 클라이언트에게 응답(Response)하는 역할을 합니다. Spring의 @RestController와 매우 유사합니다.
데코레이터: @Controller(), @Get(), @Post(), @Param(), @Body() 등 직관적인 데코레이터를 사용하여 라우팅과 요청 데이터 처리를 정의합니다.
책임: 컨트롤러는 요청을 받고 응답을 보내는 "교통정리" 역할에만 집중해야 하며, 복잡한 비즈니스 로직은 프로바이더(서비스)에 위임해야 합니다.
// src/app.controller.ts
import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service';
@Controller() // 이 클래스가 컨트롤러임을 선언
export class AppController {
constructor(private readonly appService: AppService) {}
@Get() // GET / 요청을 이 메서드와 매핑
getHello(): string {
return this.appService.getHello();
}
}
역할: 서비스(Service), 리포지토리(Repository), 팩토리(Factory) 등 컨트롤러가 아닌 대부분의 클래스를 프로바이더라고 합니다. 이 중 서비스가 가장 대표적이며, 핵심 비즈니스 로직을 처리하는 역할을 합니다.
@Injectable() 데코레이터: 이 데코레이터가 붙은 클래스는 NestJS의 DI(의존성 주입) 컨테이너에 의해 관리될 수 있음을 나타냅니다.
의존성 주입 (DI): NestJS는 생성자(constructor)를 통해 프로바이더(e.g., AppService)를 다른 클래스(e.g., AppController)에 자동으로 주입해줍니다. 이를 통해 컴포넌트 간의 결합도를 낮추고 테스트 용이성을 높입니다.
// src/app.service.ts
import { Injectable } from '@nestjs/common';
@Injectable() // 이 클래스가 프로바이더임을 선언
export class AppService {
getHello(): string {
return 'Hello World!';
}
}
역할: 관련된 컨트롤러와 프로바이더들을 하나의 그룹으로 묶는 역할을 합니다. 모듈은 애플리케이션의 구조를 정리하는 데 사용됩니다.
@Module() 데코레이터: 모듈을 정의하는 데 사용되며, 다음과 같은 주요 속성을 가집니다.
providers: 이 모듈에서 사용될 프로바이더(서비스)들의 배열.controllers: 이 모듈에서 사용될 컨트롤러들의 배열.imports: 다른 모듈에서 export된 프로바이더를 사용하고 싶을 때, 해당 모듈을 가져옵니다.exports: 이 모듈에 포함된 프로바이더 중, 다른 모듈에서 사용할 수 있도록 외부로 공개할 것들을 지정합니다.// src/app.module.ts
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
@Module({
imports: [],
controllers: [AppController], // AppController를 이 모듈에 등록
providers: [AppService], // AppService를 이 모듈에 등록
})
export class AppModule {}