๐Ÿšง

[nestjs] nestjs ๊ธฐ๋ณธ ๊ฐœ๋…๊ณผ ํ”„๋กœ์ ํŠธ ๋กœ์ง ํ๋ฆ„

purpplee 2021. 10. 20. 14:36

nestjs ๊ธฐ๋ณธ ๊ฐœ๋…

๋ชจ๋“ˆ(modules)

์ถœ์ฒ˜: nestjs ๊ณต์‹๋ฌธ์„œ

๋ฐ€์ ‘ํ•˜๊ฒŒ ๊ด€๋ จ๋œ ๊ธฐ๋Šฅ๋“ค์„ ๋ชจ์•„ ๋งŒ๋“  ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ตฌ์„ฑํ’ˆ. (์ž๋™์ฐจ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฐ”ํ€ด, ๋ชธ์ฒด, ์—”์ง„ ๋“ฑ๋“ฑ...)

๊ฐ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—๋Š” ๋ฌด์กฐ๊ฑด ํ•˜๋‚˜ ์ด์ƒ์˜ ๋ชจ๋“ˆ์ด ์žˆ๊ณ , ์ตœ์ƒ์œ„ ๋ชจ๋“ˆ์„ ๋ฃจํŠธ๋ชจ๋“ˆ์ด๋ผ๊ณ  ํ•จ.

ํด๋ž˜์Šค์— @Module() ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ๋‹ฌ์•„ ์ƒ์„ฑํ•จ.

๋ชจ๋“ˆ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‹ฑ๊ธ€ํ†ค์ด๋ฏ€๋กœ ์–ด๋ ค ๋ชจ๋“ˆ ๊ฐ„ ์‰ฝ๊ฒŒ ๊ณต๊ธ‰์ž์˜ ๋™์ผํ•œ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋‹ค. (ex-๊ณตํ†ต ๋ชจ๋“ˆ์„ ์ƒ์„ฑํ•˜์—ฌ, ๋‹ค๋ฅธ ๋ชจ๋“ˆ์—์„œ๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ.)

nest g module module_name
nest g mo mo_name

 

์ปจํŠธ๋กค๋Ÿฌ(controllers)

์ถœ์ฒ˜: nestjs ๊ณต์‹๋ฌธ์„œ

๋“ค์–ด์˜ค๋Š” ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ์—ญํ• .

๊ฐ ์š”์ฒญ์„ ๊ตฌ๋ถ„ํ•˜๋Š” ๋ผ์šฐํ„ฐ ์—ญํ• ์„ ํ•จ.

ํด๋ž˜์Šค์— @Controller ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ๋‹ฌ์•„ ์ƒ์„ฑํ•˜๊ณ , ์ธ์ž๋กœ ์š”์ฒญ์˜ '๊ฒฝ๋กœ' ๋ฅผ ๋ฐ›๋Š”๋‹ค.

  • Handler : Http Method ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๊ฐ€ ๋‹ฌ๋ฆฐ ๋ฉ”์†Œ๋“œ. ์ธ์ž๋กœ '๊ฒฝ๋กœ' ๋ฅผ ๋ฐ›๋Š”๋‹ค. ํ•ด๋‹น ์ปจํŠธ๋กค๋Ÿฌ๋กœ ๋“ค์–ด์˜จ ์š”์ฒญ์„ handle ํ•จ.
nest g controller controller_name
nest g co co_name

 

ํ”„๋กœ๋ฐ”์ด๋”(providers)

์ถœ์ฒ˜: nestjs ๊ณต์‹๋ฌธ์„œ

nestjs ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฐœ๋….

์ปจํŠธ๋กค๋Ÿฌ์— ํ•„์š”ํ•œ ๋งŽ์€ ๊ฒƒ๋“ค์„ ์ปจํŠธ๋กค๋Ÿฌ ์•ˆ์—์„œ ๊ตฌํ˜„ํ•˜๊ธฐ๋ณด๋‹ค, ๊ธฐ๋Šฅ๋ณ„๋กœ ๋‚˜๋ˆ  ๊ตฌํ˜„ํ•œ ๋’ค ์ปจํŠธ๋กค๋Ÿฌ ์•ˆ์— ๋„ฃ์–ด์ฃผ๋Š”๋ฐ ์ด๊ฑธ ํ”„๋กœ๋ฐ”์ด๋”๋ผ๊ณ  ํ•จ.

์ปจํŠธ๋กค๋Ÿฌ ์•ˆ์— ํ”„๋กœ๋ฐ”์ด๋”๋ฅผ ๋„ฃ๋Š” ๊ฑธ '์ฃผ์ž…ํ•œ๋‹ค' ๋ผ๊ณ  ํ•จ.

