[๋ฐ๋ธŒ์ฝ”์Šค] Hello, Backend!(์„œ๋ฒ„, HTTP, Node.js)

2025. 4. 3. 23:35ยท๐Ÿ•Š๏ธํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๋ฐ๋ธŒ์ฝ”์Šค/TIL

๋“œ๋””์–ด ๋ฐฑ์—”๋“œ ํŒŒํŠธ ์‹œ์ž‘! ์˜ค๋Š˜์€ ๋ฐฑ์—”๋“œ์˜ ๊ตฌ์กฐ์™€ Node.js, HTTP ํ…œํ”Œ๋ฆฟ ๋“ฑ ๋ฐฑ์—”๋“œ ์ž…๋ฌธ์„ ์œ„ํ•œ ๊ธฐ์ดˆ ๊ฐœ๋…์„ ๋ฐฐ์šฐ๊ณ  ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋ณด์•˜๋‹ค.


๐Ÿงฎ๋ฐฑ์—”๋“œ์˜ ๊ธฐ๋ณธ ๊ตฌ์กฐ

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

ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„ ์•„ํ‚คํ…์ฒ˜

 

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

1. ์›น ์„œ๋ฒ„

ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ HTTP ์š”์ฒญ์„ ๋ฐ›์•„์„œ ์ฒ˜๋ฆฌ

  • ์ •์  ๋ฆฌ์†Œ์Šค ์ฒ˜๋ฆฌ: HTML, CSS, ์ด๋ฏธ์ง€ ํŒŒ์ผ๊ณผ ๊ฐ™์€ ์ •์  ์ฝ˜ํ…์ธ ๋ฅผ ์ง์ ‘ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ œ๊ณตํ•œ๋‹ค.
  • ์š”์ฒญ ๋ผ์šฐํŒ…: ๋™์  ์ปจํ…์ธ ์— ๋Œ€ํ•œ ์š”์ฒ˜์„ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„๋กœ ์ „๋‹ฌํ•œ๋‹ค.
  • ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ: ์—ฌ๋Ÿฌ ์„œ๋ฒ„์— ํŠธ๋ž˜ํ”ฝ์„ ๋ถ„์‚ฐํ•˜์—ฌ ์‹œ์Šคํ…œ ์•ˆ์ •์„ฑ์„ ๋ณด์žฅํ•œ๋‹ค.
  • ๋ณด์•ˆ: SSL/TLS ์•”ํ˜ธํ™”, ๊ธฐ๋ณธ์ ์ธ ๋ณด์•ˆ ํ•„ํ„ฐ๋ง์„ ์ œ๊ณตํ•œ๋‹ค.

๋Œ€ํ‘œ์ ์ธ ์›น ์„œ๋ฒ„๋กœ๋Š” Apache, Nginx, IIS ๋“ฑ์ด ์žˆ๋‹ค.

โญ ์›น ์„œ๋ฒ„๋Š” ์ •์  ํŽ˜์ด์ง€์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ์™€, ๋™์  ์š”์ฒญ์„ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ์ „๋‹ฌํ•˜๋Š” ์—ญํ• 

 

2. ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„

์‹ค์ œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ์ง์ด ์‹คํ–‰๋˜๋Š” ๊ณณ

  • ๋™์  ์ฝ˜ํ…์ธ  ์ƒ์„ฑ: ์‚ฌ์šฉ์ž ์š”์ฒญ์— ๋”ฐ๋ผ ๋งž์ถคํ˜• ์ฝ˜ํ…์ธ ๋ฅผ ์ƒ์„ฑ
  • ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ฒ˜๋ฆฌ: ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ ๊ตฌํ˜„
  • ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ํ†ต์‹ ์„ ํ†ตํ•œ CRUD ์—ฐ์‚ฐ
  • ์„ธ์…˜ ๊ด€๋ฆฌ: ์‚ฌ์šฉ์ž ์ธ์ฆ ๋ฐ ์ƒํƒœ ์œ ์ง€

๋Œ€ํ‘œ์ ์ธ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„๋กœ๋Š” Tomcat, JBoss, WebLogic, Node.js ๋“ฑ์ด ์žˆ์œผ๋ฉฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์™€ ํ”„๋ ˆ์ž„์›Œํฌ์— ๋”ฐ๋ผ ๋‹ค์–‘ํ•œ ์˜ต์…˜์ด ์กด์žฌํ•œ๋‹ค.

