dev_writer 2025. 7. 4. 00:19

์•ˆ๋…•ํ•˜์„ธ์š”. dev_writer์ž…๋‹ˆ๋‹ค.

 

์ตœ๊ทผ ํšŒ์‚ฌ์—์„œ ์ฝ”ํ‹€๋ฆฐ ๊ธฐ๋ฐ˜ ์Šคํ”„๋ง ๋ฐฑ์—”๋“œ ์„œ๋น„์Šค๋ฅผ, ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋ฐ˜ Nest.js ๋ฐฑ์—”๋“œ ์„œ๋น„์Šค๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ•˜๋Š” ์—…๋ฌด๋ฅผ ์ง„ํ–‰ํ•˜๊ฒŒ ๋˜๋ฉด์„œ ์ž‘๋…„์— ์ž ๊น ์‚ฌ์šฉํ–ˆ๋˜ Nest.js๋ฅผ ๊ณต๋ถ€ํ•ด ๋ณด๊ณ ์ž ๊ธ€์„ ๊ธฐ๋กํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

 

์ง€๊ธˆ ์ž‘์„ฑํ•˜๊ณ  ์žˆ๋Š” Spring AI ์‹œ๋ฆฌ์ฆˆ์ฒ˜๋Ÿผ, ์ด๋ฒˆ์—๋„ Nest.js์˜ ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ๋ฒˆ์—ญํ•˜๋ฉด์„œ ๋ธ”๋กœ๊ทธ์— ๊ธฐ๋กํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

 

์ด๋ฒˆ ์‹œ๊ฐ„์—๋Š” Introduction์— ๋Œ€ํ•œ ๋‚ด์šฉ์„ ์ž‘์„ฑํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.


์†Œ๊ฐœ

์†Œ๊ฐœ

Nest(NestJS)๋Š” ํšจ์œจ์ ์ด๊ณ  ํ™•์žฅ ๊ฐ€๋Šฅํ•œ Node.js ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•œ ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค. ์ ์ง„์ ์ธ JavaScript๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, TypeScript๋กœ ์ž‘์„ฑ๋˜์–ด ์ด๋ฅผ ์™„๋ฒฝํžˆ ์ง€์›ํ•˜์ง€๋งŒ, ์ˆœ์ˆ˜ JavaScript๋กœ๋„ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ(OOP), ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ(FP), ํ•จ์ˆ˜ํ˜• ๋ฐ˜์‘ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ(FRP)์˜ ์š”์†Œ๋“ค์„ ๊ฒฐํ•ฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

๋‚ด๋ถ€์ ์œผ๋กœ๋Š” Express(๊ธฐ๋ณธ๊ฐ’)์™€ ๊ฐ™์€ ๊ฐ•๋ ฅํ•œ HTTP ์„œ๋ฒ„ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, ์˜ต์…˜์— ๋”ฐ๋ผ Fastify๋กœ ๊ตฌ์„ฑํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค!

 

Nest๋Š” ์ด๋Ÿฌํ•œ ์ผ๋ฐ˜์ ์ธ Node.js ํ”„๋ ˆ์ž„์›Œํฌ(Express/Fastify) ์œ„์— ํ•˜๋‚˜์˜ ์ถ”์ƒํ™” ๊ณ„์ธต์„ ์ œ๊ณตํ•˜๋ฉด์„œ๋„, ๋™์‹œ์— ํ•ด๋‹น ํ”„๋ ˆ์ž„์›Œํฌ์˜ API์— ์ง์ ‘ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž๋Š” ๊ธฐ๋ฐ˜ ํ”Œ๋žซํผ์—์„œ ์ œ๊ณตํ•˜๋Š” ์ˆ˜๋งŽ์€ ์„œ๋“œํŒŒํ‹ฐ ๋ชจ๋“ˆ๋“ค์„ ์ž์œ ๋กญ๊ฒŒ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฒ ํ•™

์ตœ๊ทผ ๋ช‡ ๋…„๊ฐ„ Node.js ๋•๋ถ„์— JavaScript๋Š” ํ”„๋ก ํŠธ์—”๋“œ์™€ ๋ฐฑ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ชจ๋‘์—์„œ ์›น์˜ "๊ณตํ†ต ์–ธ์–ด (lingua franca)"๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๊ฐœ๋ฐœ์ž์˜ ์ƒ์‚ฐ์„ฑ์„ ๋†’์ด๊ณ  ๋น ๋ฅด๊ณ  ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅํ•˜๋ฉฐ ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ํ”„๋ก ํŠธ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” Angular, React, Vue ๊ฐ™์€ ๋ฉ‹์ง„ ํ”„๋กœ์ ํŠธ๋“ค์˜ ํƒ„์ƒ์œผ๋กœ ์ด์–ด์กŒ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Node(๋ฐ ์„œ๋ฒ„ ์‚ฌ์ด๋“œ JavaScript)๋ฅผ ์œ„ํ•œ ํ›Œ๋ฅญํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, ๋„์šฐ๋ฏธ, ๋„๊ตฌ๋“ค์€ ๋งŽ์ด ์กด์žฌํ•˜์ง€๋งŒ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์•„ํ‚คํ…์ฒ˜๋ผ๋Š” ํ•ต์‹ฌ ๋ฌธ์ œ๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ํ•ด๊ฒฐํ•ด ์ฃผ๋Š” ๋„๊ตฌ๋Š” ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

 

