[ Node.js ์ž…๋ฌธ์ฃผ์ฐจ2 (2-0)] Express ๋ฏธ๋“ค์›จ์–ด

2023. 8. 27. 20:17ใ†3. Node.js

 

Express ๋ฏธ๋“ค์›จ์–ด

 

Express์—์„œ ๋ฏธ๋“ค์›จ์–ด๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด, ๋กœ๊น…, ์ธ์ฆ, ์„ธ์…˜ ๊ด€๋ฆฌ, ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๋“ฑ์˜ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ตฌ์„ฑํ•˜๋Š” ํŠน์ • ๊ธฐ๋Šฅ ์Šคํƒ€์ผ ์›ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์žˆ์ง€๋งŒ ๋Œ€๊ฒŒ๋Š” ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ ์ฒ˜๋ฆฌ, ์‘๋‹ต ์ „์†ก ๋ฐ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ๋‹ด๋‹นํ•œ๋‹ค. 

 

Express ๊ณต์‹ ํ™ˆํŽ˜์ด์ง€์—์„œ ํ™•์ธ ๊ฐ€๋Šฅํ•œ ๋ฏธ๋“ค์›จ์–ด์˜ ์œ ํ˜•

Application-level middleware

Router-level middleware

Error-handling middleware

Built-in middleware

Third-party middleware

 

๋ฏธ๋“ค์›จ์–ด๋Š” ์œ ์—ฐํ•˜๋‹ค. Express์—๊ฒŒ ์„œ๋กœ ๋‹ค๋ฅธ ๊ฒฝ๋กœ์— ๋Œ€ํ•ด ๋™์ผํ•œ ๋ฏธ๋“ค์›จ์–ด ๊ธฐ๋Šฅ์„ ์‹คํ–‰ํ•˜๋„๋ก ์ง€์‹œํ•˜์—ฌ ์„œ๋กœ ๋‹ค๋ฅธ API ์—”๋“œํฌ์ธํŠธ์—์„œ ๊ณตํ†ต ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋“ฑ์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ž์‹ ๋งŒ์˜ ๋ฏธ๋“ค์›จ์–ด ๊ธฐ๋Šฅ์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ ์™ธ์—๋„ ํƒ€์‚ฌ ๋ฏธ๋“ค์›จ์–ด๋ฅผ ์„ค์น˜ํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. Express ๋ฌธ์„œ์—๋Š” ์ž์ฃผ ์‚ฌ์šฉ์ด๋˜๋Š” ๋ชจ๋“ˆ๋“ค์ด ๋‚˜์—ด๋˜์–ด ์žˆ๋‹ค.

 


 

์ต์Šคํ”„๋ ˆ์Šค ๊ณต์‹ ํ™ˆํŽ˜์ด์ง€(https://expressjs.com/)

 

Express - Node.js web application framework

Fast, unopinionated, minimalist web framework for Node.js $ npm install express --save

expressjs.com

 

์ต์Šคํ”„๋ ˆ์Šค ๊ณต์‹ ํ™ˆํŽ˜์ด์ง€ ์ ‘์† > Guide > Using middleware > Third-party middleware ํ•ญ๋ชฉ ํƒ€์‚ฌ ๋ฏธ๋“ค์›จ์–ด์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์‚ดํŽด ๋ณผ ์ˆ˜ ์žˆ๋‹ค.


 

YOUTUBE -์ƒํ™œ์ฝ”๋”ฉ [ แ„†แ…ตแ„ƒแ…ณแ†ฏแ„‹แ…ฐแ„‹แ…ฅแ„‹แ…ด แ„‰แ…ตแ†ฏแ„’แ…ขแ†ผแ„‰แ…ฎแ†ซแ„‰แ…ฅ ]

์ƒ๋‹จ์˜ ์ƒํ™œ์ฝ”๋”ฉ YOUTUBE๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ๊ณต๋ถ€ํ•œ ๋‚ด์šฉ์„ ์•„๋ž˜์— ๋ช‡ ๊ฐ€์ง€ ์ฐธ๊ณ ํ•˜์—ฌ ์ถ”๊ฐ€๋กœ ๋” ๊ธฐ์žฌํ•ด ๋ณด์•˜๋‹ค.

 

Application-level middleware (๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” Type) 

- app์ด๋ผ๋Š” ๋ณ€์ˆ˜๋Š”  Application์ด๋ผ๋Š” ๊ฐ์ฒด๊ฐ€ ๋‹ด๊ฒจ์žˆ๋Š”๋ฐ ๊ฐ์ฒด์— get, use, post ๋ฐฉ์‹์„ ํ†ตํ•ด ๋ฏธ๋“ค์›จ์–ด๋ฅผ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ๋‹ค. 

์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•์„ Application-level middleware ๋ผ๊ณ  ํ•œ๋‹ค.

 

๋ฏธ๋“ค์›จ์–ด ํ•จ์ˆ˜๋Š” app.use() ๋˜๋Š” app.METHOD() ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋“ฑ๋ก

app.use() ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ชจ๋“  HTTP ์š”์ฒญ์—์„œ ๋ฏธ๋“ค์›จ์–ด ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰

app.METHOD() ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํŠน์ • HTTP ์š”์ฒญ์—์„œ๋งŒ ๋ฏธ๋“ค์›จ์–ด ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰

์˜ˆ๋ฅผ ๋“ค๋ฉด, app.get() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด GET ์š”์ฒญ์—์„œ๋งŒ ๋ฏธ๋“ค์›จ์–ด ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰

๋ฏธ๋“ค์›จ์–ด ํ•จ์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ธ์ˆ˜๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.

req: HTTP ์š”์ฒญ ๊ฐ์ฒด
res: HTTP ์‘๋‹ต ๊ฐ์ฒด
next: ๋‹ค์Œ ๋ฏธ๋“ค์›จ์–ด ํ•จ์ˆ˜๋กœ ์ œ์–ด๋ฅผ ์ „๋‹ฌํ•˜๋Š” ํ•จ์ˆ˜

 

๋ฏธ๋“ค์›จ์–ด ํ•จ์ˆ˜๋Š” ๋‹ค์Œ ๋ฏธ๋“ค์›จ์–ด ํ•จ์ˆ˜๋กœ ์ œ์–ด๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด next() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•œ๋‹ค.

๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์‘๋‹ต์ด ์ „์†ก๋˜์ง€ ์•Š๋Š”๋‹ค.

 


Application-level middleware  ๋ช‡ ๊ฐ€์ง€ ์‚ฌ์šฉ๋ฒ•์„ ์•Œ์•„๋ณด์ž!

 

1) ๊ฒฝ๋กœ๊ฐ€ ์—†๋Š” ๋ฏธ๋“ค์›จ์–ด ๊ธฐ๋Šฅ์„ ๋ณด์—ฌ์ค€๋‹ค. ์ด ํ•จ์ˆ˜๋Š” ์•ฑ์ด ์š”์ฒญ์„ ๋ฐ›์„ ๋•Œ๋งˆ๋‹ค ์‹คํ–‰๋œ๋‹ค.