โญ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์˜ ์ค‘์‹ฌ

 

3. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค

๋ฐ์ดํ„ฐ์˜ ์˜๊ตฌ ์ €์žฅ์†Œ

๋ฐ์ดํ„ฐ์˜ ์ €์žฅ ๋ฐ ๊ฒ€์ƒ‰, ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ, ๋ฐ์ดํ„ฐ ๋ณด์•ˆ, ๋ฐ์ดํ„ฐ ์ตœ์ ํ™” ๋“ฑ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. MySQL, PostgreSQL, MongoDB, Redis ๋“ฑ ๋‹ค์–‘ํ•œ ์œ ํ˜•์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์กด์žฌํ•œ๋‹ค.

 

์‹ค์ œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ์˜ ๋ฐ์ดํ„ฐ ํ๋ฆ„

์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ฐ์ดํ„ฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ๋ฆ„์œผ๋กœ ์ฒ˜๋ฆฌ๋œ๋‹ค.

  1. ํด๋ผ์ด์–ธํŠธ๊ฐ€ HTTP ์š”์ฒญ์„ ๋ณด๋ƒ„
  2. ์›น ์„œ๋ฒ„๊ฐ€ ์š”์ฒญ์„ ๋ฐ›์•„ ์ •์ /๋™์  ์ฝ˜ํ…์ธ  ์—ฌ๋ถ€ ํŒ๋‹จ
  3. ๋™์  ์ปจํ…์ธ ๋ผ๋ฉด ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„๋กœ ์š”์ฒญ ์ „๋‹ฌ -> ์ผ๋‹จ ์›น ์„œ๋ฒ„๋ฅผ ๊ฑฐ์นœ๋‹ค!
  4. ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์‹คํ–‰
  5. ํ•„์š” ์‹œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ํ†ต์‹ ํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์กฐํšŒ/์ˆ˜์ •
  6. ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ ์›น ์„œ๋ฒ„๋กœ ๋ฐ˜ํ™˜
  7. ์›น ์„œ๋ฒ„๋Š” ์ตœ์ข… ์‘๋‹ต์„ ํด๋ผ์ด์–ธํŠธ์— ์ „์†ก

์ด๋ ‡๊ฒŒ ๊ด€์‹ฌ์‚ฌ๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ฐ ๊ณ„์ธต์ด ์ฃผ์–ด์ง„ ์—ญํ• ๋งŒ ์ˆ˜ํ–‰ํ•ด ์œ ์ง€๋ณด์ˆ˜์„ฑ, ํ™•์žฅ์„ฑ์ด ํฌ๊ฒŒ ํ–ฅ์ƒ๋œ๋‹ค.

๋ฐฑ์—”๋“œ์˜ ํ•ต์‹ฌ์€ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„

 


๐ŸŒฟNode.js

์„œ๋ฒ„ ์ธก์—์„œ JavaScript๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ๋Ÿฐํƒ€์ž„ ํ™˜๊ฒฝ

Node.js๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์Šคํฌ๋ฆฝํŠธ ์–ธ์–ด ์ด์ƒ์œผ๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ์—ญํ• ์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•˜๋Š” ํ”Œ๋žซํผ์ด๋‹ค.

Node.js์˜ ํŠน์ง•

โœ…๋น„๋™๊ธฐ & ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜

ํŠน์ • ์ž‘์—…(ํŒŒ์ผ ์ฝ๊ธฐ, API ํ˜ธ์ถœ ๋“ฑ)์ด ๋๋‚  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ , ๋‹ค๋ฅธ ์ž‘์—…์„ ๋จผ์ € ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. Node.js๋Š” ๋น„๋™๊ธฐ ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋†’์€ ์„ฑ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.

 

โœ…์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ & ๋…ผ๋ธ”๋กœํ‚น

Node.js๋Š” ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ, ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” ๋…ผ๋ธ”๋กœํ‚น I/O๋ฅผ ํ†ตํ•ด ์—ฌ๋Ÿฌ ์ž‘์—…์„ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•œ๋‹ค. ์ด์— ๋†’์€ ์ฒ˜๋ฆฌ๋Ÿ‰์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

