Contents

Web framework에 λŒ€ν•˜μ—¬(3)

   Jul 24, 2023     4 min read

μ›Ή ν”„λ ˆμž„μ›Œν¬μ— λŒ€ν•΄ ν•™μŠ΅ν•˜κ³  κ³΅μœ ν•˜λŠ” κΈ€μž…λ‹ˆλ‹€.

μ§€λ‚œ κΈ€μ—μ„œλŠ” μ½”λ“œλ₯Ό Node.JSμ—μ„œ μ œκ³΅ν•˜λŠ” HTTPκΈ°λŠ₯을 톡해 μ›Ήμ„œλ²„λ₯Ό λ‹€λ€˜μŠ΅λ‹ˆλ‹€. μ›Ή ν”„λ ˆμž„μ›Œν¬κ°€ 없이 κ΅¬ν˜„ν•œλ‹€λ©΄ μ–΄λ–»κ²Œ κ΅¬ν˜„ν• μ§€ μ•ŒκΈ° μœ„ν•΄μ„œ μž…λ‹ˆλ‹€. μ΄λ²ˆμ—” 이전 κΈ€κ³Ό λ™μΌν•œ κΈ°λŠ₯을 ν•˜λ„λ‘ Express둜 κ΅¬ν˜„ν•œ μ˜ˆμ‹œλ‘œ μ›Ή ν”„λ ˆμž„μ›Œν¬μ˜ μœ μš©ν•¨κ³Ό ν”„λ‘œμ νŠΈμ— μ›Ή ν”„λ ˆμž„μ›Œν¬ μ‚¬μš©μ˜ μž₯단점에 λŒ€ν•΄ 닀루도둝 ν•˜κ² μŠ΅λ‹ˆλ‹€.

λ¨Όμ € 이전에 μž‘μ„±ν•œ μ½”λ“œλ₯Ό κ°€μ Έμ˜€κ² μŠ΅λ‹ˆλ‹€.

이전에 μž‘μ„±ν•œ μ½”λ“œ

const http = require("http");

const server = http.createServer((req, res) => {
  const { method, url } = req;

  if (method === "GET" && url === "/") {
    res.statusCode = 200;
    // HTTP 응닡 ν—€λ”λŠ” μ›Ή μ„œλ²„κ°€ ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ λ³΄λ‚΄λŠ” λ©”νƒ€λ°μ΄ν„°λ‘œ, μ‘λ‹΅μ˜ 속성과 λ‚΄μš©μ— λŒ€ν•œ 정보λ₯Ό λ‹΄κ³  μžˆμŠ΅λ‹ˆλ‹€.
    res.setHeader("Content-Type", "text/plain");
    res.end("Hello, World!");
  } else if (method === "GET" && url === "/about") {
    res.statusCode = 200;
    res.setHeader("Content-Type", "text/plain");
    res.end("About page");
  } else {
    res.statusCode = 404;
    res.setHeader("Content-Type", "text/plain");
    res.end("404 Not Found");
  }
});

const port = 3000;
server.listen(port, () => {
  console.log(`Server running at http://localhost:${port}/`);
});

μš°λ¦¬λŠ” 이전 κΈ€μ—μ„œ μ›Ήμ„œλ²„λ₯Ό μƒμ„±ν•˜κ³ , Node.jsμ—μ„œ 기본적으둜 μ œκ³΅ν•˜λŠ” HTTP λͺ¨λ“ˆλ‘œ λΌμš°νŒ… κΈ°λŠ₯을 κ΅¬ν˜„ν–ˆμŠ΅λ‹ˆλ‹€.

μ°Έκ³ 

λͺ¨λ“ˆμ΄λž€? μž¬μ‚¬μš© κ°€λŠ₯ν•œ μ½”λ“œ 쑰각을 λ‹΄κ³  μžˆλŠ” 독립적인 λ‹¨μœ„μž…λ‹ˆλ‹€. λͺ¨λ“ˆμ€ λ³€μˆ˜, ν•¨μˆ˜, 클래슀, 객체 등을 λ‚΄λ³΄λ‚΄κ±°λ‚˜ κ°€μ Έμ˜¬ 수 있으며, μ½”λ“œμ˜ μž¬μ‚¬μš©μ„±κ³Ό λͺ¨λ“ˆν™”λ₯Ό κ°€λŠ₯ν•˜κ²Œ ν•©λ‹ˆλ‹€.

