๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป Dev/Back-End

๋ฐฑ์—”๋“œ์˜ ๊ตฌ์กฐ์™€ Node.js ๊ธฐ์ดˆ

yesolz 2024. 8. 22. 23:29
728x90

 

๋ฐฑ์—”๋“œ ๊ตฌ์กฐ 

https://yozm.wishket.com/magazine/detail/1780/

 

 

์›น ์„œ๋ฒ„ (Web Server)

  • ์›น ์„œ๋ฒ„๋Š” ์ •์  ํŽ˜์ด์ง€์— ๋Œ€ํ•ด ๋Œ€์‘ํ•จ
  • ๋™์  ํŽ˜์ด์ง€์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋Š” ์ง์ ‘ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๊ณ , ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„์—๊ฒŒ ์ „๋‹ฌ
* ์ •์ ํŽ˜์ด์ง€: ํ™”๋ฉด์˜ ๋‚ด์šฉ/๋ฐ์ดํ„ฐ ๋“ฑ์˜ ๋ณ€๋™์ด ์—†๋Š” ํŽ˜์ด์ง€
* ๋™์ ํŽ˜์ด์ง€: ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ/์—ฐ์‚ฐ์„ ํ†ตํ•ด ํ™”๋ฉด์˜ ๋‚ด์šฉ, ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€ํ•˜๋Š” ํŽ˜์ด์ง€

 

์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค

  • ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„(Web Application Server, WAS)๋Š” ๋™์  ํŽ˜์ด์ง€๋ฅผ ์ฒ˜๋ฆฌ
  • ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ ์—ฐ์‚ฐ์„ ์œ„ํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์œผ๋ฉฐ ๋ฐ์ดํ„ฐ ์กฐํšŒ/์ˆ˜์ •/์‚ญ์ œ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ์š”์ฒญ
* ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค: ๋ฐ์ดํ„ฐ๋ฅผ ํ†ตํ•ฉํ•˜์—ฌ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๋ฐ์ดํ„ฐ ์ง‘ํ•ฉ์ฒด

-> ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„์— ํฌ์ปค์‹ฑ !

 

Node.js

  • Node.js๋Š” JavaScript๋ฅผ ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ ๋ฐ–์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋Ÿฐํƒ€์ž„ ํ™˜๊ฒฝ
  • JavaScript๊ฐ€ ๋‹จ์ˆœํ•œ ํด๋ผ์ด์–ธํŠธ ์ธก ์Šคํฌ๋ฆฝํŠธ ์–ธ์–ด๋ฅผ ๋„˜์–ด์„œ, ์„œ๋ฒ„ ์ธก ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋จ
  • ์ด๋ฅผ ํ†ตํ•ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๋ฐฑ์—”๋“œ ๊ตฌํ˜„ ๊ฐ€๋Šฅ (์›น ์„œ๋ฒ„์™€ ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„)

 

 

HTTP ํ”„๋กœํ† ์ฝœ ํ…œํ”Œ๋ฆฟ

Head:

  • HTTP Status Code: ์š”์ฒญ์— ๋Œ€ํ•œ ์„œ๋ฒ„์˜ ์‘๋‹ต ์ƒํƒœ (์˜ˆ: 200 OK, 404 Not Found).
  • Content-Type: ์‘๋‹ต ๋ณธ๋ฌธ์˜ ๋ฐ์ดํ„ฐ ํ˜•์‹ (์˜ˆ: text/html, application/json).

Body:

  • ๋‚ด์šฉ: ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ „๋‹ฌ๋  ์‹ค์ œ ๋ฐ์ดํ„ฐ ๋˜๋Š” ์›น ํŽ˜์ด์ง€ ์ฝ˜ํ…์ธ .

 

Uniform Resource Locator (URL)

  • ์ธํ„ฐ๋„ท ์ƒ์—์„œ ์›น ํŽ˜์ด์ง€๊ฐ€ ์–ด๋””์žˆ๋Š”์ง€ ์œ„์น˜๋ฅผ ์•Œ๋ ค์ฃผ๋Š” ์ฃผ์†Œ (์›น ํŽ˜์ด์ง€ ์ฃผ์†Œ)
  • localhost๋Š” ์ปดํ“จํ„ฐ๊ฐ€ ์Šค์Šค๋กœ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” IP ์ฃผ์†Œ์ธ `127.0.0.1`์„ ์˜๋ฏธํ•œ๋‹ค.
  • ์ฆ‰, http://localhost:8888 ์™€ http://127.0.0.1:8888/๋Š” ๋™์ผํ•œ ์ฃผ์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

 

 

์›น ์„œ๋ฒ„ ๊ตฌ์ถ• ์‹ค์Šต

