Nodejs Middleware

Node.js Middleware ์•Œ์•„๋ณด๊ธฐ


๐Ÿ‘‰Middleware๋ž€?

๋ฏธ๋“ค์›จ์–ด๋ž€ ์š”์ฒญ(req), ์‘๋‹ต(res)์˜ ์‚ฌ์ด์—์„œ ๋ชฉ์ ์— ๋งž๊ฒŒ ๊ตฌํ˜„ํ•œ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๊ฒŒ ๋˜๋Š” ๊ฑฐ์ณ๊ฐ€๋Š” ํ•จ์ˆ˜๋ผ๋Š” ์˜๋ฏธ์ด๋‹ค.
docs์—์„œ๋Š” ๋ฏธ๋“ค์›จ์–ด๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜ํ•˜๊ณ  ์žˆ๋‹ค.

Middleware functions are functions that have access to the request object (req), the response object (res), and the next function in the applicationโ€™s request-response cycle.

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


๐Ÿ‘‰Middleware ์‚ฌ์šฉ๋ฒ•

๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฏธ๋“ค์›จ์–ด๋Š” app.use์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  docs์—์„œ๋Š” ์•Œ๋ ค์ฃผ๊ณ  ์žˆ๋‹ค. ๋ชจ๋“  ์š”์ฒญ์—์„œ ์ฝ˜์†”์„ ์ฐ๋Š” ๋ฏธ๋“ค์›จ์–ด๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ์š”์ฒญ๊ณผ ์‘๋‹ต์˜ ์ค‘๊ฐ„์—์„œ ์‹คํ–‰์‹œ์ผœ๋ณด์ž.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
const express = require('express')
const app = express()
const port = 3000

app.use((req, res, next) => {
console.log('์š”์ฒญ์˜ ์ค‘๊ฐ„์—์„œ ์‹คํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค.');
next();
})

app.get('/', (req, res) => {
res.send('Hello World!')
})

app.listen(port, () => {
console.log(`Example app listening at http://localhost:${port}`)
})

console์„ ๊ธฐ๋กํ•˜๋Š” ๋ฏธ๋“ค์›จ์–ด๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์—ˆ๋‹ค. app.use๋Š” ๋ชจ๋“  ์š”์ฒญ์—์„œ ์‹คํ–‰ํ•˜๊ฒ ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค. ์ด์ œ 3000ํฌํŠธ๋กœ ์ ‘์†์‹œ ๋กœ๊ทธ๊ฐ€ ๋‚จ๋Š”์ง€ ํ™•์ธ์„ ํ•ด๋ณด์ž.



์„œ๋ฒ„์— ์ ‘์† ํ›„ ํ„ฐ๋ฏธ๋„์„ ํ™•์ธํ•ด๋ณด์•˜๋‹ค.



์ž‘์„ฑํ•œ ๋กœ๊ทธ๊ฐ€ ์ž˜ ์ฐํžŒ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.๐Ÿ‘


๐Ÿ‘‰next๋ฉ”์„œ๋“œ

๋ฏธ๋“ค์›จ์–ด์—์„œ๋Š” ํ•จ์ˆ˜๋ฅผ ์‚ดํ–‰ ํ›„ ๋‹ค์Œ ๋ฏธ๋“ค์›จ์–ด๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ next๋ฉ”์„œ๋“œ๋ฅผ ํ•„์ˆ˜์ ์œผ๋กœ ํ˜ธ์ถœํ•ด์•ผ ํ•œ๋‹ค. ์ด์œ ๋Š” next๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ๋‹ค์Œ ๋ฏธ๋“ค์›จ์–ด๋กœ ๋„˜์–ด๊ฐ€์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ธ๋ฐ ์•„๊นŒ ๋งŒ๋“ค์—ˆ๋˜ ๋ฏธ๋“ค์›จ์–ด์— next๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š๊ณ  ๋‹ค์‹œ ์‹คํ–‰์„ ํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
const express = require('express')
const app = express()
const port = 3000

app.use((req, res, next) => {
console.log('์š”์ฒญ์˜ ์ค‘๊ฐ„์—์„œ ์‹คํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค.');
// next ํ˜ธ์ถœ ์•ˆํ•จ
})

app.get('/', (req, res) => {
res.send('Hello World!')
})

app.listen(port, () => {
console.log(`Example app listening at http://localhost:${port}`)
})