λ‹€μ‹œ λŒμ•„μ™€ 이제 λ™μΌν•œ κΈ°λŠ₯을 μˆ˜ν–‰ν•˜λŠ” expressλ₯Ό ν™œμš©ν•˜μ—¬ μ½”λ“œλ₯Ό μž‘μ„±ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

expressλ₯Ό ν™œμš©ν•˜μ—¬ μ½”λ“œ μ˜ˆμ‹œ

const express = require("express");
const app = express();

const port = 3000;

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

app.get("/about", (req, res) => {
  res.send("About page");
});

app.use((req, res) => {
  res.status(404).send("404 Not Found");
});

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

μœ„μ˜ 예제 μ½”λ“œλ„ λ™μΌν•˜κ²Œ λΌμš°νŒ…μ„ κ΅¬ν˜„ν•©λ‹ˆλ‹€. λ‹€λ§Œ get()ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ κ²½λ‘œμ— λŒ€ν•œ GET μš”μ²­μ„ μ²˜λ¦¬ν•˜κ³ , 응닡을 λ°˜ν™˜ν•©λ‹ˆλ‹€. λ˜ν•œ use()ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•΄ λͺ¨λ“  κ²½λ‘œμ— λŒ€ν•œ 처리λ₯Ό ν•©λ‹ˆλ‹€. μœ„μ—μ„œ μ •μ˜ν•œ κ²½λ‘œλ“€κ³Ό μΌμΉ˜ν•˜μ§€ μ•ŠλŠ” λͺ¨λ“  μš”μ²­μ„ μ²˜λ¦¬ν•˜λ©° 응닡을 λ°˜ν™˜ν•©λ‹ˆλ‹€.

μ½”λ“œλ₯Ό 비ꡐ해보면 μ•Œκ² μ§€λ§Œ 훨씬 가독성이 μ’‹μœΌλ©°, 적은 μ½”λ“œλ‘œ 넓은 λ²”μš©μ„±μœΌλ‘œ μ»€μŠ€ν…€μ΄ κ°€λŠ₯ν•©λ‹ˆλ‹€.

그럼 이제 κΆκΈˆν•©λ‹ˆλ‹€. μ›Ή ν”„λ ˆμž„μ›Œν¬λ₯Ό ν”„λ‘œμ νŠΈμ— λ„μž…ν•˜λ©΄ μž₯점만 μžˆμ„ 것 같은데 단점은 뭐가 μžˆμ„μ§€ λ§μž…λ‹ˆλ‹€. κ·Έλž˜μ„œ μ•Œμ•„λ³΄μ•˜μŠ΅λ‹ˆλ‹€.

μ›Ή ν”„λ ˆμž„μ›Œν¬λ₯Ό ν”„λ‘œμ νŠΈμ— λ„μž…ν•  μ‹œ κ³ λ €ν•  점

주의: Express의 κ΄€μ μ—μ„œ μ•Œμ•„λ³΄μ•˜μŠ΅λ‹ˆλ‹€.

