๐ NestJS ํ๋ก์ ํธ ์์๊ณผ ๊ตฌ์กฐ์ ์ดํด
์ง๊ธ์ ํ๋ก ํธ์๋ ๊ฐ๋ฐ์์ด์ง๋ง ํญ์ ๋ฐฑ์๋ ๊ฐ๋ฐ๋ ํจ๊ป ํด์ผ๊ฒ ๋ค๋ ์๊ฐ์ ์ง๋๊ณ ์ด์์ต๋๋ค.
๋์ค์ ์ข์ ์์ด๋์ด๊ฐ ์์ผ๋ฉด ํผ์์ ์ค๋กฏ์ด ์ค๊ณํ๊ณ ๊ตฌํํ ์ ์์ด์ผ ์ค๋ ์ด์๋จ์ ์ ์๊ฒ ๋ค๊ณ ๋๊ผ๊ธฐ ๋๋ฌธ์ ๋๋ค.
์๋ฌด๋๋ ์๋ฐ์ ์คํ๋ง์ด ์ฌ๋ฌ๋ชจ๋ก ์ ๋ฆฌํ ๋ฉด์ด ๋ง์ง๋ง, ๊ฑฐ์ ์ ๊ณ ํ์ค์ด ๋ ๋ฆฌ์กํธ์ ํจ๊ป JS, TS๋ฅผ ์ฌ์ฉํ๋ NestJS ๋ผ๋ฉด ์๋์ง ํจ๊ณผ๋ก ์ธํด ๊ฐ๋ฐ ์๋๋ฅผ ์ ๋ง ๋น ๋ฅด๊ฒ ํฅ์์ํฌ ์ ์์์ ๋๊ผ์ต๋๋ค.
๋ํ NestJS๊ฐ ์คํ๋ง์ ๊ตฌ์กฐ์ ๊ฑฐ์ ์ ์ฌํ๋ฐ, ์ด๋ ์ ์ ์คํ๋ง ํ์ต์ ํด ๋ ๋์ ๋น ๋ฅธ ์ ์์ ํ ์ ์์ด์ NestJS๋ฅผ ๋ฐฐ์๋ด์ผ๊ฒ ๋ค๋ ์ฃผ์ํ ๊ณ๊ธฐ๊ฐ ๋์์ต๋๋ค.
๊ทธ๋ผ ์์ผ๋ก NestJS ํ์ต์ ์์ํ๋ฉฐ ๊ทธ ์์์ธ ํ๋ก์ ํธ ์์ฑ๋ถํฐ ๊ธฐ๋กํ๋๋ก ํ๊ฒ ์ต๋๋ค.
๐ NestJS ์ค์น
$ npm i -g @nestjs/cli
$ nest new project-name
$ nest --version
npm์ ์ด์ฉํด ๊ธ๋ก๋ฒ๋ก @nestjs/cli
๋ชจ๋์ ์ค์น ํ ๋ค nest new
๋ช
๋ น์ด๋ก ํ๋ก์ ํธ๋ฅผ ์์ฑํฉ๋๋ค.
๋ฒ์ ํ์ธ์ ํตํด ์ ๋๋ก ์ค์น๋์๋์ง ํ์ธํ ์ ์์ต๋๋ค.
๊ทธ ํ ๋ณธ์ธ์ด ์ฌ์ฉํ๋ ํจํค์ง ๋งค๋์ ๋ฅผ ์ ํํ๋ฉด ํ๋ก์ ํธ ์์ฑ์ ๋ง์น๊ฒ ๋ฉ๋๋ค.
๐ ์ด๊ธฐ ์์ฑ ํต์ฌ ํ์ผ
ํ๋ก์ ํธ๋ฅผ ์์ฑํ๋ฉด ๋ค์ 5๊ฐ์ ํต์ฌ ํ์ผ์ด ์์ฑ๋ฉ๋๋ค.
๊ทธ ํ์ผ๋ค์ ์ญํ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
app.controller.spec.ts | ์ปจํธ๋กค๋ฌ์ ๋ํ ๋จ์ ํ ์คํธ. |
app.controller.ts | ๋จ์ผ ๊ฒฝ๋ก๋ฅผ ๊ฐ์ถ ๊ธฐ๋ณธ ์ปจํธ๋กค๋ฌ์ ๋๋ค. |
app.module.ts | ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฃจํธ ๋ชจ๋. |
app.service.ts | ๋จ์ผ ์๋น์ค๋ฅผ ์ ๊ณตํ๋ ๊ธฐ๋ณธ ์๋น์ค์ ๋๋ค. |
main.ts | NestFactoryNest ์ ํ๋ฆฌ์ผ์ด์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ธฐ ์ํด ์ฝ์ด ํจ์๋ฅผ ์ฌ์ฉํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๋ ฅ ํ์ผ์ ๋๋ค . |
๊ทธ๋ผ ์ฃผ์ ํ์ผ์ ๋ํ ์ญํ ์ ๋ํด ์์๋ณผ๊น์?
๐ 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();
์ฑ์ ์๋์ ๊ฑธ์ด์ฃผ๋ ์ญํ ์ ๋ด๋นํ๋ main ํ์ผ์ ๋ถํธ์คํธ๋ฉ ํจ์๊ฐ ํฌํจ๋ฉ๋๋ค.
์ด ํ์ผ์์๋ HTTP ๋ฆฌ์ค๋๋ฅผ ์์ํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ธ๋ฐ์ด๋ HTTP ์์ฒญ์ ๊ธฐ๋ค๋ฆฌ๋๋ก ํฉ๋๋ค.
๐ app.controller.ts
import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service';
@Controller() // ์ปจํธ๋กค๋ฌ ๋ฐ์ฝ๋ ์ดํฐ
export class AppController {
constructor(private readonly appService: AppService) {}
@Get() // HTTP GET ์์ฒญ์ ์ฒ๋ฆฌ
getHello(): string {
return this.appService.getHello();
}
}
app.controller.ts๋ NestJS ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ธฐ๋ณธ ์ปจํธ๋กค๋ฌ ํ์ผ๋ก, ์์ฒญ์ ๋ฐ์ ํน์ ๊ฒฝ๋ก์ ๋ํด ์ ์ ํ ์๋ต์ ๋ฐํํ๋ ์ญํ ์ ํฉ๋๋ค.
์ปจํธ๋กค๋ฌ๋ ํด๋ผ์ด์ธํธ ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ ์๋น์ค ๊ณ์ธต์ผ๋ก ์ ๋ฌํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น์ฆ๋์ค ๋ก์ง์ ์ํํ๋ฉฐ, ์ด ๊ฒฐ๊ณผ๋ฅผ ๋ค์ ํด๋ผ์ด์ธํธ์ ๋ฐํํ๋ ๊ตฌ์กฐ์ ๋๋ค.
๐ app.service.ts
import { Injectable } from '@nestjs/common';
@Injectable() // ์๋น์ค ํด๋์ค๋ฅผ ์ฃผ์
๊ฐ๋ฅํ ์ํ๋ก ์ ์
export class AppService {
getHello(): string {
return 'Hello World!';
}
}
app.service.ts๋ NestJS ์ ํ๋ฆฌ์ผ์ด์ ์์ ์๋น์ค ๊ณ์ธต์ ๊ธฐ๋ฅ์ ๋ด๋นํ๋ ํ์ผ๋ก, ์ปจํธ๋กค๋ฌ์์ ์์ฒญ์ ๋ฐ์ ์ค์ ๋น์ฆ๋์ค ๋ก์ง์ ์ํํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
์๋น์ค๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ, ์ธ๋ถ API ํธ์ถ, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๋ ๋ฑ ๋ค์ํ ์์ ์ ์ฒ๋ฆฌํ๋ฉฐ, ์ปจํธ๋กค๋ฌ๋ ์๋น์ค๋ก๋ถํฐ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์ ํด๋ผ์ด์ธํธ์๊ฒ ์ ๋ฌํ๋ ์ญํ ์ ํฉ๋๋ค.
๐ 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 {}
app.module.ts๋ NestJS ์ ํ๋ฆฌ์ผ์ด์ ์ ์ต์์ ๋ชจ๋ ํ์ผ๋ก, ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ฑ ์์๋ฅผ ์ ์ํ๊ณ ์ค์ ํ๋ ์ญํ ์ ํฉ๋๋ค.
NestJS๋ ๋ชจ๋ ์์คํ ์ ๊ธฐ๋ฐ์ผ๋ก ์๋ํ๋ฉฐ, app.module.ts๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ๊ธฐ ์ํ ๊ธฐ๋ณธ ๋ชจ๋์ ๋๋ค.
๋ค๋ฅธ ๋ชจ๋๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก app.module.ts๋ ์ปจํธ๋กค๋ฌ, ์๋น์ค, ๊ทธ๋ฆฌ๊ณ ๋ค๋ฅธ ๋ชจ๋๋ค์ ๊ทธ๋ฃนํํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์กฐ๋ฅผ ์ ์ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
@module ๋ฐ์ฝ๋ ์ดํฐ ์์ ์ปจํธ๋กค๋ฌ, ์๋น์ค ๊ฐ์ ๋ชจ๋์ ์ ์ํด์ฃผ์ด์ผ NestJS๊ฐ ๊ด๋ฆฌํ ์ ์๊ฒ ๋ฉ๋๋ค.
Nest CLI๋ฅผ ์ด์ฉํ๋ค๋ฉด ๋ชจ๋๋ค์ ์ง์ ์์ฑํ๊ณ ์ด ํ์ผ์ ๋ช ์ํ์ง ์์๋ ์ด๋ฌํ ๋ณด์ผ๋ฌํ๋ ์ดํธ๋ฅผ ์๋์ผ๋ก ์์ฑํด์ค๋๋ค.
๐ Nest CLI Generator
Nest CLI์ Generator๋ NestJS ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ ์ ๊ตฌ์กฐ ์์ฑ์ ์๋ํํ๋ ๋๊ตฌ๋ก, ํน์ ๋ช ๋ น์ด๋ฅผ ํตํด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ชจ๋, ์ปจํธ๋กค๋ฌ, ์๋น์ค ๋ฑ์ ๋น ๋ฅด๊ฒ ์์ฑํด ์ค๋๋ค.
์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉด ๋ฐ๋ณต์ ์ธ ํ์ผ ์์ฑ๊ณผ ์ด๊ธฐ ์ฝ๋๋ฅผ ์๋์ผ๋ก ์์ฑํ ์ ์์ด ๊ฐ๋ฐ ์๊ฐ์ ๋จ์ถํ๊ณ ํ๋ก์ ํธ ๊ตฌ์กฐ๋ฅผ ์ผ๊ด๋๊ฒ ์ ์งํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด users๋ ์ด๋ฆ์ ์ปจํธ๋กค๋ฌ๋ฅผ ์์ฑํ ๋๋ ๋ค์๊ณผ ๊ฐ์ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
$ nest generate controller users
$ nest g co users
์์ ๊ฐ์ด ๋ณด์ผ๋ฌ ํ๋ ์ดํธ์ ๋ชจ๋ ๋ฑ๋ก์ ์๋ํํ ์ ์์ต๋๋ค.
์์๋ก ์ปจํธ๋กค๋ฌ๋ฅผ ์ค๋ช ๋๋ ธ๋๋ฐ์.
๊ทธ ์ธ์๋ ์๋ํํ ์ ์๋ ๋ช
๋ น์ ๋ค์๊ณผ ๊ฐ์ด $ nest
๋ช
๋ น์ด๋ก ํ์ธ์ด ๊ฐ๋ฅํฉ๋๋ค.
ํ๋ค์ ๋ณด๋จ alias๋ฅผ ์ด์ฉํ ์ถ์ฝ์ด๋ก ์ฌ์ฉํ๋๊ฒ ํจ์ฌ ํธํ๋ ์ฐธ๊ณ ํด์ฃผ์ธ์.
๐ NestJS์ ๊ตฌ์กฐ
NestJS๋ ๋ชจ๋ํ์ ์์กด์ฑ ์ฃผ์ (DI) ์์น์ ๊ธฐ๋ฐ์ผ๋ก ์ค๊ณ๋ ๊ตฌ์กฐ๋ก, ํ์ฅ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ ๊ณ ๋ คํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ฑํ๋ ๋ฐ ์ค์ ์ ๋ก๋๋ค.
์ด๋ฌํ ๊ตฌ์กฐ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ๋ฌ ๊ณ์ธต์ผ๋ก ๋๋์ด ๊ฐ ๊ณ์ธต์ด ํน์ ์ญํ ์ ๋ด๋นํ๋๋ก ์ค๊ณ๋์ด ์์ต๋๋ค.
๐ Modules
NestJS๋ ๋ชจ๋์ ๊ธฐ๋ฐ์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ฑํ๋ฉฐ, ๊ฐ ๋ชจ๋์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ธฐ๋ฅ์ ์ธ ๋จ์๋ก ์ญํ ์ ๋๋์ด ๋ชจ๋ํ๋ ๊ตฌ์กฐ๋ฅผ ๋ง๋ญ๋๋ค.
- ๋ชจ๋ ํ์ผ(*.module.ts)์ @Module() ๋ฐ์ฝ๋ ์ดํฐ๋ก ์ ์๋๋ฉฐ, ํด๋น ๋ชจ๋์ ์ปจํธ๋กค๋ฌ์ ์๋น์ค๋ค์ ๊ทธ๋ฃนํํฉ๋๋ค.
- ๋ชจ๋์ ํน์ ๊ธฐ๋ฅ์ ๋ด๋นํ๋๋ก ๋ถ๋ฆฌ๋๋ฉฐ, ๋ค๋ฅธ ๋ชจ๋๊ณผ์ ์์กด ๊ด๊ณ๋ฅผ ํตํด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ์ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
- AppModule์ ์ต์์ ๋ชจ๋๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฃจํธ ๋ชจ๋ ์ญํ ์ ํ๋ฉฐ, ์ฌ๊ธฐ์ ๋ค๋ฅธ ๋ชจ๋๋ค์ imports๋ก ๋ถ๋ฌ์ ๋ฑ๋กํฉ๋๋ค.
๐ Controller
์ปจํธ๋กค๋ฌ๋ HTTP ์์ฒญ์ ๋ฐ์ ์ด๋ฅผ ์ฒ๋ฆฌํ๊ณ , ์ ์ ํ ์๋ต์ ๋ฐํํ๋ ์ญํ ์ ํฉ๋๋ค.
์ฃผ๋ก ๋ผ์ฐํ ๋ฐ ์์ฒญ ์ฒ๋ฆฌ๋ฅผ ๋ด๋นํฉ๋๋ค.
- ์ปจํธ๋กค๋ฌ ํ์ผ(*.controller.ts)์ @Controller() ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ํตํด ์ง์ ๋ ๊ฒฝ๋ก๋ก ๋ค์ด์ค๋ ์์ฒญ์ ์ฒ๋ฆฌํ๋ฉฐ, ์์ฒญ์ ์ข ๋ฅ(GET, POST ๋ฑ)์ ๋ง๊ฒ ํธ๋ค๋ฌ ๋ฉ์๋๋ฅผ ์ ์ํฉ๋๋ค.
- ์ปจํธ๋กค๋ฌ๋ ์๋น์ค ๊ณ์ธต์ ํธ์ถํ์ฌ ๋น์ฆ๋์ค ๋ก์ง์ ์ฒ๋ฆฌํ๊ณ , ๊ฒฐ๊ณผ๋ฅผ ํด๋ผ์ด์ธํธ์ ๋ฐํํฉ๋๋ค.
๐ Providers / Service
NestJS์ ์์กด์ฑ ์ฃผ์ ์์คํ ์ ํตํด ์ธ์คํด์คํ๋์ด ์ ๊ณต๋๋ ๋ชจ๋ ํด๋์ค๊ฐ ํ๋ก๋ฐ์ด๋์ ๋๋ค.
์๋น์ค, ๋ฆฌํฌ์งํ ๋ฆฌ, ํฉํ ๋ฆฌ ๋ฑ ๋ค์ํ ์ญํ ์ ํ๋ก๋ฐ์ด๋๊ฐ ๋ด๋นํ๋ฉฐ, ๋น์ฆ๋์ค ๋ก์ง ๋ฐ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ฅผ ์ํํฉ๋๋ค.
- ํ๋ก๋ฐ์ด๋ ํ์ผ(*.service.ts ๋ฑ)์ @Injectable() ๋ฐ์ฝ๋ ์ดํฐ๋ก ์ ์๋์ด ๋ค๋ฅธ ํด๋์ค์ ์ฃผ์ ๋ ์ ์์ต๋๋ค.
- ์๋ฅผ ๋ค์ด, UsersService๋ ์ฌ์ฉ์ ๊ด๋ จ ๋ก์ง์ ์ฒ๋ฆฌํ๋ ์๋น์ค๋ก UsersController์ ์ฃผ์ ๋ฉ๋๋ค.
๐ Middleware, Guards, Interceptors, Pipes
NestJS์๋ ์ถ๊ฐ์ ์ธ ์ฒ๋ฆฌ ๊ณ์ธต์ ์ ๊ณตํ๋ ๋ค์ํ ๊ธฐ๋ฅ์ด ์์ต๋๋ค.
- Middleware
์์ฒญ์ ์ปจํธ๋กค๋ฌ๊ฐ ๋ฐ๊ธฐ ์ ์ ์ฒ๋ฆฌํ๋ ๊ณ์ธต์ ๋๋ค.
๋ก๊น , ์ธ์ฆ ๋ฑ์ ์ฌ์ ์์ ์ ์ํํ ์ ์์ต๋๋ค. - Guards
์์ฒญ์ด ์ฒ๋ฆฌ๋๊ธฐ ์ , ์ ๊ทผ ๊ถํ์ ์ ์ดํ๋ ๋ก์ง์ ํฌํจํฉ๋๋ค.
@UseGuards() ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ํตํด ํน์ ์์ฒญ์ ๋ํด Guard๋ฅผ ์ค์ ํ ์ ์์ต๋๋ค. - Interceptors
์์ฒญ/์๋ต์ ๊ฐ๋ก์ฑ์ด ์ถ๊ฐ์ ์ธ ์์ ์ ์ํํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
์๋ฅผ ๋ค์ด, ์๋ต ๋ฐ์ดํฐ์ ๋ณํ, ์บ์ฑ ๋ก์ง ๋ฑ์ด ๊ฐ๋ฅํฉ๋๋ค. - Pipes
์์ฒญ ๋ฐ์ดํฐ์ ๋ณํ ๋ฐ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ์ํํฉ๋๋ค.
DTO์ ํจ๊ป ์ฌ์ฉ๋์ด ์์ฒญ ๋ฐ์ดํฐ์ ํ์๊ณผ ์ ํจ์ฑ์ ๊ฒ์ฌํฉ๋๋ค.
๐ NestJS ๋ค๋ฅธ ๊ธ
Docker๋ก PostgreSQL ์ค์นํ๊ณ NestJS + prisma ์ฐ๋ํ๊ธฐ
Docker๋ก PostgreSQL ์ค์นํ๊ณ NestJS + prisma ์ฐ๋ํ๊ธฐ
๐ Docker๋ก PostgreSQL ์ค์นํ๊ณ NestJS + prisma ์ฐ๋ํ๊ธฐNestJS๋ก ๊ฐ๋ฐํ ๋ ์ฃผ๋ก prisma์ postgresql์ ์ฌ์ฉํ๋ ์ถ์ธ์ ๋๋ค.์ ์ด๋ ํ ํน์ฅ์ ์ด ์๋์ง, ๊ทธ๋ฆฌ๊ณ ์ด๊ธฐ ์ค์น ๋ฐฉ๋ฒ์ ๋ํด ์ค๋ช ํ๊ฒ ์ต๋
lasbe.tistory.com
NestJS์ prisma๋ก ํธ๋ฆฌํ๊ฒ CRUD ๊ตฌํํ๊ธฐ
NestJS์ prisma๋ก ํธ๋ฆฌํ๊ฒ CRUD ๊ตฌํํ๊ธฐ
๐ NestJS๋ก ํธ๋ฆฌํ๊ฒ CRUD ๊ตฌํํ๊ธฐ์์ฆ NestJS๋ฅผ ์กฐ๊ธ์ฉ ๊ณต๋ถํ๋ฉฐ ์ง๋๋ฅผ ๋๊ฐ๊ณ ์์ต๋๋ค.๊ทธ๋ฐ๋ฐ ์ฌ์ฉํ๋ฉด ์ฌ์ฉํ ์๋ก "์ ๋ง ํธ๋ฆฌํ๋ค"๊ณ ๋๋ผ๋ ์ค์ ๋๋ค. ๊ทธ๋ผ NestJS์ prisma๋ก CRUD api๋ฅผ ๊ตฌ
lasbe.tistory.com
๋๊ธ