๐ Nest.js ํ๋ก์ ํธ๋ฅผ ๋ง๋ค๊ณ , ํจํค์ง์ ๋ํด ๊ณต๋ถํ ๋ด์ฉ์ ์ ๋ฆฌํ ๊ธ์ ๋๋ค.
๐ฃ ์ฐธ๊ณ ์ฌํญ
1๏ธโฃ node์ npm์ด ์ค์น๋์ด์๋ ๊ฒ์ ๊ฐ์ ํ๊ณ ์งํํฉ๋๋ค.
2๏ธโฃ node ๋ฒ์ ์ 21.5.0, npm์ 10.2.4๋ฒ์ ์ ๋๋ค
NestJS ํ๋ก์ ํธ ์์ํ๊ธฐ
ํฐ๋ฏธ๋์์ ์๋ ๋ช ๋ น์ด๋ฅผ ์คํํด nest-cli๋ฅผ ์ค์นํฉ๋๋ค.
@nest/cli๋ NestJS์์ ์ ๊ณตํ๋ Command Line Interface์ด๋ฏ๋ก -g ์ต์ ์ผ๋ก ์ค์นํ์ฌ ์ ์ญ์์ ์ฌ์ฉํ ์ ์๋๋ก ํด์ผํฉ๋๋ค.
npm install -g @nest/cli
์๋ก์ด NestJS ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋๋ ๋ช ๋ น์ด์ ๋๋ค.
. ์ ํ์ฌ ๋๋ ํ ๋ฆฌ์ ๋ง๋๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
nest new .
๋๋ ํ ๋ฆฌ ๊ฒฝ๋ก๋ฅผ ์ ๋ ฅํด์ ๋ง๋ค์๋ ์์ต๋๋ค.
nest new ๋๋ ํ ๋ฆฌ๊ฒฝ๋ก
๊ทธ๋ผ ์ด๋ค ํจํค์ง ๋งค๋์ ๋ฅผ ์ฌ์ฉํ๊ฒ ๋๊ณ ๋ฌผ์์ด ๋์ค๋๋ฐ ์ ๋ npm์ผ๋ก ํ์ต๋๋ค.
npm, yarn, pnpm ๋ชจ๋ ์๊ด ์์ต๋๋ค.
์ค์น๊ฐ ์๋ฃ๋์๋ค๋ฉด ์๋ ๋ช ๋ น์ด๋ฅผ ์คํํด ํ์ํ ํจํค์ง๋ฅผ ๋ค์ด ๋ฐ์ต๋๋ค.
npm install
์๋ ๋ช
๋ น์ด๋ฅผ ์คํํ๊ณ localhost:3000์ ์ ์ํ๋ฉด ์๋์ ๊ฐ์ ํ๋ฉด์ด ๋์ต๋๋ค.
npm run start
NestJS ํ๋ก์ ํธ ๋๋ ํฐ๋ฆฌ ๊ตฌ์กฐ
- node_modules: ํ๋ก์ ํธ์์ ์ฌ์ฉํ๋ npm ํจํค์ง๋ค์ด ์ค์น๋๋ ๋๋ ํฐ๋ฆฌ์ ๋๋ค. ์ด ๋๋ ํฐ๋ฆฌ๋ ์ง์ ์๋์ง ์์ผ๋ฉฐ, npm์ด๋ yarn๊ณผ ๊ฐ์ ํจํค์ง ๋งค๋์ ๋ฅผ ํตํด ์๋์ผ๋ก ์์ฑ๋ฉ๋๋ค.
- src: ์์ค ์ฝ๋๊ฐ ์ ์ฅ๋๋ ๋๋ ํฐ๋ฆฌ์
๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์
์ฝ๋ ๋ฐ ๋ชจ๋, ์ปจํธ๋กค๋ฌ, ์๋น์ค ๋ฑ์ด ์ฌ๊ธฐ์ ์์นํฉ๋๋ค.
- src/main.ts: ์ ํ๋ฆฌ์ผ์ด์ ์ ์ง์ ์ (entry point)์ ๋๋ค. ์ด ํ์ผ์์ NestJS ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ฑํ๊ณ ์์ํ๋ ์ฝ๋๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค.
- src/app.module.ts: ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฃผ ๋ชจ๋์ ๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ธฐ๋ณธ ์ค์ ๋ฐ ์ฃผ์ ๊ตฌ์ฑ ์์๋ค์ด ์ฌ๊ธฐ์ ์ ์๋ฉ๋๋ค.
- test: ํ ์คํธ ํ์ผ๋ค์ด ์ ์ฅ๋๋ ๋๋ ํฐ๋ฆฌ์ ๋๋ค. NestJS๋ ๊ธฐ๋ณธ์ ์ผ๋ก Jest๋ฅผ ์ฌ์ฉํ์ฌ ํ ์คํธ๋ฅผ ๊ด๋ฆฌํฉ๋๋ค.
- tsconfig.json: TypeScript ์ปดํ์ผ๋ฌ ์ค์ ํ์ผ์ ๋๋ค. TypeScript ์ปดํ์ผ๋ฌ๊ฐ ์ด๋ป๊ฒ ๋์ํ๊ณ ํ๋ก์ ํธ๋ฅผ ์ด๋ป๊ฒ ์ปดํ์ผํ ์ง์ ๋ํ ์ค์ ์ด ์ ์๋์ด ์์ต๋๋ค.
- package.json ๋ฐ package-lock.json ๋๋ yarn.lock: ํ๋ก์ ํธ์ ์์กด์ฑ ๋ฐ ์คํฌ๋ฆฝํธ ๋ฑ์ด ์ ์๋ ํ์ผ๋ค์ ๋๋ค.
- nest-cli.json: NestJS CLI ์ค์ ํ์ผ๋ก, ํ๋ก์ ํธ์ ๋ํ CLI ๋์์ ์ค์ ํฉ๋๋ค.
์ฌ๊ธฐ์๋ถํฐ๋ ํจํค์ง๋ฅผ ํ๋ํ๋ ์ค์นํ๊ณ , ํ์ผ์ ๋ง๋ค์ด์ NestJS ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ํฉ๋๋ค!
๊ณต๋ถํ์ค ๋ถ๋ค๋ง ์ฝ์ด์ฃผ์ธ์ ๐
NestJS ์ค์นํ๊ธฐ
ํ๋ก์ ํธ ๋๋ ํฐ๋ฆฌ์์ ์๋ ๋ช ๋ น์ ์ ๋ ฅํ์ฌ ์์กด์ฑ ํจํค์ง๋ฅผ ์ค์นํฉ๋๋ค.
cd ํ๋ก์ ํธ๋๋ ํฐ๋ฆฌ๊ฒฝ๋ก
npm install @nestjs/core @nestjs/common @nestjs/platform-express reflect-metadata typescript
NestJS ํ๊ฒฝ์ ์ ์ญ์ผ๋ก ์ค์นํ๊ฒ ์ต๋๋ค. @nestjs/cli ๋ NestJS ํ๋ ์์ํฌ์์ ์ ๊ณตํ๋ Command Line Interface์ ๋๋ค.
๋ ์ด์ด์ ์ค์นํ๋ ํจํค์ง์ ๋ํด์ ๊ฐ๋ตํ๊ฒ ์ค๋ช ํ๊ฒ ์ต๋๋ค.
- @nestjs/core: NestJS ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ธฐ๋ณธ ๊ตฌ์กฐ์ ๋ฐํ์์ ์ ๊ณต
- @nestjs/common: NestJS์์ ๊ณตํต์ผ๋ก ์ฌ์ฉ๋๋ ์ ํธ๋ฆฌํฐ ๋ฐ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ ๊ณต
- @nestjs/platform-express: NestJS ์ ํ๋ฆฌ์ผ์ด์ ์ ์ต์คํ๋ ์ค์ req, res ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- reflect-metadata: TypeScript์ ํจ๊ป ์ฌ์ฉ๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- typescript: TypeScript ์ธ์ด๋ฅผ ์ฌ์ฉํ์ฌ NestJS ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ๊ธฐ ์ํด ํ์ํ ํจํค์ง
package.json ์ ์๋์ฒ๋ผ ์์กด์ฑ์ด ์ถ๊ฐ๋ ๊ฒ์ ํ์ธํด์ฃผ์ธ์
{
"dependencies": {
"@nestjs/common": "^10.3.0",
"@nestjs/core": "^10.3.0",
"@nestjs/platform-express": "^10.3.0",
"reflect-metadata": "^0.1.14",
"typescript": "^5.3.3"
}
}
ํ์ ์คํฌ๋ฆฝํธ ์ค์ ํ๊ธฐ
NestJS๋ ํ์ ์คํฌ๋ฆฝํธ ๋ฌธ๋ฒ์ ์ง์ํ๊ธฐ ๋๋ฌธ์ ํ์ ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ์ฌ NestJS๋ฅผ ๋์ฑ ํธ๋ฆฌํ๊ฒ ๊ฐ๋ฐํ ์ ์์ต๋๋ค.
ํ์ ์คํฌ๋ฆฝํธ๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ํ์ ์ ์ถ๊ฐํ ์ธ์ด๋ผ๊ณ ์๊ฐํ์๋ฉด ๋๊ณ , ์๋ฐ์คํฌ๋ฆฝํธ๋ก ํธ๋์คํ์ผ๋์ด ์คํ๋ฉ๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ด๋ค์์ผ๋ก ํ์ ์คํฌ๋ฆฝํธ ํ์ผ์ ์ปดํ์ผ ํ ์ง ์ค์ ํด์ผ ํฉ๋๋ค.
ํ๋ก์ ํธ ๋ฃจํธ์ tsconfig.json ํ์ผ์ ์์ฑํ๊ณ ์๋ ์ฝ๋๋ฅผ ์ถ๊ฐํ๋๋ก ํฉ์๋ค.
{
"compilerOptions": {
"module": "CommonJS",
"target": "ESNext",
"experimentalDecorators": true,
"emitDecoratorMetadata": true
}
}
์ ์ฝ๋์ ๋ํด ๊ฐ๋ตํ๊ฒ ์ค๋ช ํ๊ฒ ์ต๋๋ค.
- module: "CommonJS": ์ด ์ต์ ์ TypeScript๊ฐ ๋ชจ๋์ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ ์ง๋ฅผ ์ง์
- target: "ESNext": TypeScript๊ฐ ์์ฑํ๋ JavaScript ์ฝ๋๊ฐ ์ด๋ค ๋ฒ์ ์ ๋์์ผ๋ก ํ๋์ง๋ฅผ ๋ํ๋
- experimentalDecorators: true: ์ด ์ต์ ์ TypeScript๊ฐ ์คํ์ ์ธ ๋ฐ์ฝ๋ ์ดํฐ ๋ฌธ๋ฒ์ ์ฌ์ฉํ ์ ์๋๋ก ํ์ฉํ๋ ๊ฒ. ๋ฐ์ฝ๋ ์ดํฐ๋ ํด๋์ค ๋ฐ ํด๋์ค ๋ฉค๋ฒ์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ๋ ๋ฐ ์ฌ์ฉ๋จ. NestJS์ ๊ฐ์ ํ๋ ์์ํฌ์์ ์์ฃผ ์ฌ์ฉ.
- emitDecoratorMetadata: true: ๋ฐ์ฝ๋ ์ดํฐ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์์ฑํ ์ง ์ฌ๋ถ๋ฅผ ๋ํ๋. ์ด ์ต์ ์ true๋ก ์ค์ ํ๋ฉด, ๋ฐ์ฝ๋ ์ดํฐ์ ๋ํ ๋ฉํ๋ฐ์ดํฐ๊ฐ ๋ฐํ์์์ ์ฌ์ฉ ๊ฐ๋ฅ. NestJS์ ๊ฐ์ ํ๋ ์์ํฌ์์๋ ์ด ๋ฉํ๋ฐ์ดํฐ๋ฅผ ํตํด ์์กด์ฑ ์ฃผ์ ๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ๊ตฌํ.
NestJS ๋ชจ๋๊ณผ ์ปจํธ๋กค๋ฌ ๋ง๋ค๊ธฐ
๋ฃจํธ ํด๋์ src ํด๋๋ฅผ ๋ง๋ค๊ณ src ์์ app.controller.ts ํ์ผ์ ๋ง๋ค๊ฒ ์ต๋๋ค.
import { Controller, Get } from "@nestjs/common";
@Controller()
export class HelloController {
@Get()
hello() {
return "Hello NestJS"
}
}
import { Controller, Get } from "@nestjs/common";
- @nestjs/common ํจํค์ง์์ Controller์ Get๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
- Controller ๋ฐ์ฝ๋ ์ดํฐ๋ ํด๋์ค๋ฅผ NestJS ์ปจํธ๋กค๋ฌ๋ก ์ ์ธํฉ๋๋ค.
- Get ๋ฐ์ฝ๋ ์ดํฐ๋ ํด๋น ๋ฉ์๋๊ฐ HTTP GET ์์ฒญ์ ์ฒ๋ฆฌํ๋ ํธ๋ค๋ฌ๋ผ๋ ๊ฒ์ ๋ํ๋ ๋๋ค.
@Controller()
- ํด๋์ค HelloController์ ์ปจํธ๋กค๋ฌ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ ์ฉํฉ๋๋ค.
@Get()
- hello ๋ฉ์๋๊ฐ HTTP GET ์์ฒญ์ ์ฒ๋ฆฌํ๋ ํธ๋ค๋ฌ์์ ์ ์ธํฉ๋๋ค.
- hello ๋ฉ์๋๋ ๋ฌธ์์ด "Hello NestJS"๋ฅผ ๋ฐํํฉ๋๋ค.
src ํด๋ ์์ app.module.tsํ์ผ์ ๋ง๋ค๊ณ ์๋ ์ฝ๋๋ฅผ ์ถ๊ฐํ๊ฒ ์ต๋๋ค.
import { Module } from "@nestjs/common";
import { HelloController } from "./app.controller";
@Module({
controllers: [HelloController],
})
export class HelloModule {}
import { Module } from "@nestjs/common";
- @nestjs/common ํจํค์ง์์ Module ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
- Module ๋ฐ์ฝ๋ ์ดํฐ๋ NestJS ๋ชจ๋์ ์ ์ํ ๋ ์ฌ์ฉ๋ฉ๋๋ค.
import { HelloController } from "./app.controller";
- ํ์ฌ ๋ชจ๋์์ ์ฌ์ฉํ ์ปจํธ๋กค๋ฌ์ธ HelloController๋ฅผ app.controller.ts ํ์ผ์์ ๊ฐ์ ธ์ต๋๋ค.
- ์ปจํธ๋กค๋ฌ๋ ํด๋น ๋ชจ๋์์ ๋ผ์ฐํ ์ ์ฒ๋ฆฌํ๋ ์ญํ ์ ํฉ๋๋ค.
@Module({ controllers: [HelloController] })
- @Module ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ NestJS ๋ชจ๋์ ์ ์ํฉ๋๋ค.
- ๊ฐ์ฒด ๋ฆฌํฐ๋ด ์์ controllers ์์ฑ์ ์ฌ์ฉํ์ฌ ํ์ฌ ๋ชจ๋์์ ์ฌ์ฉํ ์ปจํธ๋กค๋ฌ๋ค์ ๋ฐฐ์ด๋ก ์ ๋ฌํฉ๋๋ค. ์ฌ๊ธฐ์๋ HelloController๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
export class HelloModule {}
- HelloModule ํด๋์ค๋ฅผ ์ ์ธํ๊ณ ์ธ๋ถ์์ ์ฌ์ฉํ ์ ์๋๋ก ๋ด๋ณด๋ ๋๋ค.
- ์ด ํด๋์ค๋ NestJS ๋ชจ๋์ ๋ํ๋ด๋ฉฐ, ํด๋น ๋ชจ๋์ HelloController๋ฅผ ํฌํจํ๊ณ ์์ต๋๋ค.
NestJS ์ ํ๋ฆฌ์ผ์ด์ ์คํํ๊ธฐ
src ํด๋์ main.ts ํ์ผ์ ์์ฑํฉ๋๋ค.
import { NestFactory } from "@nestjs/core";
import { HelloModule } from "./app.module";
const PORT = 3000;
// NestJS๋ฅผ ์์์ํค๋ ํจ์
async function bootstrap() {
const app = await NestFactory.create(HelloModule);
await app.listen(PORT, () => { console.log(`์๋ฒ๊ฐ ${PORT}์์ ์คํ ์ค`)})
}
bootstrap()
import { NestFactory } from "@nestjs/core"
- NestJS์ ํต์ฌ ํจํค์ง์ธ @nestjs/core์์ NestFactory๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
- NestFactory๋ NestJS ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ฑํ๋ ๋ฐ ์ฌ์ฉ๋๋ ํฉํ ๋ฆฌ ํด๋์ค์ ๋๋ค.
import { HelloModule } from "./app.module"
- ํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉํ ๋ชจ๋์ธ HelloModule์ app.module.ts ํ์ผ์์ ๊ฐ์ ธ์ต๋๋ค.
- ์ด ๋ชจ๋์ ์์ ์ค๋ช ํ ๊ฒ์ฒ๋ผ NestJS ๋ชจ๋์ ๋ํ๋ ๋๋ค.
async function bootstrap() { ... }
- ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ํ๋ bootstrap ํจ์๋ฅผ ์ ์ํฉ๋๋ค. ์ด ํจ์๋ NestJS ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ฑํ๊ณ ํฌํธ์ ๋ฐ์ธ๋ฉํ์ฌ ์๋ฒ๋ฅผ ์์ํฉ๋๋ค.
const app = await NestFactory.create(HelloModule);
- NestFactory.create ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ HelloModule์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ NestJS ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ฑํฉ๋๋ค.
- ์์ฑ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ app ๋ณ์์ ํ ๋น๋ฉ๋๋ค.
await app.listen(PORT, () => { console.log(์๋ฒ๊ฐ ${PORT}์์ ์คํ ์ค)})
- app.listen ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ง์ ๋ ํฌํธ(PORT)์์ ์คํํฉ๋๋ค.
- ์๋ฒ๊ฐ ์์๋๋ฉด ์ฝ๋ฐฑ ํจ์๊ฐ ํธ์ถ๋๊ณ , ์ฝ์์ ์๋ฒ๊ฐ ์ด๋ ํฌํธ์์ ์คํ ์ค์ธ์ง์ ๋ํ ๋ฉ์์ง๊ฐ ์ถ๋ ฅ๋ฉ๋๋ค.
bootstrap()
- bootstrap ํจ์๋ฅผ ํธ์ถํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ํฉ๋๋ค. ์ด ํจ์๋ ๋น๋๊ธฐ๋ก ๋์ํ๋ฏ๋ก await ํค์๋๋ฅผ ํจ๊ป ์ฌ์ฉํฉ๋๋ค.
์ด์ ํฐ๋ฏธ๋์์ ์๋ ๋ช ๋ น์ด๋ฅผ ํตํด ๋ค์คํธ ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํฉ๋๋ค.
npx ts-node-dev src/main.ts
ํ์ ์คํฌ๋ฆฝํธ๋ก ๋ง๋ ํ๋ก๊ทธ๋จ์ ๋ฐ๋ก ์คํํ๋ ค๋ฉด ts-node-dev ๋ผ๋ ํจํค์ง๊ฐ ์์ด์ผ ํฉ๋๋ค. ์ค์นํ์ง ์๊ณ ์คํํ๋ ค๋ฉด ์ค์นํ ์ง ์ฌ๋ถ๋ฅผ ๋ฌผ์ด๋ณด๋๋ฐ, ์ด๋ y๋ฅผ ์ ๋ ฅํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ด ์์๋ฉ๋๋ค.
localhost:3000์ ์ ์ํ์ ๋ Hello NestJS๊ฐ ๋ณด์ด๋ฉด ์ฑ๊ณต์ ๋๋ค!
๋ค์ ๊ธ์์๋ NestJS์ ์์ฒญ ์ฒ๋ฆฌ ์์์ API ๋ง๋๋ ๋ฐฉ๋ฒ์ ๋ํด ์๊ฐํ๊ฒ ์ต๋๋ค!
'Framework > NestJS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[NestJS] ๋ด์ฅ ํ์ดํ(validationPipe)๋ฅผ ์ฌ์ฉํด์ ์ ํจ์ฑ ๊ฒ์ฌํ๊ธฐ (0) | 2023.12.30 |
---|