Nest๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ธฐ๋ณธ์œผ๋กœ ์ œ๊ณตํ•˜์—ฌ, ๊ฐœ๋ฐœ์ž์™€ ํŒ€์ด ๋งค์šฐ ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅํ•˜๊ณ , ํ™•์žฅ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ๋А์Šจํ•˜๊ฒŒ ๊ฒฐํ•ฉ๋˜๊ณ , ์‰ฝ๊ฒŒ ์œ ์ง€ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค๋‹ˆ๋‹ค. ์ด ์•„ํ‚คํ…์ฒ˜๋Š” Angular์—์„œ ํฐ ์˜๊ฐ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค.

์„ค์น˜

์‹œ์ž‘ํ•˜๋ ค๋ฉด Nest CLI๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ์ ํŠธ๋ฅผ ์Šค์บํด๋”ฉ (scaffolding: ๊ฐœ๋ฐœ ์ดˆ๊ธฐ ๋‹จ๊ณ„์—์„œ ๋ผˆ๋Œ€ ์ฝ”๋“œ๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•ด ์ฃผ๋Š” ๊ธฐ๋Šฅ)ํ•˜๊ฑฐ๋‚˜ ์Šคํƒ€ํ„ฐ ํ”„๋กœ์ ํŠธ๋ฅผ ํด๋ก  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๋‘ ๋ฐฉ๋ฒ• ๋ชจ๋‘ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค).

 

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

$ npm i -g @nestjs/cli
$ nest new project-name
ํžŒํŠธ
๋ณด๋‹ค ์—„๊ฒฉํ•œ ๊ธฐ๋Šฅ ์„ธํŠธ๋กœ ์ƒˆ๋กœ์šด TypeScript ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด nest new ๋ช…๋ น์–ด์— --strict ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•˜์„ธ์š”.

๋Œ€์•ˆ

๋˜๋Š”, Git์„ ์‚ฌ์šฉํ•˜์—ฌ TypeScript ์Šคํƒ€ํ„ฐ ํ”„๋กœ์ ํŠธ๋ฅผ ์„ค์น˜ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

$ git clone https://github.com/nestjs/typescript-starter.git project
$ cd project
$ npm install
$ npm run start
ํžŒํŠธ
Git ํžˆ์Šคํ† ๋ฆฌ ์—†์ด ์ €์žฅ์†Œ๋ฅผ ํด๋ก  ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด degit์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๋ธŒ๋ผ์šฐ์ €๋ฅผ ์—ด๊ณ  http://localhost:3000/ ์œผ๋กœ ์ด๋™ํ•˜์„ธ์š”.

 

์Šคํƒ€ํ„ฐ ํ”„๋กœ์ ํŠธ์˜ JavaScript ๋ฒ„์ „์„ ์„ค์น˜ํ•˜๋ ค๋ฉด ์œ„ ๋ช…๋ น์–ด ์‹œํ€€์Šค์—์„œ javascript-starter.git์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

 

๋˜ํ•œ, ์ฝ”์–ด ๋ฐ ์ง€์› ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜์—ฌ ์ฒ˜์Œ๋ถ€ํ„ฐ ์ƒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ํ”„๋กœ์ ํŠธ์˜ ๋ณด์ผ๋Ÿฌ ํ”Œ๋ ˆ์ดํŠธ ํŒŒ์ผ๋“ค์„ ์ง์ ‘ ๊ตฌ์„ฑํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ์„ ์—ผ๋‘์— ๋‘์„ธ์š”. ์ตœ์†Œํ•œ ํ•„์š”ํ•œ ์˜์กด์„ฑ์€ @nestjs/core, @nestjs/common, rxjs, reflect-metadata์ž…๋‹ˆ๋‹ค. ์ฒ˜์Œ๋ถ€ํ„ฐ ์ตœ์†Œํ•œ์˜ NestJS ์•ฑ์„ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ๋Š” ๋‹ค์Œ ์งง์€ ๊ธ€์„ ์ฐธ๊ณ ํ•˜์„ธ์š”: 5๋‹จ๊ณ„๋กœ ๋งŒ๋“œ๋Š” ์ตœ์†Œ ๊ตฌ์„ฑ์˜ NestJS ์•ฑ!

 

Reference