웹 브라우저가 server에 요청을하면, 그때마다 서버에서 발생하는 이벤트를 정의해야합니다.

그럴때는 callback 함수를 등록하면 됩니다.


표는 서버객체에서 사용할 수 있는 이벤트들입니다.



node.js server 객체에서 사용할 수 있는 event 입니다.

 이벤트이름         

 설명

 connection

  클라이언트가 접속하여 연결이 만들어질 때 발생하는 이벤트입니다.

 request       

 클라이언트가 요청할 떄 발생하는 이벤트입니다.

 close         

  서버를 종료할때 발생하는 이벤트입니다.






var http = require('http');

//웹서버 객체 생성
var server = http.createServer();

//웹서버 시작하여 3000번 포트에서 대기 설정
var port = 3000;
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);
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.end();
});
//서버종료 이벤트 처리
server.on('close', function(){
console.log('서버가 종료됩니다.');
});



서버 실행화면




웹브라우저와 클라이언트가 웹서버에 연결되면 connection 이벤트 발생! => server.on 에 등록한 콜백메소드가 호출되는것 확인가능합니다.



클라이언트가 특정path로 요청하면 request 이벤트가 발생합니다.

'request'라는 이름으로 콜백메소드를 등록했기에

"클라이언트 요청이들어왔습니다." 문구 확인가능합니다.



웹브라우져를 켜고, 127.0.0.1:3000 으로 접속합니다. 그러면 아래와같은 서버에서 응답, 그리고 웹브라우져에서 응답을 보실수있습니다.

서버(콘솔창) 응답.


웹페이지 응답.




또한, res객체에 writeHead(), write(), end() 메소드를 사용하면

클라이언트로 응답을 보낼 수 있음. end() 메소드는 응답을 보냈다는것을 의미합니다.




응답(response) 객체의 주요 메서드


  메소드 이름  

  설명

   writeHead(statusCode             

     [, statusMessage][,headers])


  응답으로 보낼 헤더를 만듭니다.

  write(chunk[, encoding][, callback]) 

 응답본문(body)데이터를 만듭니다. 여러번 호출될 수 있습니다.

 end([data][,encoding][,callback])

 클라이언트로 응답을 전송합니다. 파라미터에 데이터가 들어있다면 이 데이터를 포함시켜 응답을 전송합니다.

 클라이언트의 요청이 있을 때 한번은 호출되어야 응답을 보내며, 콜백함수가 지정되면 응답이 전송된후 

 콜백함수가 호출됩니다.



<<참고 

Content-Type에 설정할 수 있는 대표적인 MIME Type


 Content Type의 값

 설명

 text/plain

 일반 텍스트문서

 text/html 

 HTML문서

 text/css

 CSS문서

 text/xml

 XML 문서

 image/jpeg, image/png

 JPEG파일, PNG 파일

 video/mpeg, audio/mp3

 MPEG 비디오파일, MP3음악파일

 application/zip

 zip 압축파일








노드는 대부분 이벤트기반으로하는 비동기 방식으로 처리합니다. (callback method를 사용합니다.)

노드에는 이벤트를 보내고 받을수 있는 EventEmitter라는것이 있습니다.



EventEmitter   //부모 클래스


   상속!!(EventEmitter)   (     자식클래스객체 ---상속--> EventEmitter )


객체------------- //자식 클래스

  EventListener 객체   -   on() 리스너 등록, emit() 이벤트 전달

 -------------

  

노드 객체(자식객체)는 EventEmitter를 상속받을 수 있으며,  상속받은 후에는  EventEmitter 객체의 on()과 emit() 메소드를 사용할 수 있습니다.


또한 once()메소드도있습니다.



Method 명 

 설명

 on(event, listener)  

 지정한 이벤트의 리스너를 추가합니다.

 once(event, listener) 

 지정한 이벤트의 리스너를 추가하지만 한번 실행한 후에는 자동으로 리스너가 제거됩니다.

 removeListener(event, listener)

 지정한 이벤트에 대한 리스너를 제거합니다.


 

계산기 객체를 Event기능 추가한 모듈로 만들어보기


calc.js


var util = require('util');
var EventEmitter = require('events').EventEmitter;

var Calc = function(){
var self = this;
this.on('stop', function(){
console.log('Calc에 stop event 전달됨.');
});
};

util.inherits(Calc, EventEmitter);

Calc.prototype.add = function(a, b){
return a+b;
}

module.exports = Calc;
module.exports.title = 'calculator';


EventEmitter는 events모듈안에 정의되어이씁니다.

따라서 require()메소드를 호출하여 evnets모듈을 불러들인후,

그안에 속성으로 들어있는 EventEmitter 객체를 참조합니다.


Calc객체는 계산기 객체로서 function 키워드를 사용해 프로토타입객체로만듭니다.

 프로토타입 객체 안에서는 this키워드를 이용해 자기자신을 가리킬수있으며,

 그 객체 안에 정의된 속성에 접근할 수 있습니다.

 

그런다음 Calc 객체가 이벤트 처리를 할 수 있도록 EventEmitter를 상속하도록 만듭니다.


util모듈의 inherits()메소드를 사용하면 쉽게 상속을 구현할수있습니다.

Calc 객체는 EventEmiiter 객체를 상속받게 되었습니다.


main.js


var Calc = require('./calc');
var calc = new Calc();
calc.emit('stop');
console.log(Calc.title + ' 에 stop 이벤트 전달');

 



+ Recent posts