๋ณดํ†ต ์„œ๋น„์Šค, ๋ ˆํฌ์ง€ํ† ๋ฆฌ, ํŒฉํ† ๋ฆฌ, ํ—ฌํผ ๋“ฑ์ด ์žˆ์Œ.

  • ์„œ๋น„์Šค(service)
    • @Injectable ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋กœ ๊ฐ์‹ธ์ ธ์„œ ์ œ๊ณต๋จ. (ํ”„๋กœ๋ฐ”์ด๋”๋ผ์„œ ์ปจํŠธ๋กค๋Ÿฌ์—๊ฒŒ ์ฃผ์ž…๋˜๊ธฐ ๋•Œ๋ฌธ.)
    • ์„œ๋น„์Šค๋Š” ๋ฐ์ดํ„ฐ ์œ ํšจ์„ฑ ์ฒดํฌ, DB ์•„์ดํ…œ ์ƒ์„ฑ ๋“ฑ์˜ ์ž‘์—…์„ ํ•จ.
    • ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์ฃผ์ž…์‹œ์ผœ์•ผ ํ•จ.
    • ์ด ์„œ๋น„์Šค ์ธ์Šคํ„ด์Šค๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์ฒด์—์„œ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Œ.
  • nest g service service_name
    nest g s s_name
  • //์ฃผ์ž…
    
    @Controller()
    export class Controller {
    	constructor(private service: Service) {}	//private ์ ‘๊ทผ์ œํ•œ์ž ์‚ฌ์šฉํ•˜๋ฉด ์•”๋ฌต์ ์œผ๋กœ ํด๋ž˜์Šค ํ”„๋กœํผํ‹ฐ๋กœ ์„ ์–ธ๋จ
    }

 

๋ฏธ๋“ค์›จ์–ด(middleware)

์›น ๊ฐœ๋ฐœ์—์„œ ์ผ๋ฐ˜์ ์œผ๋กœ ๋ผ์šฐํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์š”์ฒญ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์ „์— ์ˆ˜ํ–‰ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ์˜๋ฏธ.

์ฟ ํ‚ค ํŒŒ์‹ฑ, ์„ธ์…˜ ๊ด€๋ฆฌ, ์ธ์ฆ/์ธ๊ฐ€, ๋ณธ๋ฌธ(http message body) ํŒŒ์‹ฑ ๋“ฑ์„ ๋ณดํ†ต ์ˆ˜ํ–‰ํ•จ.

 

์˜ˆ์™ธ ํ•„ํ„ฐ(exception filters)

์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ๊ณตํ†ต์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ถ€๋ถ„.

nestjs์—์„œ๋Š” ์ž์ฒด์ ์œผ๋กœ ์˜ˆ์™ธ ๋ ˆ์ด๋Ÿฌ๋ฅผ ๋‘๊ณ  ์žˆ๋Š”๋ฐ, ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ œ๋Œ€๋กœ ์ฒ˜๋ฆฌํ•˜์ง€ ๋ชปํ•œ ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•จ.

์ฆ‰, ์ž‘์—…ํ•˜์ง€ ์•Š์€ ์˜ˆ์™ธ๋ฅผ ๊ธฐ๋ณธ์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•˜๋Š” ๊ธฐ๋ณธ ๋ ˆ์ด์–ด๊ฐ€ ์žˆ์Œ.

์ด ์™ธ์— ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ์‹ถ๊ฑฐ๋‚˜, ์ฒ˜๋ฆฌํ•  ๋ฒ”์œ„๋ฅผ ์ง€์ •ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์˜ˆ์™ธ ํ•„ํ„ฐ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๋จ.

 

ํŒŒ์ดํ”„(pipes)

ํด๋ž˜์Šค์— @Injectable() ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ๋‹ฌ์•„ ์ƒ์„ฑ

data transformation(ํ˜•์‹๋ณ€ํ™˜) ๊ณผ data validation(ํ˜•์‹๊ฒ€์‚ฌ) ์„ ์œ„ํ•ด ์‚ฌ์šฉ๋จ. @Param์ด๋‚˜ @Body ๋“ฑ์˜ ์ธ์ž๋กœ ์ „๋‹ฌ.

ํŒŒ์ดํ”„๋Š” ์ปจํŠธ๋กค๋Ÿฌ์˜ ํ•ธ๋“ค๋Ÿฌ๋กœ ์ฒ˜๋ฆฌ๋˜๊ธฐ ์ „, ์ธ์ˆ˜๋“ค์„ ํ˜•์‹๋ณ€ํ™˜ or ํ˜•์‹๊ฒ€์‚ฌ ํ•จ.

  • Handler-level Pipes : ํ•ธ๋“ค๋Ÿฌ ๋ ˆ๋ฒจ์—์„œ @UsePipes ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ์ด์šฉํ•ด ์‚ฌ์šฉ. ํ•ธ๋“ค๋Ÿฌ ๋‹จ์œ„์—์„œ๋งŒ ์ ์šฉ๋จ
  • Parameter-level Pipes : ํŠน์ •ํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ์—๋งŒ ์ ์šฉ
  • Global Pipes : ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์ฒด, ํด๋ผ์ด์–ธํŠธ์˜ ๋ชจ๋“  ์š”์ฒญ์— ์ ์šฉ๋จ. main.ts์— app.useGlobalPipes() ๋กœ ์ ์šฉํ•จ.

