[NestJS] NestJS ์ž…๋ฌธ : ๊ตฌ์กฐ์  ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์„ ์œ„ํ•œ ์ฒซ๊ฑธ์Œ๐Ÿš€

2025. 4. 17. 01:16ยท๐Ÿ–ฅ๏ธdevelop/Backend

Nest.js ์Šคํ„ฐ๋””๋ฅผ ์‹œ์ž‘ํ–ˆ๋‹ค. ์ฑ…์ด ์™”์ง€๋งŒ, ์ด๋ ‡๊ฒŒ ์ผ์ฐ ์˜ฌ ์ค„ ๋ชฐ๋ž์–ด์„œ ์ด๋ฒˆ ์ฃผ ๊ณผ์ œ๋Š” ์ธํ”„๋Ÿฐ ๋ฌด๋ฃŒ ๊ฐ•์˜๋ฅผ ์„น์…˜ 3๊นŒ์ง€ ๋“ฃ๊ณ  ์˜ค๋Š”๊ฑธ๋กœ ํ–ˆ๋‹ค. ๋ง‰์ƒ ๋“ฃ๊ณ ๋ณด๋‹ˆ ๋„ˆ๋ฌด ์ดˆ๋ฐ˜ ๋ถ€๋ถ„์ด๊ธด ํ–ˆ์ง€๋งŒ, Nest ๋ง›๋ณด๊ธฐ์—๋Š” ์ถฉ๋ถ„ํ–ˆ์Œ!
 
๊ฐ•์˜ ๋งํฌ

[์ง€๊ธˆ ๋ฌด๋ฃŒ]๋”ฐ๋ผํ•˜๋ฉฐ ๋ฐฐ์šฐ๋Š” NestJS ๊ฐ•์˜ | John Ahn - ์ธํ”„๋Ÿฐ

John Ahn | , ๋…ธ๋“œ ๊ฐœ๋ฐœ์ž๋ผ๋ฉด ์ฃผ๋ชฉ!์š”์ฆ˜ ๋œจ๋Š” NestJS๋ฅผ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค. ๊ฐ•์˜ ์†Œ๊ฐœ ์•ˆ๋…•ํ•˜์„ธ์š”. ์ด๋ฒˆ ๊ฐ•์˜์—์„œ๋Š” NestJS์— ๋Œ€ํ•ด ๋‹ค๋ค„๋ดค์Šต๋‹ˆ๋‹ค. NestJS๋Š”? [์‚ฌ์ง„] ๊ฐ•๋ ฅํ•˜๊ณ  ๊นŒ๋‹ค๋กœ์šด ๋ฐฑ์—”๋“œ ์‹œ์Šคํ…œ์„ ๋งŒ๋“ค๊ธฐ

www.inflearn.com


๐Ÿ˜บNest.js๋ž€?

NestJS๋Š” ํšจ์œจ์ ์ด๊ณ  ํ™•์žฅ ๊ฐ€๋Šฅํ•œ Node.js ์„œ๋ฒ„ ์ธก ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•œ ํ”„๋ ˆ์ž„์›Œํฌ์ด๋‹ค. Javascript์™€ Typescript ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ, ๊ฐ์ฒด์ง€ํ–ฅ, ํ•จ์ˆ˜ํ˜•, ํ•จ์ˆ˜ํ˜• ๋ฐ˜์‘ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์š”์†Œ๋ฅผ ๋ชจ๋‘ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
 
๋‚ด๋ถ€์ ์œผ๋กœ๋Š” Express์™€ ๊ฐ™์€ HTTP ์„œ๋ฒ„ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ, ์„ ํƒ์ ์œผ๋กœ Fastify๋กœ ๋Œ€์ฒดํ•  ์ˆ˜๋„ ์žˆ๋‹ค. NestJS์˜ ํฐ ์žฅ์ ์€ ๊ธฐ์กด ํ”„๋ ˆ์ž„์›Œํฌ ์œ„์— ์ถ”์ƒํ™” ๊ณ„์ธต์„ ์ œ๊ณตํ•˜๋ฉด์„œ๋„, ํ•„์š”ํ•  ๋•Œ๋Š” Express๋‚˜ Fastify์˜ API๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค๋Š” ์ ์ด๋‹ค.

NestJS ์ฒ ํ•™