โ—ํ•˜์ง€๋งŒ CPU ์ง‘์•ฝ์  ์ž‘์—…(๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ ์—ฐ์‚ฐ)์˜ˆ๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š๊ธฐ์— ์ด๋Ÿฐ ๊ฒฝ์šฐ ์›Œ์ปค ์Šค๋ ˆ๋“œ๋‚˜ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

 

Node.js๋กœ ์›น ์„œ๋ฒ„ ๋งŒ๋“ค๊ธฐ

node.js๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ„๋‹จํ•œ ์ฝ”๋“œ๋งŒ์œผ๋กœ ์›น ์„œ๋ฒ„๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

 

1. http ๋ชจ๋“ˆ ๊ฐ€์ ธ์˜ค๊ธฐ

Node.js์—์„œ HTTP ํ”„๋กœํ† ์ฝœ์„ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋„๋ก ๋‚ด์žฅ ๋ชจ๋“ˆ์ธ http ๋ชจ๋“ˆ์„ ๋ถˆ๋Ÿฌ์˜จ๋‹ค.

let http = require("http");
  • require(http)๋Š” Node.js์˜ ๊ธฐ๋ณธ ๋‚ด์žฅ ๋ชจ๋“ˆ์„ ๊ฐ€์ ธ์˜จ๋‹ค.
  • http ๋ชจ๋“ˆ์€ ์›น ์„œ๋ฒ„๋ฅผ ๋งŒ๋“ค๊ฑฐ๋‚˜ ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.

 

2. ์„œ๋ฒ„ ์š”์ฒญ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜ ๋งŒ๋“ค๊ธฐ

function onRequest(request, response) {
  response.writeHead(200, { "Content-Type": "text/html" });
  response.write("Hello Node.js");
  response.end();
}
  • onRequest ํ•จ์ˆ˜๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์— ๋ณด๋ƒˆ์„ ๋•Œ ์‹คํ–‰๋˜๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜
  • request๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ณด๋‚ธ ์š”์ฒญ ์ •๋ณด๋ฅผ ํฌํ•จ
  • response๋Š” ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ณด๋‚ผ ์‘๋‹ต์„ ์ œ์–ดํ•˜๋Š” ๊ฐ์ฒด
  • response.writeHead(...)์€ ์‘๋‹ต ํ—ค๋”๋ฅผ ์„ค์ •. 200์€ ์ •์ƒ์ ์ธ ์š”์ฒญ์„ ์˜๋ฏธํ•˜๋Š” HTTP ์ƒํƒœ์ฝ”๋“œ์ด๊ณ ,. Content-type์€ text/html๋กœ ์„ค์ •ํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ HTML ๋ฌธ์„œ๋กœ ์ธ์‹ํ•˜๋„๋ก ํ•˜์˜€๋‹ค.
  • response.write(...)๋Š” ํ™”๋ฉด์— ํ‘œ์‹œ๋  HTML ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•œ๋‹ค.
  • response.end()๋Š” ์‘๋‹ต์„ ์ข…๋ฃŒํ•ด ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค
  •  

3. ์„œ๋ฒ„ ์‹คํ–‰ ๋ฐ ์š”์ฒญ ๋Œ€๊ธฐ

http.createServer(onRequest).listen(8888);
  • http.createServer(onRequest)๋Š” ์œ„์—์„œ ๋งŒ๋“  onRequest ํ•จ์ˆ˜๋กœ ์„œ๋ฒ„๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
  • .listen์€ ์„œ๋ฒ„๊ฐ€ 8888๋ฒˆ ํฌํŠธ์—์„œ ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์„ ๊ธฐ๋‹ค๋ฆฌ๋„๋ก ์„ค์ •ํ•œ๋‹ค.
  •  

4. ์„œ๋ฒ„ ์‹คํ–‰ํ•˜๊ธฐ

ํ„ฐ๋ฏธ๋„์—์„œ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•œ๋‹ค. ์„œ๋ฒ„ ์‹คํ–‰ ํ›„, localhost:8888 ๋กœ ์ ‘์†ํ•˜๋ฉด ๋ฉ”์‹œ์ง€๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.

node server.js


๐Ÿ“œHTTP ํ…œํ”Œ๋ฆฟ

์›น ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ†ต์‹  ํ•  ๋•Œ ์ •ํ•ด์ง„ ์–‘์‹

HTTP ํ—ค๋”

1. ํ†ต์‹  ์ƒํƒœ

