노드에 기본으로 들어 있는 http 모듈을 사용하면 웹 서버 기능을 담당하는 서버 객체를 만들 수 있습니다. http 모듈을 로딩했을 때 반환되는 객체에는 createServer()메소드가 정의 되어 있습니다.
const http = require('http');
const server = http.createServer();
const port = 3000;
server.listen(port, () => {
console.log('Running : %d', port);
})
http 모듈에 들어 있는 서버 기능을 사용하려면 먼저 require() 메소드로 http 모듈을 불러옵니다.
http 변수를 만든 후 이 변수에 할당합니다.
http 객체의 createServer() 메소드를 호출하면서버 객체가 반환됩니다. 이 서버 객체의 listen()메소드를 호출하면 웹 서버가 시작됩니다. 서버를 시작할 때는 포트를 3000번으로 지정하여 해당 포트에서 클라이언트의 요청을 대기 합니다.
listen() 메소드를 호출 할 때 전달하는 두 번째 파라미터는 콜백함수로, 웹 서버가 시작되면 호출됩니다.
웹서버를 만들어 실행하는 과정을 보면 먼저 createServer 메소드를 호출하여 웹 서버 객체를 만들고, 그 객체의 listen()메소드를 소출하여 특정 포트에서 대기하도록 설정합니다. createServer()메소드로 만든 서버 객체에서 사용할 수 있는 대표적인 메소드는 다음과 같습니다.
메소드 이름 | 설 명 |
listen(port, [hostname], [backlog], [callback]) | 서버를 실행하여 대기 |
close([callback]) | 서버를 종료 |
PC나 서버 기계에 이더넷 카드가 여러개 있는 경우, 서버에서 사용 할 수 있는 인터넷 주소, 즉 IP 주소가 여러 개 존재할 수 있습니다. 이렇게 IP 주소가 여러 개 있을 때는 IP를 지정해서 서버를 실행해야 할 때도 있습니다. 이런 경우에는 listen() 메소드를 호출하면서 IP를 직접 지정합니다. 다음 코드를 사용하면 IP와 함께 백로그(실질적으로 동시 접속 연결 수를 결정하는 정보)를 지정할 수 있습니다.
const http = require('http');
const server = http.createServer();
const host = '192.168.0.5';
const port = 3000;
server.listen(port, host, '50000', () => {
console.log('Running : %d', host, port);
})
클라이언트가 웹 서버에 요청할 때 발생하는 이벤트 처리
만약 웹 브라우저가 이 웹 서버에 접속한 후 데이터를 요청하면 그때마다 적절한 이벤트가 발생하므로 다양한 상황에 맞추어 콜백 함수를 각각 등록하면 됩니다. 다음은 서버 객체에서 사용할 수 있는 주요 이벤트.
이벤트 이름 |
설 명 |
connection | 클라이언트가 접속하여 연결이 만들어질 때 발생하는 이벤트 |
request | 클라이언트가 요청할 때 발생하는 이벤트. |
close | 서버를 종료할 때 발생하는 이벤트 |
const http = require('http');
const server = http.createServer();
const port = 3000;
server.listen(port, () => {
console.log('Server Running! : %d', port);
});
server.on('connection', (socket) => {
const addr = socket.address();
console.log('클라이언트 접속 : %s, %d', addr.address, addr.port);
});
server.on('request', (req, res) => {
console.log('클라이언트 요청');
res.writeHead(200, {"Content-Type" : "text/html; charset=utf-8"});
res.write("<!DOCTYPE html>");
res.write("<html>");
res.write("<head>");
res.write("<title>응답 페이지</title>");
res.write("</head>");
res.write("<body>");
res.write("<h1>노드제이에스로부터의 응답 페이지</h1>");
res.write("</body>");
res.write("</html>");
res.end();
});
server.on('close', () => {
console.log('서버가 종료');
});
on( ) 메소드는 이벤트를 처리할 때 사용하는 가장 기본적인 메소드입니다. 이 메소드로 connection, request, close 이벤트를 처리할 수 있는 콜백 함수를 각각 등록해 두면 상황에 맞게 자동 호출됩니다. 클라이언트가 요청을 해 왔을 때 발생하는 request 이벤트를 처리할 수 있게 등록해 둔 콜백 함수에서는 res객체를 사용해서 클라이언트로 응답을 보냅니다. res 객체를 사용해서 응답을 보낼 때 사용하는 주요 메소드는 다음과 같습니다.
메소드 이름 | 설 명 |
writeHead(statusCode [, statusMessage][, headers]) | 응답으로 보낼 헤더를 만듭니다. |
write(chunk[, encoding][, callback] | 응답 본문(body) 데이터를 만듭니다. 여러 번 호출될 수 있습니다. |
end([data][, encoding][, callback]) | 클라이언트로 응답을 전송합니다. 파라미터에 데이터가 들어 있다면 이 데이터를 포함시켜 응답을 전송합니다. 클라이언트의 요청이 있을 때 한번은 호출되어야 응답을 보내며, 콜백 함수가 지정되면 응답이 전송된 후 콜백 함수가 호출됩니다. |