Framework/Nest.js

์‹ค์‹œ๊ฐ„ ๊ธฐ๋Šฅ (์ฑ„ํŒ…, ์•Œ๋ฆผ, ์„ผ์„œ ๋ฐ์ดํ„ฐ, ๋Œ€์‹œ๋ณด๋“œ ์—…๋ฐ์ดํŠธ ๋“ฑ)์„ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด ์›น์†Œ์ผ“ (WebSocket) ๊ธฐ์ˆ ์ด ํ•„์š”ํ•˜๋‹ค.NestJS๋Š” ์ด๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก Gateway(๊ฒŒ์ดํŠธ์›จ์ด)๋ผ๋Š” ๊ตฌ์กฐ๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ๐Ÿ“ก WebSocketWebSocket์€ ๋ธŒ๋ผ์šฐ์ €์™€ ์„œ๋ฒ„๊ฐ€ ์ง€์†์ ์œผ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์„œ๋กœ ์ž์œ ๋กญ๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ์–‘๋ฐฉํ–ฅ ํ†ต์‹  ๊ธฐ์ˆ ์ด๋‹ค. ๊ธฐ์กด HTTP API ์š”์ฒญ-์‘๋‹ต ๊ตฌ์กฐ๊ฐ€ ์•„๋‹ˆ๋ผ ์—ฐ๊ฒฐ์ด ์œ ์ง€๋œ ์ƒํƒœ์—์„œ ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ฆ‰์‹œ Push๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ๐Ÿงฑ GatewayWebSocket ์„œ๋ฒ„๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” NestJS์˜ Controller ๊ฐ™์€ ์—ญํ• ์„ ํ•œ๋‹ค.NestJS๋Š” ์›น์†Œ์ผ“์„ ํŽธํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋„๋ก Gateway๋ผ๋Š” ์ถ”์ƒํ™” ๋ ˆ์ด์–ด๋ฅผ ์ œ๊ณตํ•œ๋‹ค. โœ… ํด๋ผ์ด์–ธํŠธ์˜ ์—ฐ๊ฒฐ/ํ•ด์ œ ๊ฐ์ง€โœ… ํด..
NestJS์—์„œ ๊ฐ„๋‹จํ•œ API๋ฅผ ์ž‘์„ฑํ•ด๋ณด์ž.์ œ์ผ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ToDo ๊ธฐ๋Šฅ์˜ API๋ฅผ ์ž‘์„ฑํ•ด๋ณด์ž. ๐Ÿ“ TODO๐Ÿ•น๏ธ*.controller.tsAPI์˜ ์ง„์ž…์ .์ฆ‰, ์š”์ฒญ์„ ๋ฐ›๋Š” ๊ณณ์„ ์ •์˜ํ•œ๋‹ค. โœ… URL ๋ผ์šฐํŒ… ์ •์˜ (@Get(), @Post ๋“ฑ)โœ… ์š”์ฒญ Parameter, Body ๋ฐ›๋Š”๋‹ค.โœ… ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์€ ์ž‘์„ฑํ•˜์ง€ ์•Š๋Š”๋‹ค.โœ… ๋Œ€๋ถ€๋ถ„ service์— ์ผ์„ "์œ„์ž„" "/todos" ๊ฒฝ๋กœ๋กœ ์š”์ฒญ์„ ๋ณด๋ƒˆ์„ ๋•Œ CRUD๋ฅผ ์ž‘์„ฑ.import { Controller, Get, Post, Body, Param, Patch, Delete } from '@nestjs/common';import { TodosService } from './todos.service';@Controller('todos')export cl..
๐Ÿš @๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ž€?NestJS์—์„œ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋Š” ํด๋ž˜์Šค, ๋ฉ”์„œ๋“œ, ํ”„๋กœํผํ‹ฐ, ํŒŒ๋ผ๋ฏธํ„ฐ์— ์ถ”๊ฐ€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ๋ถ€์—ฌํ•˜๊ฑฐ๋‚˜ ๋™์ž‘์„ ๋ฐ”๊พธ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.TypeScript์˜ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ๋ฌธ๋ฒ•์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋ฉฐ, NestJS์˜ ํ•ต์‹ฌ ์ฒ ํ•™์ธ ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ + ์˜์กด์„ฑ ์ฃผ์ž…(DI)์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” ํ•ต์‹ฌ ์š”์†Œ์ด๋‹ค. ์‰ฝ๊ฒŒ ๋งํ•ด,"Nest๊ฐ€ ์ด ์ฝ”๋“œ๊ฐ€ ์–ด๋–ค ์—ญํ• ์„ ํ•˜๋Š”์ง€ ์ดํ•ดํ•˜๋„๋ก ์•Œ๋ ค์ฃผ๋Š” ํƒœ๊ทธ" ๐Ÿค” ์™œ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๊ฐ€ ํ•„์š”ํ•œ๋ฐ?NestJS๋Š” Angular ์˜ํ–ฅ์„ ํฌ๊ฒŒ ๋ฐ›์€ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.Nest๋Š” ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ํ†ตํ•ด ํด๋ž˜์Šค๋ฅผ ์Šค์บ”(scanning)ํ•˜๊ณ  ์—ญํ• ์„ ํŒŒ์•…ํ•ด ๋‚ธ๋ถ€ IoC/DI ์ปจํ…Œ์ด๋„ˆ์— ๋“ฑ๋กํ•œ๋‹ค. ์ฆ‰, ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๊ฐ€ ์žˆ์–ด์•ผ Nest๋Š” ๋‹ค์Œ ๋‚ด์šฉ๋“ค์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.โœ… ์–ด๋–ค ํด๋ž˜์Šค๊ฐ€ ์ปจํŠธ๋กค๋Ÿฌ์ธ์ง€โœ… ์–ด๋–ค ํด๋ž˜..
โฌ‡๏ธ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑNestJS ๊ณต์‹ ํ™ˆํŽ˜์ด์ง€์˜ ๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ NestJS๋ฅผ ์‹คํ–‰ํ•ด๋ณด์ž.npm i -g @nestjs/clinest new โš™๏ธ ๊ตฌ์กฐ๊ทธ๋Ÿผ ๋‚ด ํ”„๋กœ์ ํŠธ ํด๋” ํ•˜์œ„์— ์•„๋ž˜ ์‚ฌ์ง„๊ณผ ๊ฐ™์€ ๊ตฌ์กฐ๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.์ด์ œ ๊ฐ ํŒŒ์ผ์˜ ์—ญํ• ์„ ์•Œ์•„๋ณด์ž. ๊ณต์‹ ํ™ˆํŽ˜์ด์ง€์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค๋ช…ํ•˜๊ณ  ์žˆ๋‹ค.FileDescriptionapp.controller.ts๊ธฐ๋ณธ ์ปจํŠธ๋กค๋ŸฌNestJS ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์—”๋“œํฌ์ธํŠธ(๋ผ์šฐํŠธ)๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ์ปจํŠธ๋กค๋Ÿฌ์ด๋‹ค.์ด ํŒŒ์ผ์—๋Š” ๋ณดํ†ต GET/ ๊ฐ™์€ ๊ฐ„๋‹จํ•œ ๊ฒฝ๋กœ๋ฅผ ํ•˜๋‚˜ ์ •์˜ํ•œ๋‹ค.ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ๋ฐ›๊ณ  ์‘๋‹ต์„ ๋Œ๋ ค์ฃผ๋Š” ๊ณ„์ธตapp.controller.spec.ts์ปจํŠธ๋กค๋Ÿฌ ๋‹จ์œ„ ํ…Œ์ŠคํŠธapp.controller.ts์˜ ๊ธฐ๋Šฅ์ด ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋Š”์ง€๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ํŒŒ์ผNes..
ํšŒ์‚ฌ์—์„œ ์‹ค์‹œ๊ฐ„ ๋‹ค์ค‘ ํŽธ์ง‘ (Figma, Notion์—์„œ ์™€ ๊ฐ™์€ ๋ฉ€ํ‹ฐ ํŽธ์ง‘) ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•˜์—ฌ ์„œ๋ฒ„ ๊ณต๋ถ€๋ฅผ ์‹œ์ž‘ํ•ด์•ผํ•œ๋‹ค. ๊ณต๋ถ€๋ฅผ ํ•˜๋ฉด์„œ ์ •๋ฆฌํ•ด๋ณด๊ณ ์ž ์ž‘์„ฑํ•œ๋‹ค. ๐Ÿ˜บ NestJS๋ž€Nest.js๋Š” ํšจ์œจ์ ์ด๊ณ  ํ™•์žฅ ๊ฐ€๋Šฅํ•œ Node.js ๊ธฐ๋ฐ˜์˜ ์„œ๋ฒ„ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•œ ํ”„๋ ˆ์ž„์›Œํฌ์ด๋‹ค.์ตœ์‹  JavaScript ๋ฌธ๋ฒ•์„ ํ™œ์šฉํ•˜๋ฉฐ, TypeScript๋กœ ์™„์ „ํžˆ ์ž‘์„ฑ๋˜๊ณ  ์ง€์›ํ•˜์ง€๋งŒ, ํ•„์š”ํ•˜๋‹ค๋ฉด JavaScript๋กœ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋‹ค. Nest๋Š” ๊ฐ์ฒด์ง€ํ–ฅ(OOP), ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ(FP), ๋ฐ˜์‘ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ(FRP)์˜ ๊ฐœ๋…์„ ์กฐํ™”๋กญ๊ฒŒ ๊ฒฐํ•ฉํ•ด ๊ฒฌ๊ณ ํ•œ ์„œ๋ฒ„ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ์กฐ๋ฅผ ์ œ๊ณตํ•œ๋‹ค. โš™๏ธ๋‚ด๋ถ€ ๋™์ž‘Nest๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ Express๋ฅผ ๊ธฐ๋ณธ HTTP ์„œ๋ฒ„๋กœ ์‚ฌ์šฉํ•˜์ง€๋งŒ, ์„ค์ •๋งŒ ๋ฐ”๊พธ๋ฉด Fastify๋„ ์„ ํƒํ•  ์ˆ˜..
ma.caron_g
'Framework/Nest.js' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๊ธ€ ๋ชฉ๋ก