Node.js HTTP 모듈은 Hyper Text Transfer Protocol(HTTP)로 데이터를 전송할 수 있게 해주는 모듈이다.
이를 사용하기 위해선 require() 메소드를 통해 HTTP 모듈을 추가(include)해야한다.
var http = require('http');
HTTP 모듈은 HTTP 서버를 만들고, 포트(Port)를 지정하여, request 를 listen 하고, 해당 내용에 대해 client 에게 적절하게 response 할 수 있다. createServer() 메소드를 통해 HTTP server 를 만들 수 있다.
var http = require('http');
// 웹 서버 객체를 만든다.
var server = http.createServer();
// 웹 서버를 시작하여 3333번 포트에서 대기한다.
var port = 3333;
server.listen(port, function(){
console.log('웹 서버가 시작되었습니다. : %d', port);
});
http 모듈의 메소드인 http.createServer() 을 호출해서 웹 서버 객체를 생성한다. (4행) 그리고, listen 메소드를 호출해서, 해당 서버 객체에 3333번 포트를 대상으로 클라이언트의 요청을 대기시키는 명령을 실행한다(8행)
위 코드는 간단하지만 http 모듈을 사용해서 웹 서버를 생성했으며, 3333번 포트의 요청을 대기하게 될 것이다.
HTTP 모듈을 사용한 웹 서버 내의 이벤트 처리
웹 서버에는 클라이언트의 행동에 따라서 다양한 이벤트가 발생한다. Node.js 는 비동기 이벤트 기반의 장점을 살려 이 이벤트마다, 콜백 메소드를 설정할 수 있다.
var http = require('http');
// 웹 서버 객체를 만든다.
var server = http.createServer();
// 웹 서버를 시작하여, 3333번 포트에서 대기하도록 한다.
var port = 3333;
server.listen(port, function(){
console.log('웹 서버가 시작되었습니다. : %d', port);
});
// 클라이언트가 연결되었을 때의 이벤트 처리
server.on('connection', function(socket){
var addr = socket.address();
console.log('클라이언트가 접속했습니다. : %s, %d', addr.address, addr.port);
});
// 클라이언트 요청에 대한 이벤트 처리
server.on('request', function(req, res){
console.log('클라이언트 요청이 들어왔습니다.');
console.dir(req);
});
// 서버 종료 이벤트 처리
server.on('close', function(){
console.log('서버가 종료됩니다.');
});
해당 콜백 메소드들은 클라이언트의 접속, 요청이나 서버 종료 등의 이벤트에 따라서 다양한 타이밍이 작동되게 될 것이다.
HTTP 헤더 추가하기
RESTful한 통신에는 특히 헤더의 정보가 중요하다. Node.js는 response에 본문 이외에 헤더를 작성하는 방법도 있다.
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/html'});
res.write('Hello World!');
res.end();
}).listen(8080);
res.writeHead() 메소드는 두개의 파라미터를 가지고 있다. 첫번째 파라미터는 status code로, 웹 페이지의 실행 상태에 대한 정보를 담고 있다. (200 = OK) 두번째 파라미터는 response header 의 객체로, { } 안에 배열의 형태로 계속하여 추가할 수 있다.
Request 정보(URL) 읽기
http.createServer() 메소드의 파라미터 중 req는 request의 약자로, Client의 요청에 대한 정보를 담고 있는 객체다. 그중 req.url 필드는 Client가 해당 서버로 요청했을 때 사용한 URL 정보(도메인 네임 제외)를 담고 있다.
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/html'});
res.write(req.url);
res.end();
}).listen(8080);