๋๋์ด ๋ฐฑ์๋ ํํธ ์์! ์ค๋์ ๋ฐฑ์๋์ ๊ตฌ์กฐ์ Node.js, HTTP ํ ํ๋ฆฟ ๋ฑ ๋ฐฑ์๋ ์ ๋ฌธ์ ์ํ ๊ธฐ์ด ๊ฐ๋ ์ ๋ฐฐ์ฐ๊ณ ์ฝ๋๋ฅผ ์์ฑํด๋ณด์๋ค.
๐งฎ๋ฐฑ์๋์ ๊ธฐ๋ณธ ๊ตฌ์กฐ
๋ฐฑ์๋๋ ์ฌ์ฉ์์๊ฒ ๋ณด์ด์ง ์๋ ์๋ฒ ์ธก ๋ก์ง์ ๋ด๋นํ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ํต์ฌ ํํธ์ด๋ค. ํด๋ผ์ด์ธํธ-์๋ฒ ์ํคํ ์ฒ ๊ด์ ์์ ๋ณด๋ฉด ๋ฐฑ์๋๋ ํฌ๊ฒ ์ธ ๊ฐ์ง ์ฃผ์ ๊ตฌ์ฑ ์์๋ก ์ด๋ฃจ์ด์ ธ ์๋ค.

