본문 바로가기

Node.js공부/Node.js 원활한 사용을 위한 세부 공부

노드의 기본 기능 알아보기 - 이벤트, 파일읽기

반응형

노드로 프로그램을 만들기 위해서는 몇 가지 기본적인 내용을 알아두는 게 좋다.

이벤트가 무엇인지, 파일은 어떻게 다루는지 등을 알아야 노드로 프로그래밍을 할 때 두려움이 사라진다.


1. 이벤트

노드는 대부분 이벤트를 기반으로 하는 비동기 방식으로 처리한다. 예를 들어, 어떤 함수를 실행한 결과물도 이벤트로 전달하는데 이벤트는 한쪽에서 다른 쪽으로 알림 메시지를 보내는 것과 비슷하다. 즉 '지금 이쪽의 상태는 이렇다'를 다른 쪽으로 보내는 것이다.


이벤트를 보내고 받기 위해서 노드의 객체는 EventEmitter를 상속받을수 있으며, 이 객체의 on()emit() 메소드를 사용할 수 있다.

on() 메소드는 이벤트가 전달된 객체에 이벤트 리스너를 설정하는 역할을 하는데 이 리스너 함수는 객체로 전달된 이벤트를 받아 처리할 수 있다.

보통은 노드 내부에서 미리 만들어 제공하는 이벤트를 받아 처리하지만, 필요할 때는 직접 이벤트를 만들어 전달할 수 있다.


once()메소드는 이벤트 리스너 함수가 한 번이라도 실행하고 나면 자동으로 제거되므로 한 번만 받아서 처리할 수 있는 메소드이다.


emit()메소드를 사용하면 이벤트를 다른 쪽으로 전달 즉, 실행할 수 있다.


process라는 EventEmitter 객체가 있다고 가정하고 밑의 코드를 설명하자면, tick이벤트를 직접 만들고 2초 후에 setTimeout() 메소드를 사용해 process.emit()메소드를 호출하면서 tick이벤트를 process객체로 전달하는 것이다. process.on() 메소드를 호출하여 이벤트를 등록하면 이 메소드를 호출하면서 파라미터로 전달한 tick이벤트가 발생했을 때 그 다음에 나오는 콜백 함수가 실행된다. 


process.on('tick', function(count){

console.log('tick event: %s', count);

});


setTimeout(function() {

console.log('2초 후 tick이벤트 전달 시도.');

process.emit('tick', '2');

},2000);




그런데, 계속해서 process 객체로 이벤트를 전달하게 된다면, 같은 이름의 이벤트를 사용하는 경우에 충돌이 생길 수가 있다. 이 때문에 별도의 모듈 파일을 만들고 그 안에서 이벤트를 처리하도록 하는 것이 좋다.


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';


Calc객체는 계산기 객체로써 function 키워드를 사용해 프로토타입 객체로 만든다. 프로토타입 객체 안에서는 this 키워드를 이용해 자기 자신을 가리킬 수 있으며, 그 객체 안에 정의된 속성에 접근할 수 있다. 그런 다음 Calc 객체가 이벤트 처리를 할 수 있도록 EventEmitter를 상속하도록 만든다. 상속은 util모듈에 있는 inherits() 메소드를 사용하면 쉽게 정의할 수 있다. 코드의 가장 위쪽에서 require() 메소드를 호출하여 util모듈을 불러왔기 때문에 util.,inherits() 메소드를 호출하는 코드 사용이 가능하다.


Calc객체 안에 들어있는 prototype객체의 속성으로 add함수를 추가하면 new 연산자를 이용해 Calc 객체의 인스턴스 객체를 만들었을 때 add()함수를 사용할 수 있다. 타이틀 속성 값으로는 calculator을 사용하였다.





2. 파일읽기


메소드 이름 

설명 

readFile(filename, [encoding],[callback]) 

비동기식 IO로 파일을 읽어 들인다. 

writeFile(filename, data, encoding='utf8', [callback]) 

비동기식 IO로 파일을 씁니다. 

 readFileSync(filename, [encoding])

동기식 IO로 파일을 읽어들인다. 

 writeFileSync(filename, data, encoding='utf8')

동기식 IO로 파일을 쓴다. 


위의 메소드들은 한꺼번에 데이터를 읽을 때 주로 사용하는것인데, 만약 일부분만 읽고 쓰고싶다면 다른 메소드를 활용해야 한다.


메소드 이름 

설명 

 open(path, flags [, model] [, callback])

파일을 연다 

read(fd, buffer, offset, length, position [, callback]) 

지정한 부분의 파일 내용을 읽어 들인다. 

write(fd, buffer, offset, length, position [, callback]) 

파일의 지정한 부분에 데이터를 쓴다. 

close(fd [, callback]) 

파일을 닫아 준다. 


파일의 일부분만 읽어 들이려면 먼저 open() 메소드로 파일을 열어야 합니다. 

함수를 호출하는 순서는 'open - write - close' 순서여야 합니다. 

반응형