Web

[WEB] ๋ฏธ๋“ค์›จ์–ด ๊ตฌ์กฐ: ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ณด์ด์ง€ ์•Š๋Š” ์„ค๊ณ„๋„ ๐Ÿ—๏ธ

xeunnie 2025. 1. 4. 01:00
728x90
๋ฐ˜์‘ํ˜•

๐Ÿ—๏ธ ๋ฏธ๋“ค์›จ์–ด ๊ตฌ์กฐ์— ๋Œ€ํ•ด ํ†บ์•„๋ณด์ž!

์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค๋‹ค ๋ณด๋ฉด, ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ(Request)๋ถ€ํ„ฐ ์„œ๋ฒ„ ์‘๋‹ต(Response)๊นŒ์ง€์˜ ๊ณผ์ •์„ ๋งค๋„๋Ÿฝ๊ฒŒ ๊ด€๋ฆฌํ•ด์•ผ ํ•  ๋•Œ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ์ด ์—ฐ๊ฒฐ ๊ณ ๋ฆฌ ์—ญํ• ์„ ํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ ๋ฏธ๋“ค์›จ์–ด(Middleware)์ž…๋‹ˆ๋‹ค. ์ด๋ฆ„ ๊ทธ๋Œ€๋กœ ’์ค‘๊ฐ„(Middle)’์—์„œ ๋ชจ๋“  ํ๋ฆ„์„ ์กฐ์œจํ•˜๊ณ  ๊ด€๋ฆฌํ•˜์ฃ .

 

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


๐ŸŒŸ ๋ฏธ๋“ค์›จ์–ด๋ž€?

๋ฏธ๋“ค์›จ์–ด๋Š” ์š”์ฒญ๊ณผ ์‘๋‹ต ์‚ฌ์ด์—์„œ ์‹คํ–‰๋˜๋Š” ํ•จ์ˆ˜ ๋˜๋Š” ๋ชจ๋“ˆ์ž…๋‹ˆ๋‹ค. ์š”์ฒญ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๊ณตํ•˜๊ฑฐ๋‚˜ ์ธ์ฆ์„ ์ฒ˜๋ฆฌํ•˜๊ณ , ์‘๋‹ต ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๋“ฑ ๋‹ค์–‘ํ•œ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜์ฃ .

 

๋ฏธ๋“ค์›จ์–ด์˜ ์—ญํ• 

  1. ๋ฐ์ดํ„ฐ ๊ฐ€๊ณต: ์š”์ฒญ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ๋ถ„์„
  2. ์ธ์ฆ/์ธ๊ฐ€: ์‚ฌ์šฉ์ž์˜ ๊ถŒํ•œ์„ ํ™•์ธ
  3. ๋กœ๊น…: ์š”์ฒญ ๊ธฐ๋ก์„ ์ €์žฅ
  4. ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ: ์˜ˆ์™ธ๋ฅผ ์žก์•„๋‚ด๊ณ , ์—๋Ÿฌ ํŽ˜์ด์ง€๋ฅผ ํ‘œ์‹œ
  5. ํ๋ฆ„ ์ œ์–ด: ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ์š”์ฒญ์„ ๋„˜๊ธฐ๊ฑฐ๋‚˜ ํ๋ฆ„์„ ์ค‘๋‹จ

๐Ÿ“‹ ๋ฏธ๋“ค์›จ์–ด์˜ ๊ตฌ์กฐ

๋ฏธ๋“ค์›จ์–ด์˜ ๊ธฐ๋ณธ ํ˜•ํƒœ

๋ฏธ๋“ค์›จ์–ด๋Š” ์„ธ ๊ฐ€์ง€ ์ฃผ์š” ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ฐ›๋Š” ํ•จ์ˆ˜๋กœ ์ •์˜๋ฉ๋‹ˆ๋‹ค:

  • 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("์ตœ์ข… ์‘๋‹ต");
});

 

์ถœ๋ ฅ:

์ฒซ ๋ฒˆ์งธ ๋ฏธ๋“ค์›จ์–ด ์‹คํ–‰

๋‘ ๋ฒˆ์งธ ๋ฏธ๋“ค์›จ์–ด ์‹คํ–‰


โš™๏ธ ๋ฏธ๋“ค์›จ์–ด์˜ ์ž‘๋™ ์›๋ฆฌ

์š”์ฒญ๊ณผ ์‘๋‹ต ์‚ฌ์ด์˜ ๋‹ค๋ฆฌ

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

  1. ์š”์ฒญ ์ฒ˜๋ฆฌ:
    • ์š”์ฒญ ํ—ค๋”, ๋ณธ๋ฌธ(body), ์ฟ ํ‚ค ๋“ฑ์„ ํ™•์ธํ•˜๊ณ  ํ•„์š”์‹œ ์ˆ˜์ •
  2. ์‘๋‹ต ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€:
    • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์กฐํšŒํ•œ ์ •๋ณด๋ฅผ ์‘๋‹ต ๊ฐ์ฒด์— ์ถ”๊ฐ€
  3. ํ๋ฆ„ ์ค‘๋‹จ:
    • ์š”์ฒญ์ด ๋ถ€์ ํ•ฉํ•  ๊ฒฝ์šฐ ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•˜๊ณ  ํ๋ฆ„์„ ์ค‘๋‹จ

๐Ÿ—ƒ๏ธ 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!");
});

๐Ÿš€ ๋ฏธ๋“ค์›จ์–ด ์ž‘์„ฑ ํŒ

  1. ํ•ญ์ƒ next()๋ฅผ ํ˜ธ์ถœํ•˜์„ธ์š”:
    • ํ˜ธ์ถœํ•˜์ง€ ์•Š์œผ๋ฉด ์š”์ฒญ์ด ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค.
  2. ์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค:
    • ๋ฏธ๋“ค์›จ์–ด๋Š” ์„ ์–ธ๋œ ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
  3. ๋ชจ๋“ˆํ™”๋ฅผ ๊ณ ๋ คํ•˜์„ธ์š”:
    • ๋ณต์žกํ•œ ๋กœ์ง์€ ๋ณ„๋„์˜ ํŒŒ์ผ๋กœ ๋ถ„๋ฆฌํ•ด ๊ด€๋ฆฌ
// logger.js
module.exports = (req, res, next) => {
  console.log(`${req.method} ${req.url}`);
  next();
};

// app.js
const logger = require("./logger");
app.use(logger);

8. ๋งˆ๋ฌด๋ฆฌํ•˜๋ฉฐ

 

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

 

๐ŸŒท ์ „์„ค์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜์–ด๋ด…์‹œ๋‹น! ๐ŸŒท

728x90
๋ฐ˜์‘ํ˜•