Middleware

Middleware

๋ฏธ๋“ค์›จ์–ด๋Š” ๋ผ์šฐํŠธ ํ•ธ๋“ค๋Ÿฌ๋ณด๋‹ค ์ „์— ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ๋ฏธ๋“ค์›จ์–ด ๊ธฐ๋Šฅ์€ requestarrow-up-right ๋ฐ responsearrow-up-right์— ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ์š”์ฒญ-์‘๋‹ต์ฃผ๊ธฐ์—์„œ ๊ฐ์ฒด ๋ฐ next()๋ฏธ๋“ค์›จ์–ด ํ•จ์ˆ˜. next ๋ฏธ๋“ค์›จ์–ด ํ•จ์ˆ˜๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ next๋ผ๋Š” ๋ณ€์ˆ˜๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

Nest ๋ฏธ๋“ค์›จ์–ด๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ expressarrow-up-right ๋ฏธ๋“ค์›จ์–ด์™€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ๊ณต์‹ Express ๋ฌธ์„œ์˜ ๋‹ค์Œ ์„ค๋ช…์€ ๋ฏธ๋“ค์›จ์–ด์˜ ๊ธฐ๋Šฅ์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

๋ฏธ๋“ค์›จ์–ด ๊ธฐ๋Šฅ์€ ๋‹ค์Œ ์ž‘์—…์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์–ด๋–ค ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  • ์š”์ฒญ ๋ฐ ์‘๋‹ต ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

  • ์š”์ฒญ-์‘๋‹ต์ฃผ๊ธฐ๋ฅผ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.

  • ์Šคํƒ์—์„œ ๋‹ค์Œ ๋ฏธ๋“ค์›จ์–ด ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

  • ํ˜„์žฌ ๋ฏธ๋“ค์›จ์–ด ํ•จ์ˆ˜๊ฐ€ ์š”์ฒญ-์‘๋‹ต์ฃผ๊ธฐ๋ฅผ ์ข…๋ฃŒํ•˜์ง€ ์•Š์œผ๋ฉด next()๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋‹ค์Œ ๋ฏธ๋“ค์›จ์–ด ๊ธฐ๋Šฅ์œผ๋กœ ์ œ์–ด๋ฅผ ์ „๋‹ฌํ•˜์‹ญ์‹œ์˜ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์š”์ฒญ์ด ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค.

ํ•จ์ˆ˜ ๋˜๋Š” @Injectable()๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๊ฐ€ ์žˆ๋Š” ํด๋ž˜์Šค์—์„œ ์‚ฌ์šฉ์ž ์ •์˜ Nest ๋ฏธ๋“ค์›จ์–ด๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. ํด๋ž˜์Šค๋Š” NestMiddleware ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜์ง€๋งŒ, ํ•จ์ˆ˜์—๋Š” ํŠน๋ณ„ํ•œ ์š”๊ตฌ ์‚ฌํ•ญ์ด ์—†์Šต๋‹ˆ๋‹ค. ํด๋ž˜์Šค ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ„๋‹จํ•œ ๋ฏธ๋“ค์›จ์–ด ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

Dependency injection

Nest ๋ฏธ๋“ค์›จ์–ด๋Š” Dependency Injection์„ ์™„๋ฒฝํ•˜๊ฒŒ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๊ณต๊ธ‰์ž ๋ฐ ์ปจํŠธ๋กค๋Ÿฌ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋™์ผํ•œ ๋ชจ๋“ˆ ๋‚ด์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ข…์†์„ฑ์„ ์ฃผ์ž… ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ‰์†Œ์™€ ๊ฐ™์ด ์ด๊ฒƒ์€ ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.

Applying middleware

@Module()๋ฐ์ฝ”๋ ˆ์ดํ„ฐ์—๋Š” ๋ฏธ๋“ค์›จ์–ด๋ฅผ ์œ„ํ•œ ๊ณต๊ฐ„์ด ์—†์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  ๋ชจ๋“ˆ ํด๋ž˜์Šค์˜ configure()๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๋ฏธ๋“ค์›จ์–ด๋ฅผ ํฌํ•จํ•˜๋Š” ๋ชจ๋“ˆ์€ NestModule ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. AppModule ๋ ˆ๋ฒจ์—์„œ LoggerMiddleware๋ฅผ ์„ค์ •ํ•ด ๋ด…์‹œ๋‹ค.