Node.js ์ƒํƒœ๊ณ„์—๋Š” ์ด๋ฏธ ๋งŽ์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๋„๊ตฌ๊ฐ€ ์žˆ์ง€๋งŒ, ์•„ํ‚คํ…์ฒ˜ ์ธก๋ฉด์˜ ๋ฌธ์ œ๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ํ•ด๊ฒฐํ•ด์ฃผ๋Š” ๊ฒƒ์€ ๋งŽ์ง€ ์•Š์•˜๋‹ค. NestJS๋Š” Angular์—์„œ ์˜๊ฐ์„ ๋ฐ›์•„, ๊ฐœ๋ฐœ์ž๋“ค์ด ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์‰ฝ๊ณ  ํ™•์žฅ ๊ฐ€๋Šฅํ•˜๋ฉฐ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์šฉ์ดํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋„๋ก ๊ตฌ์กฐํ™”๋œ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
Express๋งŒ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ํ…Œ์ŠคํŠธ, ๋กœ๊น…, ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๋“ฑ์˜ ๊ธฐ๋Šฅ์„ ์ผ์ผ์ด ์„ค์ •ํ•ด์•ผ ํ–ˆ์ง€๋งŒ, NestJS๋Š” ์ด๋Ÿฐ ๊ธฐ๋Šฅ๋“ค์„ ๋ช…๋ น์–ด ํ•˜๋‚˜๋กœ ์‰ฝ๊ฒŒ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.
 

NestJS ์‹œ์ž‘ํ•˜๊ธฐ

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

์œ„ ๋ช…๋ น์–ด๋กœ NestJS CLI๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์ƒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ์ƒˆ ํ”„๋กœ์ ํŠธ๊ฐ€ ์ƒ์„ฑ๋˜๋ฉด ์ดˆ๊ธฐ ํ•ต์‹ฌ ํŒŒ์ผ๊ณผ ํด๋” ๊ตฌ์กฐ๊ฐ€ ์ž๋™์œผ๋กœ ๋งŒ๋“ค์–ด์ง„๋‹ค.

์„ค์น˜ ์ฝ˜์†”์ด ๊ท€์—ฌ์›Œ์„œ ์ข€ ๋ฐ˜ํ•จ

CLI๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

NestJS CLI๋Š” ๋‹จ์ˆœํžˆ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ ์ด์ƒ์˜ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค. ๋ชจ๋“ˆ, ์ปจํŠธ๋กค๋Ÿฌ, ์„œ๋น„์Šค ๋“ฑ์˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‰ฝ๊ฒŒ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๊ณ , ํ”„๋กœ์ ํŠธ ๋นŒ๋“œ์™€ ์‹คํ–‰๋„ ๊ฐ„ํŽธํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ Hot Reload ์ง€์›์œผ๋กœ ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.
์ฃผ์š” ๋ช…๋ น์–ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค:

nest new [ํ”„๋กœ์ ํŠธ๋ช…]    // ์ƒˆ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ
nest generate [ํ•ญ๋ชฉ]     // ์ปดํฌ๋„ŒํŠธ ์ƒ์„ฑ
nest build              // ํ”„๋กœ์ ํŠธ ๋นŒ๋“œ
nest start              // ์„œ๋ฒ„ ์‹คํ–‰

๐Ÿ˜ธNestJS ๊ตฌ์กฐ

์•ฑ ๊ตฌ์กฐ

์•„๋ž˜ ๊ตฌ์กฐ๋Š” ๊ฐ•์˜์—์„œ ๋‹ค๋ฃจ๋Š” CRUD ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ์กฐ์ด๋‹ค.

NestJS ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์—ฌ๋Ÿฌ ๋ชจ๋“ˆ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๊ฒŒ์‹œํŒ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค:

App module

-   ๊ฒŒ์‹œ๊ธ€์„ ๋งŒ๋“œ๋Š” ์‚ฌ๋žŒ์— ๋Œ€ํ•œ ์ธ์ฆ ๋ชจ๋“ˆ(AuthModule)
    -   AuthController
    -   UserEntity
    -   AuthService
    -   UserRepository
    -   JWT, PassPort
-   ๊ฒŒ์‹œ๊ธ€์— ๋Œ€ํ•œ ๋ชจ๋“ˆ(BoardModule)
    -   BoardController
    -   BoardEntity
    -   BoardService
    -   BoardRepository
    -   ValidationPipe

 

ํ”„๋กœ์ ํŠธ ๊ธฐ๋ณธ ์ƒ์„ฑ ํŒŒ์ผ