HTTP ์ƒํƒœ ์ฝ”๋“œ๋Š” ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์„ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ–ˆ๋Š”์ง€ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด, ํด๋ผ์ด์–ธํŠธ๋Š” ์š”์ฒญ ๊ฒฐ๊ณผ๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • 200 OK: ์ •์ƒ
  • 301 Moved Permanently: ์š”์ฒญํ•œ ๋ฆฌ์†Œ์Šค๊ฐ€ ์˜๊ตฌ์ ์œผ๋กœ ์ด๋™๋จ
  • 302 Found: ์š”์ฒญํ•œ ๋ฆฌ์†Œ์Šค๊ฐ€ ์ผ์‹œ์ ์œผ๋กœ ์ด๋™๋จ
  • 400 Bad Request: ์ž˜๋ชป๋œ ์š”์ฒญ
  • 401 Unauthorized: ์ธ์ฆ ํ•„์š”
  • 403 Forbidden: ์ ‘๊ทผ ๊ธˆ์ง€
  • 404 Not Found: ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Œ
  • 500 Internal Server Error: ์„œ๋ฒ„ ๋‚ด๋ถ€ ์˜ค๋ฅ˜ ๋ฐœ์ƒ
  • 503 Service Unavailable: ์„œ๋ฒ„๊ฐ€ ์ผ์‹œ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ

2. ์‘๋‹ต ํ˜•ํƒœ ์ž‘์„ฑ

์„œ๋ฒ„๋Š” ์‘๋‹ตํ•  ๋•Œ ๋ฐ์ดํ„ฐ๊ฐ€ ์–ด๋–ค ํ˜•ํƒœ์ธ์ง€ ๋ช…์‹œํ•ด์•ผ ํ•œ๋‹ค. ๋Œ€ํ‘œ์ ์ธ content-type์€ ๋‹ค์Œ ๊ฒƒ๋“ค์ด ์žˆ๋‹ค.

  • text/html
  • application/json
  • text/plain
  • image/png

์˜ˆ์‹œ)

HTTP/1.1 200 OK
Content-Type: text/html

 

HTTP ๋ฐ”๋””

HTTP ์š”์ฒญ ๋ณธ๋ฌธ(Request Body)

ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ผ ๋•Œ, ์š”์ฒญ ๋ณธ๋ฌธ์— ํฌํ•จ๋  ์ˆ˜ ์žˆ๋‹ค.

 

HTTP ์‘๋‹ต ๋ณธ๋ฌธ(Response Body)

HTTP ์‘๋‹ต ๋ณธ๋ฌธ์—๋Š” ์‹ค์ œ ๋ฐ์ดํ„ฐ๊ฐ€ ํฌํ•จ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด html ๋ฌธ์„œ์ธ ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‘๋‹ต์ด ์˜จ๋‹ค.

<html>
  <head>
    <title>My Page</title>
  </head>
  <body>
    <h1>Hello, World!</h1>
  </body>
</html>

โ™ป๏ธ๋ชจ๋“ˆํ™”

๋ชจ๋“ˆํ™”๋Š” ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋†’์ด๋Š” ์ค‘์š”ํ•œ ๊ฐœ๋…

Node.js์—์„œ๋Š” require์™€ import๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“ˆ์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๊ณ , ์ด๋ฅผ ํ†ตํ•ด ๊ธฐ๋Šฅ์„ ๋ถ„๋ฆฌํ•˜๊ณ  ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์œ„์—์„œ ์ž‘์„ฑํ•œ server.js์ฝ”๋“œ๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ๋ชจ๋“ˆํ™” ํ•ด๋ณด์•˜๋‹ค.

 

[index.js]

//index.js
let server = require("./server");

server.start();

 

[server.js]

//server.js
let http = require("http");

function start() {
  function onRequest(request, response) {
    response.writeHead(200, { "Content-Type": "text/html" });
    response.write("Hello Node.js");
    response.end();
  }
  http.createServer(onRequest).listen(8888);
}

exports.start = start;

 

์ด๋ฒˆ์—๋Š” node server.js๊ฐ€ ์•„๋‹ˆ๋ผ node index.js๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•ด๋ณด์•˜๋‹ค. localhost:8888์— ์ ‘์†ํ•˜๋ฉด, ์ด์ „๊ณผ ๋™์ผํ•œ ํ™”๋ฉด์ด ๋‚˜์˜จ๋‹ค.

 