index.js์—์„œ ์„œ๋ฒ„๋ฅผ ์‹œ์ž‘ํ•˜๋ฉด -> server.js๊ฐ€ HTTP ์„œ๋ฒ„๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์š”์ฒญ์„ ์ฒ˜๋ฆฌ
-> ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด, router.js๊ฐ€ ์š”์ฒญ๋œ ๊ฒฝ๋กœ์— ๋”ฐ๋ผ ์ ์ ˆํ•œ ํ•ธ๋“ค๋Ÿฌ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ
-> requestHandler.js์—์„œ ์ •์˜๋œ ์‘๋‹ต์„ ํด๋ผ์ด์–ธํŠธ์— ๋ฐ˜ํ™˜

 

index.js

let server = require("./server");
let router = require("./router");
let requestHandler = require("./requestHandler");

server.start(router.route, requestHandler.handle);
  • requireํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ •์˜ํ•œ ๋ชจ๋“ˆ์„ ๊ฐ€์ ธ์˜ค๊ณ , ์„œ๋ฒ„๋ฅผ ์‹œ์ž‘ํ•œ๋‹ค. 
  • server.start ํ•จ์ˆ˜์— router์˜ route, requestHandler์˜ handle์„ ์ „๋‹ฌํ•˜์—ฌ ์„œ๋ฒ„ ์‹œ์ž‘
  • ํ„ฐ๋ฏธ๋„์—์„œ node index.js๋กœ ๋กœ์ปฌ์—์„œ ์„œ๋ฒ„ ์‹คํ–‰.

 

server.js

let http = require("http");

function start(route, handle) {
  function onRequest(request, response) {
    const url = new URL(request.url, `http://${request.headers.host}`);
    let pathname = url.pathname;
    route(pathname, handle, response);
  }

  http.createServer(onRequest).listen(8888);
}

exports.start = start;

 

  • http ๋ชจ๋“ˆ ๋กœ๋“œ: HTTP ์„œ๋ฒ„๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด http ๋ชจ๋“ˆ์„ ์‚ฌ์šฉ
  • start ํ•จ์ˆ˜: ์„œ๋ฒ„๋ฅผ ์‹œ์ž‘ํ•˜๊ณ  ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•จ์ˆ˜
  • onRequest ํ•จ์ˆ˜: ์š”์ฒญ์ด ๋“ค์–ด์˜ฌ ๋•Œ๋งˆ๋‹ค URL ๊ฒฝ๋กœ๋ฅผ ์ถ”์ถœํ•˜๊ณ  ๋ผ์šฐํŒ… ํ•จ์ˆ˜์— ์ „๋‹ฌ
  • URL ๊ฐ์ฒด ์‚ฌ์šฉ: ์š”์ฒญ๋œ URL์—์„œ ๊ฒฝ๋กœ(pathname)๋ฅผ ์ถ”์ถœ
  • ์„œ๋ฒ„ ์ƒ์„ฑ ๋ฐ ์‹คํ–‰: ํฌํŠธ 8888์—์„œ HTTP ์„œ๋ฒ„๋ฅผ ์‹คํ–‰
  • ๋ชจ๋“ˆ ๋‚ด๋ณด๋‚ด๊ธฐ: start ํ•จ์ˆ˜๋ฅผ ์™ธ๋ถ€์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋‚ด๋ณด๋ƒ…๋‹ˆ๋‹ค.

 

router.js

function route(pathname, handle, response) {
  console.log("pathname: " + pathname);

  if (typeof handle[pathname] === "function") {
    handle[pathname](response);
  } else {
    response.writeHead(404, { "Content-Type": "text/html" });
    response.write("404 Not Found");
    response.end();
  }
}

exports.route = route;
  • route ํ•จ์ˆ˜๋Š” ์š”์ฒญ๋œ ๊ฒฝ๋กœ(pathname)์— ๋”ฐ๋ผ ์š”์ฒญ์„ ์ฒ˜๋ฆฌ.
  • handle ๊ฐ์ฒด์— pathname์— ํ•ด๋‹นํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ์žˆ์œผ๋ฉด ๊ทธ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์‘๋‹ต(response) ์ฒ˜๋ฆฌ.
  • ํ•จ์ˆ˜๊ฐ€ ์—†์œผ๋ฉด 404 ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜์—ฌ "404 Not Found" ๋ฉ”์‹œ์ง€๋ฅผ ์ „์†ก.

 

requestHandler.js

function main(response) {
  console.log("main");

  response.writeHead(200, { "Content-Type": "text/html" });
  response.write("Main page");
  response.end();
}

function login(response) {
  console.log("login");

  response.writeHead(200, { "Content-Type": "text/html" });
  response.write("Login page");
  response.end();
}

let handle = {};
handle["/"] = main;
handle["/login"] = login;

exports.handle = handle;
  • main ํ•จ์ˆ˜: "/" ๊ฒฝ๋กœ ์š”์ฒญ ์‹œ "Main page" ์‘๋‹ต.
  • login ํ•จ์ˆ˜: "/login" ๊ฒฝ๋กœ ์š”์ฒญ ์‹œ "Login page" ์‘๋‹ต.
  • handle ๊ฐ์ฒด: ๊ฒฝ๋กœ๋ณ„๋กœ ํ•ธ๋“ค๋Ÿฌ ํ•จ์ˆ˜ ๋งคํ•‘.

 

 
 
728x90