NestJS ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ์—ฌ๋Ÿฌ ์„ค์ • ํŒŒ์ผ๋“ค์ด ์ž๋™์œผ๋กœ ๋งŒ๋“ค์–ด์ง„๋‹ค. ๊ฐ ํŒŒ์ผ์˜ ์—ญํ• ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค:

  • eslintrc.js: ํŠน์ •ํ•œ ๊ทœ์น™์„ ๊ฐ€์ง€๊ณ  ์ฝ”๋“œ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ์งค ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(๋ฌธ๋ฒ• ์˜ค๋ฅ˜ ์ฒดํฌ ๋“ฑ)
  • prettierrc: ์ฝ”๋“œ ํ˜•์‹์„ ๋งž์ถ”๋Š”๋ฐ ์‚ฌ์šฉ(์—๋Ÿฌ๋Š” ์ฐพ์ง€ ์•Š๊ณ , ์ฝ”๋“œ ํฌ๋งทํ„ฐ ์—ญํ• ์„ ํ•จ)
  • nest-cli.json: nest ํ”„๋กœ์ ํŠธ๋ฅผ ์œ„ํ•ด ํŠน์ •ํ•œ ์„ค์ •์„ ํ•  ์ˆ˜ ์žˆ๋Š” json ํŒŒ์ผ
  • tsconfig.json: ์–ด๋–ป๊ฒŒ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ปดํŒŒ์ผํ• ์ง€ ์„ค์ •ํ•˜๋Š” ํŒŒ์ผ
  • tsconfig.build.json: tsconfig.json์˜ ์—ฐ์žฅ์„ ์ƒ ํŒŒ์ผ์ผ, ๋นŒ๋“œ๋ฅผ ํ•  ๋•Œ ํ•„์š”ํ•œ ์„ค์ •๋“ค์„ ์ž‘์„ฑํ•˜๋Š” ํŒŒ์ผ
{
  "extends": "./tsconfig.json",
  "exclude": ["node_modules", "test", "dist", "**/*spec.ts"] //๋นŒ๋“œํ•  ๋•Œ ํ•„์š”์—†๋Š” ํŒŒ์ผ๋“ค ๋ช…์‹œ
}
  • package.json: ๋ช…๋ น์–ด, ์˜์กด์„ฑ ๋“ฑ์ด ์ž‘์„ฑ๋˜์–ด ์žˆ๋Š” ํŒŒ์ผ
  • src ํด๋”: main.ts๋Š” ์•ฑ์„ ์ƒ์„ฑํ•˜๊ณ  ์‹คํ–‰, app.module.ts๋Š” ์•ฑ ๋ชจ๋“ˆ์„ ์ •์˜

 

NestJS ๋กœ์ง ํ๋ฆ„

NestJS ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์š”์ฒญ ์ฒ˜๋ฆฌ ํ๋ฆ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค:

  1. ์‹œ์ž‘์  (Entry Point) main.ts
    • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์‹œ์ž‘์ ์œผ๋กœ, NestFactory๋ฅผ ์‚ฌ์šฉํ•ด ์•ฑ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  HTTP ์„œ๋ฒ„๋ฅผ ์‹œ์ž‘ํ•œ๋‹ค.
  2. ๋ชจ๋“ˆ (Module) app.module.ts
    • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฃจํŠธ ๋ชจ๋“ˆ๋กœ, ์ปจํŠธ๋กค๋Ÿฌ์™€ ์„œ๋น„์Šค๋ฅผ ๋“ฑ๋กํ•˜๊ณ  ๊ด€๋ฆฌํ•œ๋‹ค.
    • ์˜์กด์„ฑ ์ฃผ์ž…์˜ ๊ธฐ๋ฐ˜์ด ๋œ๋‹ค.
  3. ์ปจํŠธ๋กค๋Ÿฌ (Controller) app.controller.ts
    • HTTP ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋ผ์šฐํŒ…์„ ๋‹ด๋‹นํ•œ๋‹ค.
    • ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ๋ฐ›์•„ ์„œ๋น„์Šค๋กœ ์ „๋‹ฌํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.
  4. ์„œ๋น„์Šค (Service) app.service.ts
    • ์‹ค์ œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค.
    • ์ปจํŠธ๋กค๋Ÿฌ๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  5. ์š”์ฒญ-์‘๋‹ต ์‚ฌ์ดํด
    • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์ด๋ฅผ ๋ฐ›์•„ ์„œ๋น„์Šค์— ์ „๋‹ฌํ•˜๊ณ , ์„œ๋น„์Šค๊ฐ€ ์ฒ˜๋ฆฌํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋‹ค์‹œ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์‘๋‹ตํ•œ๋‹ค.
โญ ๊ธฐ๋ณธ์ ์ธ ์š”์ฒญ ํ๋ฆ„์€ request -> controller -> service -> controller -> response ๊ตฌ์กฐ๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค.

๐Ÿ˜นNestJS ๋ชจ๋“ˆ