์ฐธ๊ณ ) Built-in Pipes : nestjs์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋งŒ๋“ค์–ด๋‘” ํŒŒ์ดํ”„. ์ด 6๊ฐ€์ง€(ValidationPipe, ParseIntPipe, ParseBoolPipe, ParseArrayPipe, ParseUUIDPipe, ParseValuePipe)

 

๊ฐ€๋“œ(gaurds)

์ธ์ฆ์€ ์š”์ฒญ์ž๊ฐ€ ๋ˆ„๊ตฌ์ธ์ง€ ์ฆ๋ช…, ์ธ๊ฐ€๋Š” ์ธ์ฆ ํ†ต๊ณผํ•œ ์š”์ฒญ์ž๊ฐ€ ์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ž๊ฒฉ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•จ.

๊ฐ€๋“œ๋Š” ์ธ๊ฐ€๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐ€์žฅ ์ข‹์€ ์‚ฌ๋ก€์ž„.

์ธ๊ฐ€๋ฅผ ๋ฏธ๋“ค์›จ์–ด๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์—†๋Š” ์ด์œ  : ๋ฏธ๋“ค์›จ์–ด๋Š” ์‹คํ–‰ ์ปจํ…์ŠคํŠธ(ExecutionContext) ์— ์ ‘๊ทผํ•˜์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ž์‹ ์˜ ์ผ๋งŒ ์ˆ˜ํ–‰ํ•จ. ๋ฐ˜๋ฉด ๊ฐ€๋“œ๋Š” ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜์—ฌ, ๋‹ค์Œ์— ์‹คํ–‰๋  ์ž‘์—…์„ ์•Œ๊ณ  ์žˆ์Œ.

 

์ธํ„ฐ์…‰ํ„ฐ(interceptors)

์š”์ฒญ๊ณผ ์‘๋‹ต์„ ๊ฐ€๋กœ์ฑ„์„œ ๋ณ€ํ˜•์„ ๊ฐ€ํ•จ.

๋ผ์šฐํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์š”์ฒญ/์‘๋‹ต ์ฒ˜๋ฆฌํ•˜๊ธฐ ์ „์— ๋กœ๊ทธ๋ฅผ ๋‚จ๊ธฐ๊ณ  ์‹ถ๋‹ค๊ฑฐ๋‚˜, ์‘๋‹ต/์š”์ฒญ๋‹จ์—์„œ ๋ฐœ์ƒํ•œ ์˜ˆ์™ธ๋ฅผ ์žก์•„ ๋ณ€ํ˜•์„ ๊ฐ€ํ•œ๋‹ค๊ฑฐ๋‚˜..

(ex-404 ์—๋Ÿฌ๋ฅผ 400 ์—๋Ÿฌ๋กœ ๋ณ€ํ˜•...)

 

 

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

์š”์ฒญ > ์ปจํŠธ๋กค๋Ÿฌ > ์„œ๋น„์Šค > ์‘๋‹ต

  1. main.ts ์—์„œ App Module ์„ ์ƒ์„ฑํ•˜๊ณ  ์‹คํ–‰ํ•จ. 3000 port ์—์„œ ๋Œ€๊ธฐ. app.module.ts ์—๋Š” ์ปจํŠธ๋กค๋Ÿฌ์™€ ์„œ๋น„์Šค๊ฐ€ ๋“ฑ๋ก๋˜์–ด ์žˆ์Œ.
  2. ํด๋ผ์ด์–ธํŠธ๊ฐ€ endpoint(localhost:3000/) ๋กœ request
  3. endpoint ๊ฐ€ '/' ์ธ ์ปจํŠธ๋กค๋Ÿฌ ํ˜ธ์ถœ
  4. ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์•Œ๋งž์€ ๊ฒฝ๋กœ๋กœ ๋ผ์šฐํŒ…ํ•˜์—ฌ ํ•ด๋‹น ํ•ธ๋“ค๋Ÿฌ๋กœ ๊ฐ€, ์—ฐ๊ฒฐ๋œ ์„œ๋น„์Šค๋ฅผ ํ˜ธ์ถœ 
  5. ์„œ๋น„์Šค๊ฐ€ response

์ฆ‰, ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๋ผ์šฐํ„ฐ ์—ญํ• ์„ ํ•˜๊ณ , ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์€ ์„œ๋น„์Šค๊ฐ€ ์ œ๊ณต.

 

๋ฐ˜์‘ํ˜•