3000ํฌํŠธ๋กœ ์ ‘์†์„ ํ•˜๋ฉด โ€œHello Worldโ€๋ผ๋Š” ๋ฌธ๊ตฌ๊ฐ€ ํ™”๋ฉด์— ๋ณด์—ฌ์ ธ์•ผ ํ•˜์ง€๋งŒ ํ™”๋ฉด์ด ๋„˜์–ด๊ฐ€์ง€ ์•Š๋Š”๋‹ค.


ํ•˜์ง€๋งŒ ์ฝ˜์†”์„ ๋‚จ๊ธฐ๋Š” ๋ฏธ๋“ค์›จ์–ด๋Š” ๊ทธ๋Œ€๋กœ ์‹คํ–‰์ด ๋œ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ด์ฒ˜๋Ÿผ ๋ฏธ๋“ค์›จ์–ด๋Š” ๋‹ค์Œ๋ฏธ๋“ค์›จ์–ด๋กœ ๋„˜์–ด๊ฐ€๊ธฐ ์œ„ํ•ด์„œ next ๋ฉ”์„œ๋“œ๋ฅผ ํ•„์ˆ˜์ ์œผ๋กœ ํ˜ธ์ถœ์„ ํ•ด์ค˜์•ผํ•œ๋‹ค.


๐Ÿ‘‰ํ•จ์ˆ˜๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
const express = require('express')
const app = express()
const port = 3000

const middleware = (req, res, next) => {
console.log('/mypage ์—์„œ๋งŒ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.');
next();
}

app.get('/', (req, res) => {
res.send('Hello World!')
})

app.get('/mypage', middleware ,(req, res) => {
res.send('My Page!!');
})

app.listen(port, () => {
console.log(`Example app listening at http://localhost:${port}`)
})

middleware๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค๊ณ  โ€œ/mypageโ€๋ผ๋Š” ๋ผ์šฐํ„ฐ์˜ ์ค‘๊ฐ„์— ๋„ฃ์–ด์ฃผ์—ˆ๋‹ค. ์ด์ œ ๋กœ๊ทธ๋ฅผ ๋‚จ๊ธฐ๋Š” ํ•จ์ˆ˜๋Š” โ€œ/mypageโ€ ์š”์ฒญ์˜ ์ค‘๊ฐ„์—์„œ ์‹คํ–‰ ๋  ๊ฒƒ์ด๋‹ค.



์•„๋ฌด๋Ÿฐ ๋กœ๊ทธ๊ฐ€ ๊ธฐ๋ก๋˜์ง€ ์•Š๋Š”๋‹ค. โ€œ/mypageโ€๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด๋ณด์ž.



๋กœ๊ทธ๋ฅผ ๊ธฐ๋กํ•˜๋Š” ๋ฏธ๋“ค์›จ์–ด๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™์„ ํ–ˆ๋‹ค. ์ด๋Ÿฐ์‹์œผ๋กœ ํŠน์ • ๋ผ์šฐํ„ฐ์—์„œ๋งŒ ์‹คํ–‰ํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฏธ๋“ค์›จ์–ด๋„ ์ž‘์„ฑ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.


๐Ÿ‘‰Middleware๊ฐ€ ์‹คํ–‰๋˜๋Š” ๊ฒฝ์šฐ

๋ฏธ๋“ค์›จ์–ด๊ฐ€ ์‹คํ–‰๋˜๋Š” ๊ฒฝ์šฐ
app.use(๋ฏธ๋“ค์›จ์–ด) ๋ชจ๋“ ์š”์ฒญ์—์„œ ๋ฏธ๋“ค์›จ์–ด ์‹คํ–‰
app.use(โ€˜/abcโ€™, ๋ฏธ๋“ค์›จ์–ด) abc๋กœ ์‹œ์ž‘ํ•˜๋Š” ์š”์ฒญ์—์„œ ๋ฏธ๋“ค์›จ์–ด ์‹คํ–‰
app.post(โ€˜/abcโ€™, ๋ฏธ๋“ค์›จ์–ด) abc๋กœ ์‹œ์ž‘ํ•˜๋Š” POST ์š”์ฒญ์—์„œ ๋ฏธ๋“ค์›จ์–ด ์‹คํ–‰
app.get(โ€˜/defโ€™, ๋ฏธ๋“ค์›จ์–ด) def๋กœ ์‹œ์ž‘ํ•˜๋Š” GET ์š”์ฒญ์—์„œ ๋ฏธ๋“ค์›จ์–ด ์‹คํ–‰

Author

han Ju Ryeon

Posted on

2021-09-09

Updated on

2021-12-05

Licensed under

๋Œ“๊ธ€