๋ชจ๋“ˆ์€ @Module() ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋กœ ์ฃผ์„์ด ๋‹ฌ๋ฆฐ ํด๋ž˜์Šค์ด๋‹ค. NestJS ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ตœ์†Œํ•œ ํ•˜๋‚˜์˜ ๋ฃจํŠธ ๋ชจ๋“ˆ์ด ํ•„์š”ํ•˜๋ฉฐ, ์ด ๋ชจ๋“ˆ์„ ์‹œ์ž‘์ ์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๊ตฌ์„ฑ๋œ๋‹ค.

 
๋ชจ๋“ˆ์€ ๊ด€๋ จ๋œ ๊ธฐ๋Šฅ์„ ๊ทธ๋ฃนํ™”ํ•˜๋Š” ํšจ๊ณผ์ ์ธ ๋ฐฉ๋ฒ•์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์‚ฌ์šฉ์ž ๊ด€๋ฆฌ, ๊ฒŒ์‹œํŒ ๊ด€๋ฆฌ ๋“ฑ์˜ ๊ธฐ๋Šฅ์„ ๊ฐ๊ฐ ๋ณ„๋„์˜ ๋ชจ๋“ˆ๋กœ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ฐ ๋ชจ๋“ˆ์€ ์ž์‹ ๋งŒ์˜ ์ปจํŠธ๋กค๋Ÿฌ, ์„œ๋น„์Šค, ๊ธฐํƒ€ ํ”„๋กœ๋ฐ”์ด๋”๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.
 
NestJS์˜ ๋ชจ๋“ˆ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ๊ด€๋ฆฌ๋˜๊ธฐ ๋•Œ๋ฌธ์—, ์—ฌ๋Ÿฌ ๋ชจ๋“ˆ์—์„œ ๋™์ผํ•œ ํ”„๋กœ๋ฐ”์ด๋” ์ธ์Šคํ„ด์Šค๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์„ฑ๊ณผ ์ƒํƒœ ๊ด€๋ฆฌ ์ธก๋ฉด์—์„œ ํฐ ์žฅ์ ์ด๋‹ค.
 
๋ชจ๋“ˆ์˜ ๊ธฐ๋ณธ ๊ตฌ์กฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค:

@Module({
  imports: [๊ด€๋ จ ๋ชจ๋“ˆ๋“ค],
  controllers: [ํ•ด๋‹น ๋ชจ๋“ˆ์˜ ์ปจํŠธ๋กค๋Ÿฌ๋“ค],
  providers: [ํ•ด๋‹น ๋ชจ๋“ˆ์˜ ์„œ๋น„์Šค๋“ค],
  exports: [๋‹ค๋ฅธ ๋ชจ๋“ˆ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋‚ด๋ณด๋‚ผ ์„œ๋น„์Šค๋“ค]
})

์ƒˆ ๋ชจ๋“ˆ์€ CLI๋ฅผ ํ†ตํ•ด ์‰ฝ๊ฒŒ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค:

nest g module boards

์œ„ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด boards ํด๋”๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ๊ทธ ์•ˆ์— ๋ชจ๋“ˆ ํŒŒ์ผ์ด ์ž๋™์œผ๋กœ ์ถ”๊ฐ€๋œ๋‹ค.
 

NestJS ์ปจํŠธ๋กค๋Ÿฌ

์ปจํŠธ๋กค๋Ÿฌ๋Š” ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. @Controller ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ •์˜ํ•˜๋ฉฐ, ์ด ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ์—๋Š” ํ•ด๋‹น ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๋‹ด๋‹นํ•  ๋ผ์šฐํŠธ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด @Controller('boards')๋กœ ์ •์˜ํ•˜๋ฉด ์ด ์ปจํŠธ๋กค๋Ÿฌ๋Š” /boards ๊ฒฝ๋กœ๋กœ ๋“ค์–ด์˜ค๋Š” ๋ชจ๋“  ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋œ๋‹ค.

์ปจํŠธ๋กค๋Ÿฌ๋Š” CLI๋ฅผ ํ†ตํ•ด ์‰ฝ๊ฒŒ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค:

nest g controller boards --no-spec

์—ฌ๊ธฐ์„œ --no-spec ์˜ต์…˜์€ ํ…Œ์ŠคํŠธ ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜์ง€ ์•Š๋„๋ก ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

NestJS ํ•ธ๋“ค๋Ÿฌ

ํ•ธ๋“ค๋Ÿฌ๋Š” ์ปจํŠธ๋กค๋Ÿฌ ํด๋ž˜์Šค ๋‚ด๋ถ€์— ์ •์˜๋œ ๋ฉ”์„œ๋“œ๋กœ, HTTP ์š”์ฒญ ๋ฉ”์„œ๋“œ(@Get, @Post, @Delete ๋“ฑ)์— ๋Œ€์‘ํ•˜๋Š” ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋กœ ์žฅ์‹๋œ๋‹ค. ์ด ๋ฉ”์„œ๋“œ๋“ค์€ ํด๋ผ์ด์–ธํŠธ์˜ ํŠน์ • ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

 
์˜ˆ๋ฅผ ๋“ค์–ด:

