๐๏ธ ๋ฏธ๋ค์จ์ด ๊ตฌ์กฐ์ ๋ํด ํบ์๋ณด์!
์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค๋ค ๋ณด๋ฉด, ํด๋ผ์ด์ธํธ ์์ฒญ(Request)๋ถํฐ ์๋ฒ ์๋ต(Response)๊น์ง์ ๊ณผ์ ์ ๋งค๋๋ฝ๊ฒ ๊ด๋ฆฌํด์ผ ํ ๋๊ฐ ๋ง์ต๋๋ค. ์ด ์ฐ๊ฒฐ ๊ณ ๋ฆฌ ์ญํ ์ ํ๋ ๊ฒ์ด ๋ฐ๋ก ๋ฏธ๋ค์จ์ด(Middleware)์ ๋๋ค. ์ด๋ฆ ๊ทธ๋๋ก ’์ค๊ฐ(Middle)’์์ ๋ชจ๋ ํ๋ฆ์ ์กฐ์จํ๊ณ ๊ด๋ฆฌํ์ฃ .
์ด ๊ธ์์๋ ๋ฏธ๋ค์จ์ด๊ฐ ๋ฌด์์ธ์ง, ๊ตฌ์กฐ์ ์๋ ์๋ฆฌ, ์ค์ ์ฌ์ฉ ์ฌ๋ก, ๊ทธ๋ฆฌ๊ณ ๋ ๋์๊ฐ ๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ์ค์ ํ๊น์ง ์ธ์ธํ ์์๋ณด๊ฒ ์ต๋๋ค.
๐ ๋ฏธ๋ค์จ์ด๋?
๋ฏธ๋ค์จ์ด๋ ์์ฒญ๊ณผ ์๋ต ์ฌ์ด์์ ์คํ๋๋ ํจ์ ๋๋ ๋ชจ๋์ ๋๋ค. ์์ฒญ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณตํ๊ฑฐ๋ ์ธ์ฆ์ ์ฒ๋ฆฌํ๊ณ , ์๋ต ๋ฐ์ดํฐ๋ฅผ ์์ ํ๋ ๋ฑ ๋ค์ํ ์ญํ ์ ์ํํ์ฃ .
๋ฏธ๋ค์จ์ด์ ์ญํ
- ๋ฐ์ดํฐ ๊ฐ๊ณต: ์์ฒญ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๊ฑฐ๋ ๋ถ์
- ์ธ์ฆ/์ธ๊ฐ: ์ฌ์ฉ์์ ๊ถํ์ ํ์ธ
- ๋ก๊น : ์์ฒญ ๊ธฐ๋ก์ ์ ์ฅ
- ์ค๋ฅ ์ฒ๋ฆฌ: ์์ธ๋ฅผ ์ก์๋ด๊ณ , ์๋ฌ ํ์ด์ง๋ฅผ ํ์
- ํ๋ฆ ์ ์ด: ๋ค์ ๋จ๊ณ๋ก ์์ฒญ์ ๋๊ธฐ๊ฑฐ๋ ํ๋ฆ์ ์ค๋จ
๐ ๋ฏธ๋ค์จ์ด์ ๊ตฌ์กฐ
๋ฏธ๋ค์จ์ด์ ๊ธฐ๋ณธ ํํ
๋ฏธ๋ค์จ์ด๋ ์ธ ๊ฐ์ง ์ฃผ์ ๋งค๊ฐ๋ณ์๋ฅผ ๋ฐ๋ ํจ์๋ก ์ ์๋ฉ๋๋ค:
- req (Request): ํด๋ผ์ด์ธํธ ์์ฒญ ๊ฐ์ฒด
- res (Response): ์๋ฒ ์๋ต ๊ฐ์ฒด
- next (Next): ๋ค์ ๋ฏธ๋ค์จ์ด๋ก ์์ฒญ์ ์ ๋ฌํ๋ ํจ์
function exampleMiddleware(req, res, next) {
console.log("๋ฏธ๋ค์จ์ด ์คํ ์ค...");
next(); // ๋ค์ ๋ฏธ๋ค์จ์ด๋ก ์์ฒญ์ ๋๊ธด๋ค.
}
๋ฏธ๋ค์จ์ด ์ฒด์ธ
๋ฏธ๋ค์จ์ด๋ ์ฒด์ธ(chain) ํํ๋ก ๋์ํฉ๋๋ค. ์์ฒญ์ด ๋ค์ด์ค๋ฉด ์ฒซ ๋ฒ์งธ ๋ฏธ๋ค์จ์ด๋ถํฐ ์คํ๋๋ฉฐ, next()๋ฅผ ํธ์ถํด ๋ค์ ๋จ๊ณ๋ก ๋์ด๊ฐ๋๋ค.
app.use((req, res, next) => {
console.log("์ฒซ ๋ฒ์งธ ๋ฏธ๋ค์จ์ด ์คํ");
next(); // ๋ค์ ๋ฏธ๋ค์จ์ด๋ก ์ด๋
});
app.use((req, res, next) => {
console.log("๋ ๋ฒ์งธ ๋ฏธ๋ค์จ์ด ์คํ");
next();
});
app.get("/", (req, res) => {
res.send("์ต์ข
์๋ต");
});
์ถ๋ ฅ:
์ฒซ ๋ฒ์งธ ๋ฏธ๋ค์จ์ด ์คํ
๋ ๋ฒ์งธ ๋ฏธ๋ค์จ์ด ์คํ
โ๏ธ ๋ฏธ๋ค์จ์ด์ ์๋ ์๋ฆฌ
์์ฒญ๊ณผ ์๋ต ์ฌ์ด์ ๋ค๋ฆฌ
๋ฏธ๋ค์จ์ด๋ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ด ๋ค์ด์์ ๋๋ถํฐ ์๋ต์ด ๋ฐํ๋ ๋๊น์ง์ ๋ชจ๋ ๊ณผ์ ์ ๊ฐ์ ํ ์ ์์ต๋๋ค. ์ด ๊ณผ์ ์์ ๋ฏธ๋ค์จ์ด๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณตํ๊ฑฐ๋ ํ๋ฆ์ ์ ์ดํ์ฃ .
- ์์ฒญ ์ฒ๋ฆฌ:
- ์์ฒญ ํค๋, ๋ณธ๋ฌธ(body), ์ฟ ํค ๋ฑ์ ํ์ธํ๊ณ ํ์์ ์์
- ์๋ต ๋ฐ์ดํฐ ์ถ๊ฐ:
- ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์กฐํํ ์ ๋ณด๋ฅผ ์๋ต ๊ฐ์ฒด์ ์ถ๊ฐ
- ํ๋ฆ ์ค๋จ:
- ์์ฒญ์ด ๋ถ์ ํฉํ ๊ฒฝ์ฐ ์๋ต์ ๋ฐํํ๊ณ ํ๋ฆ์ ์ค๋จ
๐๏ธ Express.js์์์ ๋ฏธ๋ค์จ์ด ๊ตฌ์กฐ
Express.js๋ ๋ฏธ๋ค์จ์ด๋ฅผ ์ฒด๊ณ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ ๋ํ์ ์ธ ํ๋ ์์ํฌ์ ๋๋ค.
Express์์์ ๋ฏธ๋ค์จ์ด ์์ฑ
const express = require("express");
const app = express();
// ๋ชจ๋ ์์ฒญ์ ๋ํด ์คํ๋๋ ๋ฏธ๋ค์จ์ด
app.use((req, res, next) => {
console.log(`${req.method} ${req.url}`);
next(); // ๋ค์ ๋ฏธ๋ค์จ์ด๋ก ์ด๋
});
// ํน์ ๊ฒฝ๋ก์๋ง ์ ์ฉ๋๋ ๋ฏธ๋ค์จ์ด
app.use("/user", (req, res, next) => {
console.log("User route middleware");
next();
});
// ์ต์ข
๋ผ์ฐํธ ํธ๋ค๋ฌ
app.get("/", (req, res) => {
res.send("Hello, Middleware!");
});
// ์๋ฌ ์ฒ๋ฆฌ ๋ฏธ๋ค์จ์ด
app.use((err, req, res, next) => {
console.error(err.stack);
res.status(500).send("Something broke!");
});
app.listen(3000, () => {
console.log("Server is running on port 3000");
});
๐๏ธ ๋ฏธ๋ค์จ์ด์ ์ข ๋ฅ
1. ์ ํ๋ฆฌ์ผ์ด์ ๋ฏธ๋ค์จ์ด
- app.use()๋ฅผ ์ฌ์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ญ์์ ์คํ๋๋ ๋ฏธ๋ค์จ์ด
2. ๋ผ์ฐํฐ ๋ฏธ๋ค์จ์ด
- ํน์ ๋ผ์ฐํธ์์๋ง ์๋
app.use("/api", (req, res, next) => {
console.log("API ๋ฏธ๋ค์จ์ด ์คํ");
next();
});
3. ๋ด์ฅ ๋ฏธ๋ค์จ์ด
- Express์ ๋ด์ฅ๋ ๋ฏธ๋ค์จ์ด. ์: express.json()
4. ์๋ํํฐ ๋ฏธ๋ค์จ์ด
- ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๋ฏธ๋ค์จ์ด. ์: morgan, cors
๐ ๋ฏธ๋ค์จ์ด์ ํ์ฉ ์ฌ๋ก
1. ์ธ์ฆ ์ฒ๋ฆฌ
์ฌ์ฉ์์ ๊ถํ์ ํ์ธํ๋ ๋ก์ง์ ์ถ๊ฐ
function authMiddleware(req, res, next) {
if (req.headers.authorization === "Bearer secret-token") {
next(); // ์ธ์ฆ ์ฑ๊ณต
} else {
res.status(403).send("Forbidden");
}
}
app.get("/protected", authMiddleware, (req, res) => {
res.send("You have access!");
});
2. ๋ก๊น
์์ฒญ ์ ๋ณด๋ฅผ ๊ธฐ๋กํ์ฌ ๋๋ฒ๊น ๋ฐ ๋ถ์์ ํ์ฉ.
const morgan = require("morgan");
app.use(morgan("tiny")); // ์์ฒญ ๋ก๊ทธ ์ถ๋ ฅ
3. ๋ฐ์ดํฐ ํ์ฑ
์์ฒญ ๋ฐ์ดํฐ๋ฅผ JSON ํํ๋ก ๋ณํ.
app.use(express.json());
app.post("/data", (req, res) => {
console.log(req.body); // JSON ๋ฐ์ดํฐ ์ ๊ทผ
res.send("Data received");
});
4. ์๋ฌ ์ฒ๋ฆฌ
๋ชจ๋ ์์ฒญ์์ ๋ฐ์ํ ์๋ฌ๋ฅผ ํ ๊ณณ์์ ์ฒ๋ฆฌ.
app.use((err, req, res, next) => {
console.error(err.stack);
res.status(500).send("Something broke!");
});
๐ ๋ฏธ๋ค์จ์ด ์์ฑ ํ
- ํญ์ next()๋ฅผ ํธ์ถํ์ธ์:
- ํธ์ถํ์ง ์์ผ๋ฉด ์์ฒญ์ด ์ค๋จ๋ฉ๋๋ค.
- ์์๊ฐ ์ค์ํฉ๋๋ค:
- ๋ฏธ๋ค์จ์ด๋ ์ ์ธ๋ ์์๋๋ก ์คํ๋ฉ๋๋ค.
- ๋ชจ๋ํ๋ฅผ ๊ณ ๋ คํ์ธ์:
- ๋ณต์กํ ๋ก์ง์ ๋ณ๋์ ํ์ผ๋ก ๋ถ๋ฆฌํด ๊ด๋ฆฌ
// logger.js
module.exports = (req, res, next) => {
console.log(`${req.method} ${req.url}`);
next();
};
// app.js
const logger = require("./logger");
app.use(logger);
8. ๋ง๋ฌด๋ฆฌํ๋ฉฐ
๋ฏธ๋ค์จ์ด๋ ์์ฒญ๊ณผ ์๋ต ์ฌ์ด์ ์จ์ ์ค๊ณ์์ ๋๋ค. ๋ก๊น , ์ธ์ฆ, ๋ฐ์ดํฐ ๊ฐ๊ณต, ์๋ฌ ์ฒ๋ฆฌ ๋ฑ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ํต์ฌ ๊ธฐ๋ฅ์ ๋ด๋นํ๋ฉฐ, ๋ชจ๋ ๋จ๊ณ์์ ์ ์ฐํ๊ฒ ๊ฐ์ ํ ์ ์์ฃ . ์ ์ค๊ณ๋ ๋ฏธ๋ค์จ์ด ๊ตฌ์กฐ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ ํฌ๊ฒ ๋์ ๋๋ค.
๐ท ์ ์ค์ ๊ฐ๋ฐ์๊ฐ ๋์ด๋ด ์๋น! ๐ท