์œ„์˜ ์˜ˆ์—์„œ ์šฐ๋ฆฌ๋Š” ์ด์ „์— CatsController ๋‚ด์— ์ •์˜ ๋œ /cats ๋ผ์šฐํŠธ ํ•ธ๋“ค๋Ÿฌ์— ๋Œ€ํ•ด LoggerMiddleware๋ฅผ ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ฏธ๋“ค์›จ์–ด๋ฅผ ๊ตฌ์„ฑ ํ•  ๋•Œ ๊ฒฝ๋กœ path ๋ฐ ์š”์ฒญ method๋ฅผ ํฌํ•จํ•˜๋Š” ์˜ค๋ธŒ์ ํŠธ๋ฅผ forRoutes()๋ฉ”์†Œ๋“œ์— ์ „๋‹ฌํ•˜์—ฌ ๋ฏธ๋“ค์›จ์–ด๋ฅผ ํŠน์ • ์š”์ฒญ ๋ฉ”์†Œ๋“œ๋กœ ์ œํ•œํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ์˜ˆ์ œ์—์„œ, RequestRequest ๋ฉ”์†Œ๋“œ ์—ด๊ฑฐ ํ˜•์„ ๊ฐ€์ ธ์™€ ์›ํ•˜๋Š” ์š”์ฒญ ๋ฉ”์†Œ๋“œ ์œ ํ˜•์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

Route wildcards

ํŒจํ„ด ๊ธฐ๋ฐ˜ ๊ฒฝ๋กœ๋„ ์ง€์›๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ณ„ํ‘œ๋Š” ์™€์ผ๋“œ ์นด๋“œ๋กœ ์‚ฌ์šฉ๋˜๋ฉฐ ๋ชจ๋“  ๋ฌธ์ž ์กฐํ•ฉ๊ณผ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค.

ab*cd ๋ผ์šฐํŠธ ๊ฒฝ๋กœ๋Š” abcd, ab_cd, abecd ๋“ฑ๊ณผ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค. ?, +, *๋ฐ ()๋ฌธ์ž๋Š” ๋ผ์šฐํŠธ ๊ฒฝ๋กœ์— ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ •๊ทœ ํ‘œํ˜„์‹์˜ ํ•˜์œ„ ์ง‘ํ•ฉ์ž…๋‹ˆ๋‹ค. ํ•˜์ดํ”ˆ (-)๊ณผ ์  (.)์€ ๋ฌธ์ž ๊ทธ๋Œ€๋กœ ๋ฌธ์ž์—ด ๊ธฐ๋ฐ˜ ๊ฒฝ๋กœ๋กœ ํ•ด์„๋ฉ๋‹ˆ๋‹ค.

Middleware consumer

MiddlewareConsumer๋Š” ํ—ฌํผ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค. ๋ฏธ๋“ค์›จ์–ด๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ์œ„ํ•œ ๋ช‡ ๊ฐ€์ง€ ๊ธฐ๋ณธ ์ œ๊ณต ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋“ค ๋ชจ๋‘๋Š” ์œ ์ฐฝํ•œ ์Šคํƒ€์ผarrow-up-right์—์„œ ๊ฐ„๋‹จํ•˜๊ฒŒ ์‚ฌ์Šฌ๋กœ ๋ฌถ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. forRoutes() ๋ฉ”์†Œ๋“œ๋Š” ๋‹จ์ผ ๋ฌธ์ž์—ด, ๋‹ค์ค‘ ๋ฌธ์ž์—ด, RouteInfo ์˜ค๋ธŒ์ ํŠธ, ์ œ์–ด๊ธฐ ํด๋ž˜์Šค ๋ฐ ๋‹ค์ค‘ ์ œ์–ด๊ธฐ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์•„๋งˆ๋„ ์ปจํŠธ๋กค๋Ÿฌ ๋ชฉ๋ก์„ ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ์ „๋‹ฌํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•„๋ž˜๋Š” ๋‹จ์ผ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•œ ์˜ˆ์ž…๋‹ˆ๋‹ค.

info ํžŒํŠธ apply() ๋ฉ”์†Œ๋“œ๋Š” ๋‹จ์ผ ๋ฏธ๋“ค์›จ์–ด ๋˜๋Š” ์—ฌ๋Ÿฌ ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์ค‘ ๋ฏธ๋“ค์›จ์–ดarrow-up-right๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฏธ๋“ค์›จ์–ด๊ฐ€ ์ ์šฉ๋˜์ง€ ์•Š๋„๋ก ํŠน์ • ๊ฒฝ๋กœ๋ฅผ ์ œ์™ธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋Šฅ ๋ฏธ๋“ค์›จ์–ดarrow-up-right ๋Œ€์•ˆ์„ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  ์ง€๊ธˆ๊นŒ์ง€ํ–ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฏธ๋“ค์›จ์–ด๋ฅผ ์ •์˜ ํ•  ๋•Œ๋ฅผ exclude() ๋ฉ”์†Œ๋“œ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ • ๊ฒฝ๋กœ๋ฅผ ์‰ฝ๊ฒŒ ์ œ์™ธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์€ ์•„๋ž˜์™€ ๊ฐ™์ด ๊ฒฝ๋กœ์™€ ๋ฉ”์†Œ๋“œ๋ฅผ ์‹๋ณ„ํ•˜๋Š” ํ•˜๋‚˜ ์ด์ƒ์˜ ๊ฐ์ฒด๋ฅผ ์ œ์™ธ์‹œํ‚ต๋‹ˆ๋‹ค.