@Get()
getAllBoards() {
  return this.boardsService.getAllBoards();
}

์ด ๋ฉ”์„œ๋“œ๋Š” GET ์š”์ฒญ์ด ์ปจํŠธ๋กค๋Ÿฌ์˜ ๊ธฐ๋ณธ ๊ฒฝ๋กœ(/boards)๋กœ ๋“ค์–ด์˜ฌ ๋•Œ ์‹คํ–‰๋œ๋‹ค.

 

NestJS ํ”„๋กœ๋ฐ”์ด๋”

ํ”„๋กœ๋ฐ”์ด๋”๋Š” NestJS์˜ ํ•ต์‹ฌ ๊ฐœ๋… ์ค‘ ํ•˜๋‚˜๋กœ, ๋‹ค์–‘ํ•œ ์ข…๋ฅ˜์˜ ์„œ๋น„์Šค, ๋ฆฌํฌ์ง€ํ† ๋ฆฌ, ํŒฉํ† ๋ฆฌ, ํ—ฌํผ ๋“ฑ์ด ๋ชจ๋‘ ํ”„๋กœ๋ฐ”์ด๋”๋กœ ์ทจ๊ธ‰๋  ์ˆ˜ ์žˆ๋‹ค. ํ”„๋กœ๋ฐ”์ด๋”์˜ ์ฃผ์š” ํŠน์ง•์€ ์˜์กด์„ฑ ์ฃผ์ž…(Dependency Injection)์„ ํ†ตํ•ด ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ์—์„œ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด๋‹ค.
 

๋ชจ๋“ˆ์—์„œ ํ”„๋กœ๋ฐ”์ด๋”๋ฅผ ๋“ฑ๋กํ•˜๋ ค๋ฉด @Module ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ์˜ providers ๋ฐฐ์—ด์— ์ถ”๊ฐ€ํ•˜๋ฉด ๋œ๋‹ค:

@Module({
  controllers: [BoardsController],
  providers: [BoardsService]
})

 

NestJS ์„œ๋น„์Šค

์„œ๋น„์Šค๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋‹ด๋‹นํ•˜๋Š” ํ”„๋กœ๋ฐ”์ด๋”์ด๋‹ค. @Injectable ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋กœ ํ‘œ์‹œ๋˜๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด NestJS์˜ ์˜์กด์„ฑ ์ฃผ์ž… ์‹œ์Šคํ…œ์— ๋“ฑ๋ก๋œ๋‹ค.

 
์ปจํŠธ๋กค๋Ÿฌ๋Š” HTTP ์š”์ฒญ๊ณผ ์‘๋‹ต์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์—ญํ• ์— ์ง‘์ค‘ํ•˜๊ณ , ๋ณต์žกํ•œ ์ž‘์—…์€ ์„œ๋น„์Šค๋กœ ์œ„์ž„ํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์กฐํšŒ, ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ, ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๋“ฑ์˜ ์ž‘์—…์€ ์„œ๋น„์Šค์—์„œ ์ฒ˜๋ฆฌํ•œ๋‹ค.
 
์„œ๋น„์Šค๋Š” CLI๋ฅผ ํ†ตํ•ด ์‰ฝ๊ฒŒ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค:

nest g service boards --no-spec

๐Ÿ’‰์˜์กด์„ฑ ์ฃผ์ž…(Dependency Injection)

์˜์กด์„ฑ ์ฃผ์ž…์€ NestJS์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜๋กœ, ์ปดํฌ๋„ŒํŠธ ๊ฐ„์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ณ  ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ํ…Œ์ŠคํŠธ ์šฉ์ด์„ฑ์„ ๋†’์ด๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. NestJS์—์„œ๋Š” ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•œ๋‹ค.
 
์˜ˆ๋ฅผ ๋“ค์–ด, BoardsController์—์„œ BoardsService๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•œ๋‹ค:

@Controller('boards')
export class BoardsController {
  constructor(private boardsService: BoardsService) {}

  @Get()
  getAllBoards() {
    return this.boardsService.getAllBoards();
  }
}

์—ฌ๊ธฐ์„œ private boardsService: BoardsService๋Š” TypeScript์˜ ๋‹จ์ถ• ๊ตฌ๋ฌธ์œผ๋กœ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜๋ฏธ๋ฅผ ๊ฐ–๋Š”๋‹ค:

  1. BoardsService ํƒ€์ž…์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ƒ์„ฑ์ž์—์„œ ๋ฐ›๋Š”๋‹ค.
  2. ์ด ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํด๋ž˜์Šค์˜ private ์†์„ฑ์œผ๋กœ ์ž๋™ ์ €์žฅํ•œ๋‹ค.

