서버는 클라이언트에서 요청을 받고, 요청의 내용을 처리한 뒤 클라이언트에 응답을 보낸다. 따라서 서버에는 요청을 받는 부분과 응답을 보내는 부분이 있어야 한다. 클라이언트로부터 요청이 왔을 때 어떤 작업을 수행할지 이벤트 리스너를 미리 등록해두어야 한다.
이벤트 리스너를 가진 노드 서버를 만들어 볼 것이다.
http 모듈 / createServer()
http 서버가 있어야 웹 브라우저의 요청을 처리할 수 있으므로 http 모듈을 사용한다.
http 모듈의 createServer 메서드는 인수로 요청에 대한 콜백 함수를 넣을 수 있으며, 요청이 들어올 때마다 매번 콜백 함수가 실행된다. 따라서 이 콜백 함수에 응답을 적으면 된다.
server.js 파일을 만들고 코드를 작성한다.
const http = require('http');
http.createServer((req, res) => {})
createServer의 콜백 부분을 보면 req와 res 매개변수가 있다. 요청에 대한 응답과 서버 연결을 추가해보자.
const http = require('http');
http.createServer((req, res) => {
res.write('<H1>hello</H1>');
}).listen(8080, () => {
console.log('8080번 포트 서버 대기 중');
})
코드를 실행시키면 콘솔에 위와 같은 문장이 출력된다. 성공적으로 연결되었으니 http://localhost:8080/로 접속한다.
listen 메서드에 콜백 함수를 넣는 대신 서버에 listening 이벤트 리스너를 붙여도 된다.
const http = require('http');
const server = http.createServer((req, res) => {
res.write('<H1>hello</H1>');
});
server.listen(8080);
server.on('listening', () => {
console.log('8080번 포트 서버 대기 중');
});
server.on('error', (error) => {
console.error(error);
})
error 이벤트 리스너도 붙였다.
여러 서버 동시 실행
creaeteServer를 원하는 만큼 호출하여 한 번에 여러 서버를 실행할 수도 있다.
const http = require('http');
http.createServer((req, res) => {
res.write('<H1>hello</H1>');
}).listen(8080, () => {
console.log('8080번 포트 서버 대기 중');
})
http.createServer((req, res) => {
res.write('<H1>hello2</H1>');
}).listen(8081, () => {
console.log('8081번 포트 서버 대기 중');
})
이때 포트 번호가 같으면 EADDRINUSE 에러가 발생하기 때문에 포트 번호는 다르게 해야 한다.
fs모듈과 HTML파일
res.write에 HTML을 적지 않고 HTML파일을 따로 만들고 fs 모듈로 읽어 전송할 수 있다.
server.js와 같은 경로에 index.html파일을 만들었다.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Node.js 웹 서버</title>
</head>
<body>
<h2>안녕하세요</h2>
<h2>gamzaggang7입니다</h2>
</body>
</html>
const http = require('http');
const fs = require('fs');
const server = http.createServer((req, res) => {
const data = fs.readFile('./index.html');
res.end(data);
}).listen(8080, () => {
console.log('8080번 포트 서버 대기 중');
});
요청이 들어오면 먼저 fs 모듈로 HTML파일을 읽고, data 변수에 저장된 버퍼를 그대로 클라이언트에 보낸다.
그런데 이렇게만 작성하면 아래와 같은 에러가 발생한다.
fs.readFile 메서드의 콜백 함수가 누락되었기 때문에 발생하는 것이다. fs.readFile은 비동기적으로 파일을 읽고 콜백 함수를 호출하는데, 이 콜백 함수는 error와 data 두 개의 매개변수를 받아야 한다. 이를 해결하기 위해서는 콜백 함수를 사용하지 않고 fs.promises 모듈을 사용하여 readFile을 프로미스 기반으로 사용하고, await를 이용해 동기식으로 파일을 읽을 수 있다.
const http = require('http');
const fs = require('fs').promises;
http.createServer(async (req, res) => {
try {
const data = await fs.readFile('./index.html');
res.end(data);
} catch (error) {
console.log(error);
res.end(error.message);
}
}).listen(8080, () => {
console.log('8080번 포트 서버 대기 중');
});
이렇게 Node.js로 http서버를 구축해 보았다. 하지만 지금은 모든 요청에 대해 한 가지 요청밖에 할 수 없다.
요청별로 다른 응답을 하는 방법은 다음 게시물로,,

'Node.js' 카테고리의 다른 글
[Node.js] Node.js란? / Node.js와 npm 설치 / npm 프로젝트 실행 / 의존성 종류 / parsel (1) | 2024.03.29 |
---|---|
[Node.js] http 모듈로 서버 구축하기(2) - REST API (24) | 2024.03.13 |
node.js와 mongoDB로 웹 만들기 (5) 아이디 중복체크(ajax) (0) | 2023.01.17 |
node.js와 mongoDB로 웹 만들기 (4) mongoDB 연결 (0) | 2023.01.13 |
node.js와 mongoDB로 웹 만들기 (3) 로그인, 회원가입 (0) | 2023.01.12 |