์œ„์˜ ์˜ˆ์—์„œ LoggerMiddleware๋Š” exclude()๋ฉ”์†Œ๋“œ์— ์ „๋‹ฌ ๋œ ๋‘ ๊ฒฝ๋กœ๋ฅผ ์ œ์™ธํ•˜๊ณ  CatsController ๋‚ด์— ์ •์˜ ๋œ ๋ชจ๋“  ๊ฒฝ๋กœ์— ๋ฐ”์ธ๋”ฉ๋ฉ๋‹ˆ๋‹ค. exclude()๋ฉ”์†Œ๋“œ๋Š” ๊ธฐ๋Šฅ ๋ฏธ๋“ค์›จ์–ด (ํด๋ž˜์Šค๊ฐ€ ์•„๋‹Œ ํ•จ์ˆ˜์— ์ •์˜ ๋œ ๋ฏธ๋“ค์›จ์–ด; ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์•„๋ž˜ ์ฐธ์กฐ)์™€ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด ๋ฐฉ๋ฒ•์€ ๋ณด๋‹ค ์ผ๋ฐ˜์ ์ธ ๊ฒฝ๋กœ (์˜ˆ: ์™€์ผ๋“œ ์นด๋“œ)์—์„œ ๊ฒฝ๋กœ๋ฅผ ์ œ์™ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ๋ ˆ๋ฒจ์˜ ์ œ์–ด๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๊ฒฝ๋กœ ์ œํ•œ ๋กœ์ง์„ ๋ฏธ๋“ค์›จ์–ด์— ์ง์ ‘ ๋ฐฐ์น˜ํ•˜๊ณ  ์š”์ฒญ์˜ URL์— ์•ก์„ธ์Šคํ•˜์—ฌ ๋ฏธ๋“ค์›จ์–ด ๋กœ์ง์„ ์กฐ๊ฑด๋ถ€๋กœ ์ ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

Functional middleware

์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•œ LoggerMiddleware ํด๋ž˜์Šค๋Š” ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ๋ฉค๋ฒ„, ์ถ”๊ฐ€ ๋ฉ”์†Œ๋“œ ๋ฐ ์ข…์†์„ฑ์ด ์—†์Šต๋‹ˆ๋‹ค. ํด๋ž˜์Šค ๋Œ€์‹  ๊ฐ„๋‹จํ•œ ํ•จ์ˆ˜๋กœ ์ •์˜ํ•  ์ˆ˜ ์—†๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์‚ฌ์‹ค ์šฐ๋ฆฌ๋Š” ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์œ ํ˜•์˜ ๋ฏธ๋“ค์›จ์–ด๋ฅผ ๊ธฐ๋Šฅ์  ๋ฏธ๋“ค์›จ์–ด๋ผ๊ณ ํ•ฉ๋‹ˆ๋‹ค. ๋กœ๊ฑฐ ๋ฏธ๋“ค์›จ์–ด๋ฅผ ํด๋ž˜์Šค ๊ธฐ๋ฐ˜์—์„œ ๊ธฐ๋Šฅ์  ๋ฏธ๋“ค์›จ์–ด๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์ฐจ์ด์ ์„ ์„ค๋ช…ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ AppModule ๋‚ด์—์„œ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค:

info ํžŒํŠธ ๋ฏธ๋“ค์›จ์–ด์— ์ข…์†์„ฑ์ด ํ•„์š”ํ•˜์ง€ ์•Š์„ ๋•Œ๋งˆ๋‹ค ๋” ๊ฐ„๋‹จํ•œ ๊ธฐ๋Šฅ์  ๋ฏธ๋“ค์›จ์–ด ๋Œ€์•ˆ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

Multiple middleware

์œ„์—์„œ ์–ธ๊ธ‰ ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰๋˜๋Š” ์—ฌ๋Ÿฌ ๋ฏธ๋“ค์›จ์–ด๋ฅผ ๋ฐ”์ธ๋”ฉํ•˜๋ ค๋ฉด apply()๋ฉ”์†Œ๋“œ ์•ˆ์— ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„ ๋œ ๋ชฉ๋ก์„ ์ œ๊ณตํ•˜์‹ญ์‹œ์˜ค.

Global middleware

๋“ฑ๋ก๋œ ๋ชจ๋“  ๋ผ์šฐํŠธ์— ๋ฏธ๋“ค์›จ์–ด๋ฅผ ํ•œ ๋ฒˆ์— ๋ฐ”์ธ๋”ฉํ•˜๋ ค๋ฉด INestApplication ์ธ์Šคํ„ด์Šค์—์„œ ์ œ๊ณตํ•˜๋Š”use()๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Last updated