์น ์๋ฒ, ์น ์ดํ๋ฆฌ์ผ์ด์ ์๋ฒ, ๋ฐ์ดํฐ๋ฒ ์ด์ค
1. ์น ์๋ฒ
ํด๋ผ์ด์ธํธ๋ก๋ถํฐ HTTP ์์ฒญ์ ๋ฐ์์ ์ฒ๋ฆฌ
- ์ ์ ๋ฆฌ์์ค ์ฒ๋ฆฌ: HTML, CSS, ์ด๋ฏธ์ง ํ์ผ๊ณผ ๊ฐ์ ์ ์ ์ฝํ ์ธ ๋ฅผ ์ง์ ํด๋ผ์ด์ธํธ์๊ฒ ์ ๊ณตํ๋ค.
- ์์ฒญ ๋ผ์ฐํ : ๋์ ์ปจํ ์ธ ์ ๋ํ ์์ฒ์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ๋ก ์ ๋ฌํ๋ค.
- ๋ก๋ ๋ฐธ๋ฐ์ฑ: ์ฌ๋ฌ ์๋ฒ์ ํธ๋ํฝ์ ๋ถ์ฐํ์ฌ ์์คํ ์์ ์ฑ์ ๋ณด์ฅํ๋ค.
- ๋ณด์: SSL/TLS ์ํธํ, ๊ธฐ๋ณธ์ ์ธ ๋ณด์ ํํฐ๋ง์ ์ ๊ณตํ๋ค.
๋ํ์ ์ธ ์น ์๋ฒ๋ก๋ Apache, Nginx, IIS ๋ฑ์ด ์๋ค.
โญ ์น ์๋ฒ๋ ์ ์ ํ์ด์ง์ ๋ํ ์ฒ๋ฆฌ์, ๋์ ์์ฒญ์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ผ๋ก ์ ๋ฌํ๋ ์ญํ
2. ์น ์ดํ๋ฆฌ์ผ์ด์ ์๋ฒ
์ค์ ์ดํ๋ฆฌ์ผ์ด์ ๋ก์ง์ด ์คํ๋๋ ๊ณณ
- ๋์ ์ฝํ ์ธ ์์ฑ: ์ฌ์ฉ์ ์์ฒญ์ ๋ฐ๋ผ ๋ง์ถคํ ์ฝํ ์ธ ๋ฅผ ์์ฑ
- ๋น์ฆ๋์ค ๋ก์ง ์ฒ๋ฆฌ: ์ดํ๋ฆฌ์ผ์ด์ ์ ํต์ฌ ๊ธฐ๋ฅ ๊ตฌํ
- ๋ฐ์ดํฐ ์ฒ๋ฆฌ: ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ํต์ ์ ํตํ CRUD ์ฐ์ฐ
- ์ธ์ ๊ด๋ฆฌ: ์ฌ์ฉ์ ์ธ์ฆ ๋ฐ ์ํ ์ ์ง
๋ํ์ ์ธ ์น ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ๋ก๋ Tomcat, JBoss, WebLogic, Node.js ๋ฑ์ด ์์ผ๋ฉฐ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ํ๋ ์์ํฌ์ ๋ฐ๋ผ ๋ค์ํ ์ต์ ์ด ์กด์ฌํ๋ค.
โญ ์น ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ๋ ๋น์ฆ๋์ค ๋ก์ง์ ์ค์ฌ
3. ๋ฐ์ดํฐ๋ฒ ์ด์ค
๋ฐ์ดํฐ์ ์๊ตฌ ์ ์ฅ์
๋ฐ์ดํฐ์ ์ ์ฅ ๋ฐ ๊ฒ์, ํธ๋์ญ์ ๊ด๋ฆฌ, ๋ฐ์ดํฐ ๋ณด์, ๋ฐ์ดํฐ ์ต์ ํ ๋ฑ์ ์ํํ๋ค. MySQL, PostgreSQL, MongoDB, Redis ๋ฑ ๋ค์ํ ์ ํ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์กด์ฌํ๋ค.
์ค์ ์ดํ๋ฆฌ์ผ์ด์ ์์์ ๋ฐ์ดํฐ ํ๋ฆ
์น ์ดํ๋ฆฌ์ผ์ด์ ์์ ๋ฐ์ดํฐ๋ ๋ค์๊ณผ ๊ฐ์ ํ๋ฆ์ผ๋ก ์ฒ๋ฆฌ๋๋ค.
- ํด๋ผ์ด์ธํธ๊ฐ HTTP ์์ฒญ์ ๋ณด๋
- ์น ์๋ฒ๊ฐ ์์ฒญ์ ๋ฐ์ ์ ์ /๋์ ์ฝํ ์ธ ์ฌ๋ถ ํ๋จ
- ๋์ ์ปจํ ์ธ ๋ผ๋ฉด ์น ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ๋ก ์์ฒญ ์ ๋ฌ -> ์ผ๋จ ์น ์๋ฒ๋ฅผ ๊ฑฐ์น๋ค!
- ์น ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ๋ ๋น์ฆ๋์ค ๋ก์ง ์คํ
- ํ์ ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํต์ ํ์ฌ ๋ฐ์ดํฐ ์กฐํ/์์
- ์ฒ๋ฆฌ ๊ฒฐ๊ณผ ์น ์๋ฒ๋ก ๋ฐํ
- ์น ์๋ฒ๋ ์ต์ข ์๋ต์ ํด๋ผ์ด์ธํธ์ ์ ์ก
์ด๋ ๊ฒ ๊ด์ฌ์ฌ๋ฅผ ๋ถ๋ฆฌํ์ฌ ๊ฐ ๊ณ์ธต์ด ์ฃผ์ด์ง ์ญํ ๋ง ์ํํด ์ ์ง๋ณด์์ฑ, ํ์ฅ์ฑ์ด ํฌ๊ฒ ํฅ์๋๋ค.

๐ฟ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]()
์ ๋ค์ ๋์์ ์ํํ๋ค.
- handle ๊ฐ์ฒด์์ pathname์ ํด๋นํ๋ ์์ฑ์ ์ฐพ์
- ์ฐพ์ ํจ์๋ฅผ ์ฆ์ ํธ์ถ
์ด์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์ธ์ฝ๋ฉ์ผ๋ก ํ๊ธ์ ์ ๋๋ก ์ถ๋ ฅํ ์ ์๊ฒ ํ๋ค.

