Study/Node.js

[노드JS] 계산기 객체를 모듈로 만들어 보기

AC 2019. 3. 23. 01:08



지금까지 실행해 본 코드만으로도 한쪽에서 이벤트를 만들어 전달할 수 있고, 


다른 쪽에서 그것을 받아 처리할 수 있다는 것을 알 수 있었다. 


그런데 항상 process 객체를 사용해 이벤트를 전달한다면, 같은 이름의 이벤트를 사용하는 경우에 충돌이 생길 수도 있다.


이 때문에 별도의 모듈 파일을 만들고 그 안에서 이벤트를 처리하도록 만드는 것이 좋다.


그러면 앞에서 다룬 모듈 구성 방법을 잘 생각하면서 새로운 모듈을 만들어 보자.


먼저 계산기 객체를 모듈로 만들기 위해 calc3.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() 메소드를 호출하여 


events 모듈을 불러들인 후 그 안에 속성으로 들어 있는 EventEmitter 객체를 참조한다.





Calc 객체는 계산기 객체로서 function 키워드를 사용해 프로톹차입 객체(Prototype Object)로 만든다.


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


그 객체 안에 정의된 속성에 접근할 수 있다. 그런 다음 Calc 객체가 이벤트 처리를 할 수 이;ㅆ도록


EventEmitter를 상속하도록 만든다.


상속은 util 모듈에 있는 inherits() 메소드를 사용하면 쉽게 정의할 수 있다.


코드의 가장 위쪽에서 require() 메소드를 호출하여 util 모듈을 불러왔기 때문에


util.inherits() 메소드를 호출하는 코드를 넣어도 오류는 발생하지 않는다.



Calc 객체 안에 들어 있는 prototype 객체의 속성으로 add 함수를 추가하면 


new 연산자를 이용해 Calc 객체의 인스턴스 객체를 만들었을 때 add() 함수를 사용할 수 있다. 


코드의 마지막 부분에서는 calc3.js 파일에 정의한 모듈을 불러들이는 쪽에서 


Calc 객체를 참조할 수 있도록 module.exprots에 Calc객체를 지정한다.


추가적으로 title 속성의 값으로 calculator라는 이름을 설정한다.


이 계산기 객체로 전달되는 stop 이벤트를 처리하기 위해 


Calc 객체안에서 on() 메소드를 호출하는 부분도 눈여겨볼 필요가 있다. 







이렇게 만든 모듈을 사용하는 코드는 다음과 같이 별도의 파일에 입력한다.




var Calc = require('./calc3');


var calc = new Calc();

calc.emit('stop');


console.log(Calc.title + '에 stop 이벤트 전달함.');




require() 메소드를 호출하면서 ./calc3을 파라미터로 전달하면 



별도의 모듈 파일 안에 정의해 둔 Calc 객체를 변수로 사용할 수가 있다.



Calc객체는 프로토타입 객체로 계산기 기능을 정의만 한 것이므로


먼저 new 연산자를 이용해 인스턴스 객체를 만든다.


Calc 객체가 EventEmitter를 상속하므로 인스턴스 객체의 emit() 메소드를 호출하여


stop 이벤트를 전달한다.


이 파일을 실행하면 다음과 같이 직접 정의한 stop 이벤트가 정상적으로 전달된 것을 볼 수 있다.






▲ 직접 만든 모듈에 이벤트를 보내고 모듈 안에서 이벤트 처리하기




이번 포스팅 키워드 on() 메소드, emit() 메소드

LIST