๋ชจ๋“ˆํ™”์˜ ์žฅ์ 

  • ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ: ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์ž‡๋‹ค.
  • ์œ ์ง€๋ณด์ˆ˜ ์šฉ์ด: ์ฝ”๋“œ๊ฐ€ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ์–ด ์ˆ˜์ •์ด ๊ฐ„ํŽธํ•˜๋‹ค
  • ํ˜‘์—… ํšจ์œจ์„ฑ ์ฆ๊ฐ€: ์—ฌ๋Ÿฌ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋™์‹œ ์—…ํ•˜๊ธฐ ์šฉ์ดํ•˜๋‹ค.

๐Ÿ”—URL uniform resource locator

์ธํ„ฐ๋„ท์—์„œ ์›น ํŽ˜์ด์ง€๊ฐ€ ์–ด๋”” ์žˆ๋Š”์ง€ ์œ„์น˜๋ฅผ ์•Œ๋ ค์ฃผ๋Š” ์ฃผ์†Œ

URL ๊ตฌ์กฐ

ํ”„๋กœํ† ์ฝœ://๋„๋ฉ”์ธ:ํฌํŠธ๋ฒˆํ˜ธ/๊ฒฝ๋กœ?์ฟผ๋ฆฌ์ŠคํŠธ๋ง#ํ•ด์‹œ

//์˜ˆ์‹œ
https://example.com:8080/home?user=da&age=24#section1
๊ตฌ์„ฑ ์š”์†Œ ์„ค๋ช… ์˜ˆ์ œ
ํ”„๋กœํ† ์ฝœ ์‚ฌ์šฉ๋˜๋Š” ํ†ต์‹  ๋ฐฉ์‹ https://
๋„๋ฉ”์ธ ์„œ๋ฒ„์˜ ์ฃผ์†Œ example.com
ํฌํŠธ ๋ฒˆํ˜ธ ์„œ๋ฒ„์—์„œ ์‚ฌ์šฉ๋˜๋Š” ํฌํŠธ-๊ธฐ๋ณธ๊ฐ’์€ 80(HTTP) ๋˜๋Š” 443(HTTPS) :8080
๊ฒฝ๋กœ ์š”์ฒญํ•˜๋Š” ๋ฆฌ์†Œ์Šค์˜ ์œ„์น˜ \home
์ฟผ๋ฆฌ ์ŠคํŠธ๋ง ์ถ”๊ฐ€์ ์ธ ์š”์ฒญ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ ?user=da&age=24
ํ•ด์‹œ ๋ฌธ์„œ ๋‚ด ํŠน์ •์œ„์น˜ ์ง€์ •(์„œ๋ฒ„์—๋Š” ์ „๋‹ฌ๋˜์ง€ ์•Š์Œ) #section1

 

URL ์ฃผ์†Œ ์ฝ˜์†” ์ถœ๋ ฅํ•˜๊ธฐ

[server.js]

let http = require("http");
let url = require("url");
function start() {
  function onRequest(request, response) {
    let pathname = url.parse(request.url).pathname;
    console.log(`pathname: ${pathname}`);

    response.writeHead(200, { "Content-Type": "text/html" });
    response.write("Hello Node.js");
    response.end();
  }
  http.createServer(onRequest).listen(8888);
}

exports.start = start;

์ฝ˜์†”์— ์ฃผ์†Œ ์ถœ๋ ฅ


๐Ÿšช๋ผ์šฐํ„ฐ

ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญํ•œ URL ๊ฒฝ๋กœ๋ฅผ ๋ถ„์„ํ•˜์—ฌ ์ ์ ˆํ•œ ๊ธฐ๋Šฅ์„ ์‹คํ–‰ํ•˜๋Š” ์—ญํ• 

๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ๋ผ์šฐํ„ฐ๋ฅผ ์ ์šฉํ•˜์—ฌ ๋ฆฌํŒฉํ† ๋ง ํ•ด๋ณด์•˜๋‹ค.

  • index.js๋Š” ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์—ญํ• 
  • server.js๋Š” HTTP ์„œ๋ฒ„๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์š”์ฒญ์„ ๋ฐ›์„ ๋•Œ ๋ผ์šฐํ„ฐ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์—ญํ• 
  • router.js๋Š” ์š”์ฒญ๋œ URL ๊ฒฝ๋กœ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๋ผ์šฐํ„ฐ

 

