Contents

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

   Jul 23, 2023     2 min read

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

μ§€λ‚œ κΈ€μ—μ„œ μš°λ¦¬λŠ” κ°„λ‹¨ν•œ μ›Ήμ„œλ²„λ₯Ό μƒμ„±ν•˜λŠ” 방법에 λŒ€ν•΄ μ½”λ“œλ₯Ό μž‘μ„±ν•˜κ³  μ‹€μŠ΅μ„ μ§„ν–‰ν•΄λ³΄μ•˜μŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ κ·Έκ²ƒλ§ŒμœΌλ‘  μ›Ή ν”„λ ˆμž„μ›Œν¬λ₯Ό λŒ€μ²΄ν•  수 μžˆλ‹€ λ§ν•˜κΈ° νž˜λ“­λ‹ˆλ‹€.

κ·Έλž˜μ„œ 이번 글에선 μ›Ή ν”„λ ˆμž„μ›Œν¬μ˜ 핡심 κΈ°λŠ₯ 쀑 ν•˜λ‚˜μΈ λΌμš°νŒ… κ΅¬ν˜„μ„ expressjs없이 κ΅¬ν˜„ν•΄λ³΄λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€.

μš°μ„  λΌμš°νŒ…μ€ λ¬΄μ—‡μΌκΉŒμš”?

κ°„λ‹¨ν•˜κ²Œ URLκ³Ό μš”μ²­ ν•Έλ“€λŸ¬λ₯Ό μ—°κ²°ν•΄μ£ΌλŠ” κΈ°λŠ₯을 μ œκ³΅ν•©λ‹ˆλ‹€. 즉, μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ λ‹€μ–‘ν•œ μ—”λ“œν¬μΈνŠΈλ₯Ό 관리할 수 μžˆμŠ΅λ‹ˆλ‹€.

μ—”λ“œν¬μΈνŠΈ(Endpoint)λž€ λ¬΄μ—‡μΌκΉŒμš”?

μ—”λ“œν¬μΈνŠΈλž€ μ›Ή APIμ—μ„œ ν΄λΌμ΄μ–ΈνŠΈκ°€ νŠΉμ •ν•œ μš”μ²­μ„ μˆ˜ν–‰ν•˜κΈ° μœ„ν•΄ μ ‘κ·Όν•˜λŠ” URL 경둜λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€.

μ—”λ“œν¬μΈνŠΈ μ˜ˆμ‹œ

GET /posts: λͺ¨λ“  κ²Œμ‹œλ¬Όμ„ κ°€μ Έμ˜€λŠ” μ—”λ“œν¬μΈνŠΈ GET /posts/{id}: νŠΉμ • κ²Œμ‹œλ¬Όμ„ κ°€μ Έμ˜€λŠ” μ—”λ“œν¬μΈνŠΈ POST /posts: μƒˆλ‘œμš΄ κ²Œμ‹œλ¬Όμ„ μƒμ„±ν•˜λŠ” μ—”λ“œν¬μΈνŠΈ PUT /posts/{id}: νŠΉμ • κ²Œμ‹œλ¬Όμ„ μˆ˜μ •ν•˜λŠ” μ—”λ“œν¬μΈνŠΈ DELETE /posts/{id}: νŠΉμ • κ²Œμ‹œλ¬Όμ„ μ‚­μ œν•˜λŠ” μ—”λ“œν¬μΈνŠΈ

그럼 λ‹€μ‹œ λŒμ•„μ™€μ„œ Express 없이 Node.jsλ§Œμ„ μ‚¬μš©ν•˜μ—¬ λΌμš°νŒ…μ„ κ΅¬ν˜„ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€. 저흰 HTTP λͺ¨λ“ˆμ„ μ‚¬μš©ν•  μ˜ˆμ •μž…λ‹ˆλ‹€. Node.jsμ—λŠ” 기본적으둜 λ‚΄μž₯된 HTTP λͺ¨λ“ˆμ΄ μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό μ‚¬μš©ν•˜μ—¬ μ›Ή μ„œλ²„λ₯Ό λ§Œλ“€κ³  λΌμš°νŒ…μ„ κ΅¬ν˜„ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

