Nest.js 시작하기
2025-02-05
Nest
Why Nest.js?
- 아키텍처와 유지보수 용이성
- 모듈(Module), 컨트롤러(Controller), 서비스(Service), 의존성 주입(Dependency Injection, DI) 같은 개념을 활용하여 확장성과 코드 재사용성이 뛰어난 구조를 제공
- 의존성 주입(DI, Dependency Injection) 지원
@Injectable()데코레이터를 사용해 서비스를 모듈에 자동으로 주입
- 타입스크립트(Typescript) 기본 지원
- 내장된 미들웨어 & 가드 기능으로 인증/인가(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();
}
}
- 라우팅 처리
- HTTP 요청을 받아서 적절한 엔드포인트로 연결
@Get(),@Post()등의 데코레이터를 사용해 라우트 정의@Body()를 통해 데이터를 body로 받을 수 있습니다.
- 요청/응답 처리
- 클라이언트의 요청(Request) 데이터 받기
- 적절한 응답(Response) 반환
- 비즈니스 로직 연결
- Service 계층과 연결하여 실제 비즈니스 로직 실행
- 데이터 유효성 검사 및 전처리를 합니다.