์ด๋Š” ๋‹ค์Œ ์ฝ”๋“œ์™€ ๋™์ผํ•˜๋‹ค:

@Controller('boards')
export class BoardsController {
  private boardsService: BoardsService;

  constructor(boardsService: BoardsService) {
    this.boardsService = boardsService;
  }
}

์ด๋ ‡๊ฒŒ ์˜์กด์„ฑ์„ ์ฃผ์ž…๋ฐ›์œผ๋ฉด ์ปจํŠธ๋กค๋Ÿฌ ๋‚ด์˜ ๋ชจ๋“  ๋ฉ”์„œ๋“œ์—์„œ this.boardsService๋ฅผ ํ†ตํ•ด ์„œ๋น„์Šค์˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. NestJS๋Š” ์ž๋™์œผ๋กœ BoardsService์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  BoardsController์˜ ์ƒ์„ฑ์ž์— ์ „๋‹ฌํ•ด์ค€๋‹ค.

 
์œ„ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋™์ž‘ ๊ณผ์ •์„ ๊ฐ€์ง„๋‹ค:

  1. NestJS๊ฐ€ BoardsController๋ฅผ ์ดˆ๊ธฐํ™”ํ•  ๋•Œ, BoardsService์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์ธ์‹ํ•œ๋‹ค.
  2. NestJS๋Š” BoardsService์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค (๋˜๋Š” ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ์ธ์Šคํ„ด์Šค๋ฅผ ์žฌ์‚ฌ์šฉํ•œ๋‹ค).
  3. ์ด ์ธ์Šคํ„ด์Šค๋ฅผ BoardsController์˜ ์ƒ์„ฑ์ž์— ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌํ•œ๋‹ค.
  4. TypeScript์˜ ๋‹จ์ถ• ๊ตฌ๋ฌธ ๋•๋ถ„์—, ์ด ์ธ์Šคํ„ด์Šค๋Š” ์ž๋™์œผ๋กœ ์ปจํŠธ๋กค๋Ÿฌ์˜ boardsService ํ”„๋กœํผํ‹ฐ์— ํ• ๋‹น๋œ๋‹ค.
  5. ์ด์ œ ์ปจํŠธ๋กค๋Ÿฌ์˜ ๋ชจ๋“  ๋ฉ”์„œ๋“œ์—์„œ this.boardsService๋ฅผ ํ†ตํ•ด ์„œ๋น„์Šค์˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ’”NestJS์˜ ์‹ฑ๊ธ€ํ†ค ๋ชจ๋“ˆ ์‹œ์Šคํ…œ

NestJS์—์„œ ๋ชจ๋“ˆ๊ณผ ํ”„๋กœ๋ฐ”์ด๋”๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์œผ๋กœ ๊ด€๋ฆฌ๋œ๋‹ค. ์ด๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์ฒด์—์„œ ํ•ด๋‹น ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋‹จ ํ•˜๋‚˜๋งŒ ์ƒ์„ฑ๋˜๊ณ  ๊ณต์œ ๋œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.
 
์ด๋Ÿฌํ•œ ์‹ฑ๊ธ€ํ†ค ํŠน์„ฑ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์žฅ์ ์„ ์ œ๊ณตํ•œ๋‹ค:

  1. ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์„ฑ: ๋™์ผํ•œ ์„œ๋น„์Šค๋‚˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ์ƒ์„ฑํ•˜์ง€ ์•Š์•„ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ๊ฐ์†Œํ•œ๋‹ค.
  2. ์ƒํƒœ ๊ณต์œ : ์—ฌ๋Ÿฌ ๋ชจ๋“ˆ์—์„œ ๋™์ผํ•œ ์„œ๋น„์Šค ์ธ์Šคํ„ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์ƒํƒœ ๊ด€๋ฆฌ๊ฐ€ ์ผ๊ด€๋˜๊ฒŒ ์ด๋ฃจ์–ด์ง„๋‹ค.
  3. ์„ฑ๋Šฅ ํ–ฅ์ƒ: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ์ด๋‚˜ ์™ธ๋ถ€ API ํด๋ผ์ด์–ธํŠธ์™€ ๊ฐ™์€ ๋ฆฌ์†Œ์Šค๋ฅผ ํ•œ ๋ฒˆ๋งŒ ์ƒ์„ฑํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ชจ๋“ˆ ๊ฐ„์— ํ”„๋กœ๋ฐ”์ด๋”๋ฅผ ๊ณต์œ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์ •ํ•œ๋‹ค:

// ๋ชจ๋“ˆ A์—์„œ ์„œ๋น„์Šค ์ •์˜ ๋ฐ ๋‚ด๋ณด๋‚ด๊ธฐ
@Module({
  providers: [SharedService],
  exports: [SharedService]
})
export class ModuleA {}

// ๋ชจ๋“ˆ B์—์„œ ๋ชจ๋“ˆ A ๊ฐ€์ ธ์˜ค๊ธฐ
@Module({
  imports: [ModuleA],
  controllers: [SomeController]
})
export class ModuleB {}

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ModuleB์˜ ์ปจํŠธ๋กค๋Ÿฌ๋‚˜ ์„œ๋น„์Šค์—์„œ ModuleA์˜ SharedService๋ฅผ ์˜์กด์„ฑ ์ฃผ์ž…์„ ํ†ตํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
 
์˜ˆ๋ฅผ ๋“ค์–ด, ์นด์šดํ„ฐ ์„œ๋น„์Šค๋ฅผ ์—ฌ๋Ÿฌ ๋ชจ๋“ˆ์—์„œ ๊ณต์œ ํ•˜๋Š” ๊ฒฝ์šฐ:

// ๋ชจ๋“ˆ A์—์„œ ์ •์˜ํ•œ ์„œ๋น„์Šค
@Injectable()
export class SharedService {
  private count = 0;

  incrementCount() {
    this.count++;
    return this.count;
  }
}

// ๋ชจ๋“ˆ A
@Module({
  providers: [SharedService],
  exports: [SharedService], // ๋‹ค๋ฅธ ๋ชจ๋“ˆ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋‚ด๋ณด๋‚ด๊ธฐ
})
export class ModuleA {}

// ๋ชจ๋“ˆ B
@Module({
  imports: [ModuleA], // ModuleA์˜ ์„œ๋น„์Šค๋ฅผ ๊ฐ€์ ธ์™€ ์‚ฌ์šฉ
  controllers: [SomeController],
})
export class ModuleB {}

์ด์ œ ModuleB์˜ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ SharedService๋ฅผ ์ฃผ์ž…๋ฐ›์•„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค:

@Controller('some')
export class SomeController {
  constructor(private sharedService: SharedService) {}

  @Get('increment')
  increment() {
    return this.sharedService.incrementCount();
  }
}

์ด ์ปจํŠธ๋กค๋Ÿฌ์—์„œ /some/increment ์—”๋“œํฌ์ธํŠธ์— ์ ‘๊ทผํ•  ๋•Œ๋งˆ๋‹ค ์นด์šดํ„ฐ๊ฐ€ ์ฆ๊ฐ€ํ•˜๊ณ , ์ด ์นด์šดํ„ฐ ๊ฐ’์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์ฒด์—์„œ ๊ณต์œ ๋œ๋‹ค. ๋‹ค๋ฅธ ๋ชจ๋“ˆ์—์„œ ๊ฐ™์€ SharedService๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋™์ผํ•œ ์นด์šดํ„ฐ ๊ฐ’์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 
์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์€ NestJS์˜ ํ•ต์‹ฌ ์„ค๊ณ„ ์›์น™ ์ค‘ ํ•˜๋‚˜๋กœ, ๋ชจ๋“ˆ๊ณผ ์„œ๋น„์Šค์˜ ํšจ์œจ์ ์ธ ์žฌ์‚ฌ์šฉ๊ณผ ์˜์กด์„ฑ ๊ด€๋ฆฌ๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ์ค‘์š”ํ•œ ๊ฐœ๋…์ด๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ, ์บ์‹œ ์„œ๋น„์Šค, ์„ค์ • ๊ด€๋ฆฌ ๋“ฑ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์ฒด์—์„œ ์ผ๊ด€๋œ ์ƒํƒœ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์— ํŠนํžˆ ์œ ์šฉํ•˜๋‹ค.


์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๋Š”๊ฒŒ ์กฐ๊ธˆ ์–ด๋ ต๊ธด ํ–ˆ๋‹ค. ์˜์กด์„ฑ ์ฃผ์ž…์ด๋ฉฐ ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์ด๋ฉฐ ์ œ๋Œ€๋กœ ๊ณต๋ถ€ํ•ด๋ณธ ์  ์—†๋Š” ๋‚ด์šฉ๋“ค์ด ํœ˜๋ชฐ์•„์ณ์„œ ์ž ๊น ๊ณ ๋น„๊ฐ€ ์žˆ์—ˆ์ง€๋งŒ, ๊ฐ•์˜ ๋ถ„๋Ÿ‰๋„ ์งง๊ณ  ์„ค๋ช…๋„ ์‰ฌ์›Œ์„œ ๋ฌด์‚ฌํžˆ ์ฒซ ์ฃผ ๋ฏธ์…˜์„ ์™„์ˆ˜ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. CLI๋ฅผ ํ†ตํ•ด ๋ชจ๋“ˆ, ์ปจํŠธ๋กค๋Ÿฌ, ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“œ๋Š”๋ฐ ๋„ˆ๋ฌด ํŽธ๋ฆฌํ•ด์„œ NestJS ์ฒซ์ธ์ƒ์€ ์ง„์งœ ์ตœ๊ณ . 