const express = require('express')
const app = express()

app.use((req, res, next) => {
  console.log('Time:', Date.now())
  next()
})

2)  app.use ์— (/user/:id) ๊ฒฝ๋กœ๋ฅผ ์ฃผ๋Š” ๊ฒƒ์„ ํ†ตํ•ด, ํŠน์ •๊ฒฝ๋กœ์—๋งŒ ๋ฏธ๋“ค์›จ์–ด๋งŒ ๋™์ž‘๋˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.

app.use('/user/:id', (req, res, next) => {
  console.log('Request Type:', req.method)
  next()
})

3. get์„ ํ†ตํ•ด์„œ ๋ฉ”์„œ๋“œ๊ฐ€ get๋ฐฉ์‹์ผ๋•Œ๋งŒ ๋™์ž‘ํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค.

app.get('/user/:id', (req, res, next) => {
  res.send('USER')
})

 

4. ์ธ์ž๋กœ ํ•จ์ˆ˜๋ฅผ ์—ฐ์†์ ์œผ๋กœ ์ฃผ๋Š” ๊ฒƒ์„ ํ†ตํ•ด ๋ฏธ๋“ค์›จ์–ด๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 ํ•จ์ˆ˜๊ฐ€ ์ฒ˜์Œ์— ์‹คํ–‰์ด ๋˜๊ณ , ํ•จ์ˆ˜ ์•ˆ์—์„œ next๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

app.use('/user/:id', (req, res, next) => {
  console.log('Request URL:', req.originalUrl)
  next()
}, (req, res, next) => {
  console.log('Request Type:', req.method)
  next()
})

5. ์กฐ๊ฑด๋ฌธ์„ ํ†ตํ•ด์„œ ๋‹ค์Œ ๋ฏธ๋“ค์›จ์–ด ์‹คํ–‰์„ ์‹œํ‚ฌ์ง€ ์ง€์ •์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

๋งŒ์•ฝ,  req.params.id ๊ฐ’์ด '0'์ด๋ผ๋ฉด, next('route')๋ฅผ ์‹คํ–‰ํ•ด์•ผ ํ•œ๋‹ค. ์ฆ‰ ๋‹ค์Œ route๋ฅผ ์‹คํ–‰ํ•ด์•ผ ํ•˜๋ฏ€๋กœ res.send('special')์„ ์‹คํ–‰์‹œํ‚จ๋‹ค. ๋งŒ์•ฝ '0'์ด ์•„๋‹ˆ๋ผ๋ฉด, next()๊ฐ€ ์‹คํ–‰๋˜๋ฉฐ next์˜ ๊ฐ’์ด ์‹คํ–‰๋œ๋‹ค.

app.get('/user/:id', (req, res, next) => {
  // if the user ID is 0, skip to the next route
  if (req.params.id === '0') next('route')
  // otherwise pass the control to the next middleware function in this stack
  else next()
}, (req, res, next) => {
  // send a regular response
  res.send('regular')
})

// handler for the /user/:id path, which sends a special response
app.get('/user/:id', (req, res, next) => {
  res.send('special')
})

 


 

์ฐธ๊ณ ํ•˜๋ฉด ์ข‹์„ ์‚ฌ์ดํŠธ : 

https://simonplend.com/how-does-middleware-work-in-express/

 

How does middleware work in Express?

The middleware pattern is fundamental to building applications with Express, but are you really comfortable with how it works?

simonplend.com