Nest.js 시작하기

2025-02-05
Nest

Why Nest.js?

  1. 아키텍처와 유지보수 용이성
    • 모듈(Module), 컨트롤러(Controller), 서비스(Service), 의존성 주입(Dependency Injection, DI) 같은 개념을 활용하여 확장성과 코드 재사용성이 뛰어난 구조를 제공
  2. 의존성 주입(DI, Dependency Injection) 지원
    • @Injectable() 데코레이터를 사용해 서비스를 모듈에 자동으로 주입
  3. 타입스크립트(Typescript) 기본 지원
  4. 내장된 미들웨어 & 가드 기능으로 인증/인가(Authorization), 요청 로깅, 예외 처리같은 기능을 쉽게 확장 등등..

설치하기

$ npm i -g @nestjs/cli
$ nest new project-name

구성하기

? Which package manager would you ❤️ to use? (Use arrow keys)
npm
  yarn
  pnpm
  • 이런 패키지 모듈이 나올 텐데요. 패키지 매니저를 고른 후
▹▸▹▹▹ Installation in progress... ☕

🚀  Successfully created project new-project
👉  Get started with the following commands:

$ cd new-project
$ npm run start


                          Thanks for installing Nest 🙏
                 Please consider donating to our open collective
                        to help us maintain this package.


               🍷  Donate: https://opencollective.com/nest
  • 터미널에 이런 메시지가 출력되면 성공입니다.

구동하기

$ cd new-project
$ npm run start

> new-project@0.0.1 start
> nest start

[Nest] 76033  - 2025. 02. 05. 오후 1:20:56     LOG [NestFactory] Starting Nest application...
[Nest] 76033  - 2025. 02. 05. 오후 1:20:56     LOG [InstanceLoader] AppModule dependencies initialized +4ms
[Nest] 76033  - 2025. 02. 05. 오후 1:20:56     LOG [RoutesResolver] AppController {/}: +1ms
[Nest] 76033  - 2025. 02. 05. 오후 1:20:56     LOG [RouterExplorer] Mapped {/, GET} route +1ms
[Nest] 76033  - 2025. 02. 05. 오후 1:20:56     LOG [NestApplication] Nest application successfully started +0ms
curl http://localhost:3000
Hello World!%
  • 응답이 완료되었습니다.

파일 구성

파일 이름설명
app.controller.ts단일 라우트를 가진 기본 컨트롤러입니다.
app.controller.spec.ts컨트롤러의 단위 테스트 파일입니다.
app.module.ts애플리케이션의 루트 모듈입니다.
app.service.ts단일 메서드를 가진 기본 서비스입니다.
main.ts애플리케이션의 진입점 파일로, NestFactory 핵심 함수를 사용하여 Nest 애플리케이션 인스턴스를 생성합니다.
  • Nest 공식문서에선 이렇게 설명하고 있네요.

주요 파일 설명

main.ts

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';

async function bootstrap() {
	const app = await NestFactory.create(AppModule);
	await app.listen(process.env.PORT ?? 3000);
}

bootstrap();
  • AppModule을 가져와 NestFactory로 생성하고 있고, app은 env에 설정한 값이 없다면 3000번 포트로 안내하고 있네요.

app.module.ts

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';

@Module({
	imports: [],
	controllers: [AppController],
	providers: [AppService],
})

export class AppModule {}
  • @Module() 데코레이터를 사용하여 모듈을 정의합니다
  • imports: 다른 모듈을 불러와서 기능을 확장할 수 있습니다
  • controllers: 요청을 처리하는 컨트롤러(AppController)를 등록합니다
  • providers: 서비스를 제공하는 프로바이더(AppService)를 등록합니다(주로 서비스 클래스)

app.service.ts

@Injectable()
export class AppService {
  getHello(): string {
    return "Hello World!";
  }
}
  • @Injectable()을 쓴다면, 이 클래스를 자동으로 인스턴스화하고 주입할 수 있게 됩니다. 즉, 다른 클래스에서 new로 직접 생성할 필요 없이 자동으로 사용 가능하게 만들어 주게 됩니다.

app.controller.ts

@Controller()
export class AppController {
  constructor(private readonly appService: AppService) {}
// route: /
  @Get()
  getHello(): string {
	// injectable로 만들어진 객체
    return this.appService.getHello();
  }
}
  1. 라우팅 처리
    • HTTP 요청을 받아서 적절한 엔드포인트로 연결
    • @Get(), @Post() 등의 데코레이터를 사용해 라우트 정의
    • @Body()를 통해 데이터를 body로 받을 수 있습니다.
  2. 요청/응답 처리
    • 클라이언트의 요청(Request) 데이터 받기
    • 적절한 응답(Response) 반환
  3. 비즈니스 로직 연결
    • Service 계층과 연결하여 실제 비즈니스 로직 실행
    • 데이터 유효성 검사 및 전처리를 합니다.