'๐Ÿ–ฅ๏ธdevelop > Backend' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Springboot] 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ์Šคํ”„๋ง๋ถ€ํŠธ ๋„์ „๊ธฐ #3. Create(์—”ํ‹ฐํ‹ฐ๋กœ DB ์ €์žฅํ•˜๊ธฐ)  (2) 2025.01.11
[Springboot] ํ‡ด๊ทผ๊ธธ ๋ฒ„์Šค์•ˆ์—์„œ ํ˜ธ๋‹ค๋‹ฅ ๊ณต๋ถ€ํ•˜๋Š” ์Šคํ”„๋ง๋ถ€ํŠธ-๋„๊ตฌ ์ด์ƒํ˜• ์›”๋“œ์ปต  (3) 2024.12.07
[Springboot] 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ์Šคํ”„๋ง๋ถ€ํŠธ ๋„์ „๊ธฐ #2. Create  (0) 2024.11.23
[Springboot] 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ์Šคํ”„๋ง๋ถ€ํŠธ ๋„์ „๊ธฐ #1. ์Šคํ”„๋ง๋ถ€ํŠธ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑํ•˜๊ธฐ  (2) 2024.11.22
'๐Ÿ–ฅ๏ธdevelop/Backend' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [Springboot] 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ์Šคํ”„๋ง๋ถ€ํŠธ ๋„์ „๊ธฐ #3. Create(์—”ํ‹ฐํ‹ฐ๋กœ DB ์ €์žฅํ•˜๊ธฐ)
  • [Springboot] ํ‡ด๊ทผ๊ธธ ๋ฒ„์Šค์•ˆ์—์„œ ํ˜ธ๋‹ค๋‹ฅ ๊ณต๋ถ€ํ•˜๋Š” ์Šคํ”„๋ง๋ถ€ํŠธ-๋„๊ตฌ ์ด์ƒํ˜• ์›”๋“œ์ปต
  • [Springboot] 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ์Šคํ”„๋ง๋ถ€ํŠธ ๋„์ „๊ธฐ #2. Create
  • [Springboot] 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ์Šคํ”„๋ง๋ถ€ํŠธ ๋„์ „๊ธฐ #1. ์Šคํ”„๋ง๋ถ€ํŠธ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑํ•˜๊ธฐ
ํ‚ํ‚์ž‰
ํ‚ํ‚์ž‰
๋ฟŒ๋ก ํŠธ ๊ฐœ๋ฐœ์ž(์ง€๋ง์ƒ)์˜ ํ’€์Šคํƒ ๊ฐœ๋ฐœ์ž ๋„์ „๊ธฐ
  • ํ‚ํ‚์ž‰
    monicx.dev
    ํ‚ํ‚์ž‰
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (108) N
      • ๐Ÿ–ฅ๏ธdevelop (11)
        • Github (2)
        • Frontend (4)
        • Backend (5)
        • Mobile (0)
        • CS (0)
        • Three.js (0)
        • Docker (0)
      • ๐Ÿ“•review (17)
        • ์ฑ… (12)
        • ํ–‰์‚ฌ (0)
        • ํšŒ๊ณ  (2)
      • โญproject (5)
        • petiary (2)
        • ๆšŽ่ฉ  (0)
        • ์ธํ„ด (2)
      • ๐Ÿ˜ถ‍๐ŸŒซ๏ธalgorithm (0)
      • ๐Ÿ’กtips (1)
      • ๐Ÿ˜Ždaily (10)
      • ๐Ÿ•น๏ธgame (0)
      • ๐Ÿ•Š๏ธํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๋ฐ๋ธŒ์ฝ”์Šค (61) N
        • TIL (37) N
        • ํ”„๋กœ์ ํŠธ (16)
        • ํšŒ๊ณ  (8)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
  • ๋งํฌ

    • ๋ฒจ๋กœ๊ทธ
  • ์ธ๊ธฐ ๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.3
ํ‚ํ‚์ž‰
[NestJS] NestJS ์ž…๋ฌธ : ๊ตฌ์กฐ์  ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์„ ์œ„ํ•œ ์ฒซ๊ฑธ์Œ๐Ÿš€
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”