[index.js]

//index.js
let server = require("./server");
let router = require("./router");

server.start(router.route);
  • server.js์™€ router.js๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.
  • server.start(router.route)๋ฅผ ํ˜ธ์ถœํ•ด ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•˜๊ณ , ๋ผ์šฐํ„ฐ๋ฅผ ์—ฐ๊ฒฐํ•œ๋‹ค.

 

[server.js]

//server.js
let http = require("http");
let url = require("url");

function start(route) {
  function onRequest(request, response) {
    let pathname = url.parse(request.url).pathname;
    route(pathname);

    response.writeHead(200, { "Content-Type": "text/html" });
    response.write("Hello Node.js");
    response.end();
  }
  http.createServer(onRequest).listen(8888);
}

exports.start = start;
  • ์š”์ฒญ์ด ์˜ค๋ฉด URL์„ ๋ถ„์„ํ•ด pathname์„ ์ถ”์ถœํ•œ ํ›„, ๋ผ์šฐํ„ฐ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

 

[router.js]

//router.js
function route(pathname) {
  console.log(`pathname: ${pathname}`);
}

exports.route = route;
  • routeํ•จ์ˆ˜๋Š” ์š”์ฒญ๋œ URL ๊ฒฝ๋กœ๋ฅผ ๋ฐ›์•„ url์„ ์ฝ˜์†”์— ์ถœ๋ ฅํ•œ๋‹ค.
  • exports.route=route๋กœ ๋‹ค๋ฅธ ํŒŒ์ผ์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ชจ๋“ˆํ™”ํ•œ๋‹ค.
url ์š”์ฒญ->์„œ๋ฒ„->๋ผ์šฐํ„ฐ->์‘๋‹ต์˜ ํ๋ฆ„์„ ๊ฐ€์ง„๋‹ค.

 

๋ผ์šฐํ„ฐ ํ™œ์šฉ 1. url์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ์ฝ˜์†” ์ฐ๊ธฐ

๋ผ์šฐํ„ฐ๋ฅผ ํ™•์žฅํ•˜์—ฌ ํŠน์ • URL ์š”์ฒญ์— ๋Œ€ํ•ด ๊ฐ๊ฐ ๋‹ค๋ฅธ ์‘๋‹ต์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค.

 

[requestHandler.js]
๋ผ์šฐํ„ฐ๊ฐ€ ๊ฐ ๋ฃจํŠธ๋ฅผ ๋ถ„๋ฐฐํ•ด์„œ ๊ฒฝ๋กœ๋ฅผ ์•Œ๋ ค์ฃผ๋ฉด, ๊ฒฝ๋กœ์— ๋”ฐ๋ผ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ์ž‘์—…์„ ์•Œ๋ ค์ค€๋‹ค.

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

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

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

exports.handle = handle;

 

[server.js]

let http = require("http");
let url = require("url");

function start(route, handle) {
  function onRequest(request, response) {
    let pathname = url.parse(request.url).pathname;

    if (pathname === "/favicon.ico") {
      response.writeHead(204);
      response.end();
      return;
    }
    route(pathname, handle);

    response.writeHead(200, { "Content-Type": "text/html" });
    response.write("Hello Node.js");
    response.end();
  }
  http.createServer(onRequest).listen(8888);
}

exports.start = start;

 

[router.js]

function route(pathname, handle) {
  console.log(`pathname: ${pathname}`);
  handle[pathname]();
}

exports.route = route;

 

handle[pathname]()์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๊ฐ์ฒด ์†์„ฑ ์ ‘๊ทผ ๋ฐฉ์‹๊ณผ ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ๊ฒฐํ•ฉํ•œ ํŒจํ„ด์ด๋‹ค.

 

๊ฐ์ฒด๋กœ์„œ์˜ handle์€ ๋นˆ ๊ฐ์ฒด๋กœ ์ƒ์„ฑ๋˜๊ณ , ์ด ๊ฐ์ฒด๋Š” URL ๊ฒฝ๋กœ๋ฅผ key, ํ•ด๋‹น ๊ฒฝ๋กœ๋ฅผ ์ฒ˜๋ฆฌํ•  ํ•จ์ˆ˜๋ฅผ value๋กœ ์ง€์ •ํ•œ๋‹ค.
router.js์—์„œ handle[pathname]()์€ ๋‹ค์Œ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

  1. handle ๊ฐ์ฒด์—์„œ pathname์— ํ•ด๋‹นํ•˜๋Š” ์†์„ฑ์„ ์ฐพ์Œ
  2. ์ฐพ์€ ํ•จ์ˆ˜๋ฅผ ์ฆ‰์‹œ ํ˜ธ์ถœ

