[Node.js] 간단한 웹 서버 만들기

http 모듈로 간단한 웹 서버 열기

노드의 http 모듈을 사용하면 웹 서버 기능을 담당하는 서버 객체를 만들 수 있다.

var http = require('http');
var server = http.createServer();
server.listen(3000function(){
    console.log('웹 서버가 시작되었습니다');
});
cs

http 모듈을 불러온 후 http 객체의 createServer() 메소드를 호출하면 서버 객체가 반환된다. 이 서버 객체의 listen() 메소드를 호출하면 서버가 시작된다. 첫 번째로 들어가는 인자는 포트, 두 번째 인자는 콜백 함수이다. 서버를 중지하고 싶다면 콘솔 창에서 중지 버튼을 누르면 된다.

createServer() 메소드를 호출하여 반환된 서버 객체에서 사용할 수 있는 메소드이다.

listen(port, [hostname], [backlog], [callback]): 서버 실행 후 대기
close([callback]): 서버 종료

PC나 서버에 이더넷 카드가 여러 개 있는 경우 서버에서 사용할 수 있는 IP주소가 여러 개 존재한다. IP 주소가 여러 개인 경우 특정 IP를 지정해서 서버를 실행해야 할 때도 있다. 이런 경우 listen() 메소드를 호출할 때 IP와 백로그(동시 접속 연결 수)를 직접 지정하면 된다.

예를 들어, server.listen('3000', '192.168.0.5', '50000', function() ... 처럼 말이다.


클라이언트가 웹 서버에 요청할 때 발생하는 이벤트 처리하기

웹 브라우저가 이 웹 서버에 접속한 후 데이터를 요청하면 그때마다 적절한 이벤트가 발생하므로 다양한 상황에 맞추어 콜백 함수를 각각 등록하면 된다.

다음은 서버 객체에서 사용할 수 있는 주요 이벤트이다.

connection: 클라이언트가 접속하여 연결이 만들어질 때 발생
request: 클라이언트가 요청할 때 발생
close: 서버를 종료할 때 발생

이제 웹 브라우저에서 요청할 때 어떤 이벤트가 발생하는지 보기 위해 코드를 작성하자.

var http = require('http');
var server = http.createServer();
var port = 3000;
server.listen(port, function(){
    console.log('서버 시작됨');
});
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.log(req);
});
server.on('close'function(){
    console.log('서버 종료됨');
});
cs

파일을 실행하고 웹 브라우저에서 localhost:3000에 접속하면 브라우저 상에는 변화가 없지만 브라켓 콘솔 창에 클라이언트 접속, 요청 정보들이 모두 출력될 것이다.

클라이언트(웹 브라우저)가 서버에 연결되면 connection 이벤트가 발생한다. 연결이 만들어져 콜백 함수가 호출될 때는 Socket 객체가 파라미터로 전달된다. 이 Socket 객체는 연결 정보를 담고 있으므로 address() 메소드를 호출하여 클아이언트의 IP, 포트 정보를 알 수 있다.

클라이언트가 특정 패스로 요청을 하면 request 이벤트가 발생한다. 콜백 함수로 전달되는 요청 객체를 console.dir() 메소드로 화면에 출력할 수 있다.

* 파일을 실행했을 때 EADDRINUSE 에러가 발생할 경우 이전에 동일한 포트로 실행한 서버를 정상적으로 닫고 실행했는지 확인해보자.



간단한 웹 서버를 만들었다. 그러나 웹 브라우저에서 페이지를 열어도 아무런 응답을 보내주지 않기 때문에 웹 브라우저에서는 결과 페이지를 볼 수가 없다. 서버에서 응답을 보내도록 request 이벤트를 처리하는 콜백 함수를 작성해보자.

var http = require('http');
 
var server = http.createServer();
var port = 3000;
server.listen(port, function(){
    console.log('서버 시작됨');
});
 
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('클라이언트 요청이 들어옴');
    res.writeHead(200, {"Content-Type""text/html; charset=utf-8"});
    res.write("<!DOCTYPE HTML>");
    res.write("<h1>노드제이에스로부터의 응답 페이지");
    res.end();
});
 
server.on('close'function(){
    console.log('서버 종료됨');
});
cs

HTML 코드를 res 객체에 넣을 수 있다. writeHead(), write(), end() 메소드를 사용한다.

이제 브라우저에서 localhost:3000으로 접속하면


정상적으로 클라이언트 요청에 대한 응답이 이루어짐을 볼 수 있다.

request 이벤트를 사용하지 않고 서버 객체를 만들 때 사용한 createServer() 메소드 호출 부분에 응답을 보내는 코드를 바로 입력할 수도 있다.

var http = require('http');
 
var server = http.createServer(function(req, res){
    console.log('클라이언트 요청이 들어옴');
    res.writeHead(200, {"Content-Type""text/html; charset=utf-8"});
    res.write("<!DOCTYPE HTML>");
    res.write("<h1>노드제이에스로부터의 응답 페이지");
    res.end();
});
 
var port = 3000;
server.listen(port, function(){
    console.log('서버 시작됨');
});
 
server.on('connection'function(socket){
    var addr = socket.address();
    console.log('클라이언트 접속: %s, %d', addr.address, addr.port);
});
 
server.on('close'function(){
    console.log('서버 종료됨');
});
cs

request 이벤트 부분 코드를 삭제하고 createServer() 메소드에 그 내용을 넣으면 된다. callback 함수에 똑같이 req, res 객체를 인자로 넣고 같은 기능의 서버를 만들 수 있다.

댓글 없음:

Powered by Blogger.