μ˜ˆμ‹œ
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}/`);
});

μœ„μ˜ μ½”λ“œλ₯Ό κ°„λ‹¨ν•˜κ²Œ μ„€λͺ…ν•˜μžλ©΄ λ‹¨μˆœν•œ HTTP μ„œλ²„λ₯Ό μƒμ„±ν•˜κ³ , μš”μ²­μ— 따라 λΌμš°νŒ…μ„ κ΅¬ν˜„ν•©λ‹ˆλ‹€. κ²½λ‘œμ— λ”°λ₯Έ 응닡을 λ°›μŠ΅λ‹ˆλ‹€. μ§€μ •ν•œ 경둜 μ™Έμ˜ μš”μ²­μ€ 404 Not Found 응닡을 λ³΄λƒ…λ‹ˆλ‹€.

μΆ”κ°€

μš”μ²­μ— HTTP 응닡 헀더에 Content-Typeκ³Ό 같은 ν•„λ“œλ₯Ό μ„€μ •ν•˜μ§€ μ•ŠμœΌλ©΄ μ–΄λ–»κ²Œ λ˜λŠ”μ§€ κΆκΈˆν•˜μ—¬ μ•Œμ•„λ³΄μ•˜μŠ΅λ‹ˆλ‹€.

응닡 헀더에 ν•„λ“œλ₯Ό μ„€μ •ν•˜μ§€ μ•Šμ„ μ‹œ λ°œμƒν•  수 μžˆλŠ” 문제

ν΄λΌμ΄μ–ΈνŠΈλŠ” μ„œλ²„λ‘œλΆ€ν„° 받은 μ‘λ‹΅μ˜ λ‚΄μš©μ— λŒ€ν•œ 정보λ₯Ό μ•Œ 수 μ—†κ²Œ λ©λ‹ˆλ‹€. 정보λ₯Ό μ•Œ 수 μ—†λ‹€λŠ” 것은 ν΄λΌμ΄μ–ΈνŠΈκ°€ 받은 데이터λ₯Ό μ˜¬λ°”λ₯΄κ²Œ ν•΄μ„ν•˜κ³  μ²˜λ¦¬ν•˜λŠ” 데에 영ν–₯을 쀄 수 μžˆμŠ΅λ‹ˆλ‹€.

μ˜ˆμ‹œ

μ„œλ²„κ°€ Content-Type을 헀더에 μ„€μ •ν•˜μ§€ μ•Šμ„ μ‹œ, μ›Ή λΈŒλΌμš°μ €λŠ” ν•΄λ‹Ή 응닡을 일반 ν…μŠ€νŠΈλ‘œ κ°„μ£Όν•  수 μžˆμŠ΅λ‹ˆλ‹€. 결과적으둜 HTML νƒœκ·Έλ‚˜ ꡬ쑰λ₯Ό μ˜¬λ°”λ₯΄κ²Œ 해석 ν•˜μ§€ λͺ»ν•˜κ³  일반 ν…μŠ€νŠΈλ‘œ ν‘œμ‹œν•˜κ²Œ 될 수 μžˆμŠ΅λ‹ˆλ‹€.

λ‹€μŒ 글에선 μœ„μ˜ μ½”λ“œλ₯Ό μ›Ή ν”„λ ˆμž„μ›Œν¬μΈ Expressλ₯Ό 톡해 μ‚¬μš©ν•œ μ˜ˆμ‹œμ™€ μ›Ή ν”„λ ˆμž„μ›Œν¬ μ‚¬μš©μ˜ μž₯단점에 λŒ€ν•΄ 닀루도둝 ν•˜κ² μŠ΅λ‹ˆλ‹€.

μ°Έκ³ ν•œ 링크