์ด์Šˆ1. ๊ฒฝ๋กœ ์˜ˆ์™ธ์ฒ˜๋ฆฌ

TypeError: handle[pathname] is not a function
at route (C:\Users\monic\OneDrive\๋ฐ”ํƒ• ํ™”๋ฉด\programmers\TennisShoppingMall\router.js:3:19)
at Server.onRequest (C:\Users\monic\OneDrive\๋ฐ”ํƒ• ํ™”๋ฉด\programmers\TennisShoppingMall\server.js:13:5)
at Server.emit (node:events:519:28)
at parserOnIncoming (node:_http_server:1140:12)
at HTTPParser.parserOnHeadersComplete (node:_http_common:119:17)

Node.js v20.16.0

 

์ด๋Š” ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ž๋™์œผ๋กœ ์š”์ฒญํ•˜๋Š” /favicon.ico ๊ฒฝ๋กœ์— ๋Œ€ํ•œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๊ฐ€ ๋˜์ง€ ์•Š์•„์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ์˜€๋‹ค.
server.js์—์„œ ๋ผ์šฐํŒ… ์ „์—, /favicon.ico ์š”์ฒญ์„ ๋ฌด์‹œํ•˜๋„๋ก ์˜ˆ์™ธ์ฒ˜๋ฆฌํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์˜€๋‹ค.

if (pathname === "/favicon.ico") {
response.writeHead(204);
response.end();
return;
}

 

๋ผ์šฐํ„ฐ ํ™œ์šฉ 2. url์— ๋”ฐ๋ผ ํ”„๋ก ํŠธ์—”๋“œ์— ๋‹ค๋ฅธ response ๋ณด๋‚ด๊ธฐ

url์— ๋”ฐ๋ผ ๋ธŒ๋ผ์šฐ์ €์— ๋‹ค๋ฅธ ํ…์ŠคํŠธ๋ฅผ ์ถœ๋ ฅํ•˜๋„๋ก ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•ด๋ณด์•˜๋‹ค.

 

[requestHandler.js]

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

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

function login(response) {
  console.log("login");
  response.writeHead(200, { "Content-Type": "text/html" });
  response.write("Login Page");
  response.end();
}

exports.handle = handle;
  • server.js์— ์žˆ๋˜ response๋ฅผ requestHandler๋กœ ์ด๋™ํ•˜์—ฌ, ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜์— ๋”ฐ๋ผ ๊ฐ๊ฐ ๋‹ค๋ฅธ ํ…์ŠคํŠธ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

[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/plain" });
    response.write("404 Not found");
    response.end();
  }
}

exports.route = route;
  • ์š”์ฒญ ๊ฒฝ๋กœ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ, 404 ํŽ˜์ด์ง€๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ์„ค์ •ํ•˜์˜€๋‹ค. /favicon.ico ์ฒ˜๋Ÿผ ์„ค์ •๋˜์ง€ ์•Š์€ ๊ฒฝ๋กœ๋กœ ์ ‘์† ์‹œ, ์„œ๋ฒ„๊ฐ€ ๋‹ค์šด๋˜์ง€ ์•Š๊ณ  ๋ธŒ๋ผ์šฐ์ €์— 404 Not Found๊ฐ€ ํ‘œ์‹œ๋œ๋‹ค.

 

์ด์Šˆ2. ํ•œ๊ธ€ ๊นจ์ง

์ถœ๋ ฅ ํ…์ŠคํŠธ๋ฅผ ํ•œ๊ธ€๋กœ ์„ค์ •ํ•˜๋ฉด ๋ธŒ๋ผ์šฐ์ €์—์„œ ๊นจ์ ธ ๋ณด์ด๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค.