λ„μž… μž₯점
  • κ°„νŽΈν•œ λΌμš°νŒ…: ExpressλŠ” λΌμš°νŒ…μ„ μ„€μ •ν•˜λŠ” 데 맀우 νŽΈλ¦¬ν•œ κΈ°λŠ₯을 μ œκ³΅ν•©λ‹ˆλ‹€. URL κ²½λ‘œμ™€ HTTP λ©”μ„œλ“œλ₯Ό 기반으둜 λΌμš°νŒ…μ„ μ„€μ •ν•˜κ³  μ²˜λ¦¬ν•  수 있으며, λ‹€μ–‘ν•œ λΌμš°νŒ… κΈ°λŠ₯을 μ œκ³΅ν•˜μ—¬ κ°œλ°œμžκ°€ κ°„λ‹¨ν•˜κ²Œ μ—”λ“œν¬μΈνŠΈλ₯Ό 관리할 수 μžˆμŠ΅λ‹ˆλ‹€.
  • λ‹€μ–‘ν•œ 미듀웨어: ExpressλŠ” λ‹€μ–‘ν•œ 미듀웨어λ₯Ό μ§€μ›ν•˜μ—¬ μš”μ²­κ³Ό 응닡을 λ³€ν˜•ν•˜κ³  μ²˜λ¦¬ν•˜λŠ” μž‘μ—…μ„ μ‰½κ²Œ μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ‘œκΉ…, 인증, μ„Έμ…˜ 관리, μ—λŸ¬ 처리 λ“±μ˜ μž‘μ—…μ„ νŽΈλ¦¬ν•˜κ²Œ μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • μœ μ—°ν•œ ν…œν”Œλ¦Ώ 엔진: ExpressλŠ” λ‹€μ–‘ν•œ ν…œν”Œλ¦Ώ 엔진을 μ§€μ›ν•˜μ—¬ 동적인 HTML νŽ˜μ΄μ§€λ₯Ό 생성할 수 μžˆμŠ΅λ‹ˆλ‹€. ν…œν”Œλ¦Ώ 엔진을 μ‚¬μš©ν•˜λ©΄ 데이터와 ν…œν”Œλ¦Ώμ„ κ²°ν•©ν•˜μ—¬ ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ 동적인 컨텐츠λ₯Ό μ œκ³΅ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • ν™•μž₯μ„±: ExpressλŠ” μœ μ—°ν•œ ꡬ쑰λ₯Ό 가지고 μžˆμ–΄ ν•„μš”ν•œ 경우 미듀웨어, λΌμš°ν„°, ν…œν”Œλ¦Ώ 엔진 등을 μΆ”κ°€ν•˜κ±°λ‚˜ μ‚¬μš©μž μ •μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό 톡해 κ°œλ°œμžλŠ” μžμ‹ μ˜ ν”„λ‘œμ νŠΈμ— 맞게 κΈ°λŠ₯을 ν™•μž₯ν•˜κ³  μ»€μŠ€ν„°λ§ˆμ΄μ§•ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
λ„μž… 단점
  • 좔가적인 ν•™μŠ΅ 곑선: ExpressλŠ” 일뢀 κΈ°λŠ₯을 μ œκ³΅ν•˜λŠ” μƒλŒ€μ μœΌλ‘œ μž‘μ€ ν”„λ ˆμž„μ›Œν¬μž…λ‹ˆλ‹€. λ”°λΌμ„œ 처음 μ‚¬μš©ν•˜λŠ” κ°œλ°œμžλ“€μ—κ²ŒλŠ” 적응이 ν•„μš”ν•  수 μžˆμŠ΅λ‹ˆλ‹€. Express의 문법과 ꡬ쑰λ₯Ό μ΄ν•΄ν•˜κ³  μ‚¬μš©ν•˜λŠ” λ°μ—λŠ” 좔가적인 ν•™μŠ΅μ΄ ν•„μš”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • λ„ˆλ¬΄ λ§Žμ€ μœ μ—°μ„±: ExpressλŠ” λ§Žμ€ μœ μ—°μ„±μ„ μ œκ³΅ν•˜κΈ° λ•Œλ¬Έμ— κ°œλ°œμžκ°€ ν”„λ‘œμ νŠΈλ₯Ό κ΅¬μ„±ν•˜κ³  κ΅¬ν˜„ν•˜λŠ” 데 μžμœ λ„κ°€ ν½λ‹ˆλ‹€. μ΄λŠ” λͺ…ν™•ν•œ ꡬ쑰 및 κ°€μ΄λ“œλΌμΈμ΄ 없을 경우 μ½”λ“œμ˜ 일관성을 μœ μ§€ν•˜κΈ° μ–΄λ ΅κ²Œ λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€.

λ‹€μŒ 글에선 μ›Ή ν”„λ ˆμž„μ›Œν¬μ˜ 핡심 κΈ°λŠ₯ 쀑 미듀웨어에 λŒ€ν•˜μ—¬ 닀루도둝 ν•˜κ² μŠ΅λ‹ˆλ‹€.