Content-Type ํ—ค๋”์— ๋ฌธ์ž ์ธ์ฝ”๋”ฉ์„ ์ง€์ •ํ•˜์ง€ ์•Š์•„์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ์˜€๋‹ค. main ํ•จ์ˆ˜์™€ login ํ•จ์ˆ˜์—์„œ Content-Type ํ—ค๋”์— charset์„ ์ถ”๊ฐ€ํ•ด ๋ธŒ๋ผ์šฐ์ €๊ฐ€ UTF-8์ธ์ฝ”๋”ฉ์œผ๋กœ ํ•œ๊ธ€์„ ์ œ๋Œ€๋กœ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ–ˆ๋‹ค.

'๐Ÿ•Š๏ธํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๋ฐ๋ธŒ์ฝ”์Šค > TIL' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[๋ฐ๋ธŒ์ฝ”์Šค] API์™€ REST API ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜๊ธฐ  (0) 2025.04.05
[๋ฐ๋ธŒ์ฝ”์Šค] ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‹œ์ž‘ํ•˜๊ธฐ(๐Ÿ‹Docker, MariaDB, SQL)  (0) 2025.04.04
[๋ฐ๋ธŒ์ฝ”์Šค] ์›น ํŽ˜์ด์ง€์— ์ƒ๋ช… ๋ถˆ์–ด๋„ฃ๊ธฐ(CSS, Javascript)  (0) 2025.04.02
[๋ฐ๋ธŒ์ฝ”์Šค] ์›น ๊ฐœ๋ฐœ์„ ์œ„ํ•œ ์ฒซ ๊ฑธ์Œ(์›น ๊ตฌ์กฐ, HTML)  (0) 2025.04.01
[๋ฐ๋ธŒ์ฝ”์Šค] Github์œผ๋กœ ํ˜‘์—… ์‹œ์ž‘ํ•˜๊ธฐ(Branch, Pull Request)  (1) 2025.03.31
'๐Ÿ•Š๏ธํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๋ฐ๋ธŒ์ฝ”์Šค/TIL' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [๋ฐ๋ธŒ์ฝ”์Šค] API์™€ REST API ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜๊ธฐ
  • [๋ฐ๋ธŒ์ฝ”์Šค] ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‹œ์ž‘ํ•˜๊ธฐ(๐Ÿ‹Docker, MariaDB, SQL)
  • [๋ฐ๋ธŒ์ฝ”์Šค] ์›น ํŽ˜์ด์ง€์— ์ƒ๋ช… ๋ถˆ์–ด๋„ฃ๊ธฐ(CSS, Javascript)
  • [๋ฐ๋ธŒ์ฝ”์Šค] ์›น ๊ฐœ๋ฐœ์„ ์œ„ํ•œ ์ฒซ ๊ฑธ์Œ(์›น ๊ตฌ์กฐ, HTML)
ํ‚ํ‚์ž‰
ํ‚ํ‚์ž‰
๋ฟŒ๋ก ํŠธ ๊ฐœ๋ฐœ์ž(์ง€๋ง์ƒ)์˜ ํ’€์Šคํƒ ๊ฐœ๋ฐœ์ž ๋„์ „๊ธฐ
  • ํ‚ํ‚์ž‰
    monicx.dev
    ํ‚ํ‚์ž‰
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (86) N
      • ๐Ÿ–ฅ๏ธdevelop (11)
        • Github (2)
        • Frontend (4)
        • Backend (5)
        • Mobile (0)
        • CS (0)
        • Three.js (0)
        • Docker (0)
      • ๐Ÿ“•review (15)
        • ์ฑ… (10)
        • ํ–‰์‚ฌ (0)
        • ํšŒ๊ณ  (2)
      • โญproject (5)
        • petiary (2)
        • ๆšŽ่ฉ  (0)
        • ์ธํ„ด (2)
      • ๐Ÿ˜ถ‍๐ŸŒซ๏ธalgorithm (0)
      • ๐Ÿ’กtips (1)
      • ๐Ÿ˜Ždaily (10)
      • ๐Ÿ•น๏ธgame (0)
      • ๐Ÿ•Š๏ธํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๋ฐ๋ธŒ์ฝ”์Šค (44) N
        • TIL (26) N
        • ํ”„๋กœ์ ํŠธ (13) N
        • ํšŒ๊ณ  (5)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
  • ๋งํฌ

    • ๋ฒจ๋กœ๊ทธ
  • ์ธ๊ธฐ ๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.3
ํ‚ํ‚์ž‰
[๋ฐ๋ธŒ์ฝ”์Šค] Hello, Backend!(์„œ๋ฒ„, HTTP, Node.js)
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”