[node.js] 3. 이벤트 처리

     




이벤트 처리는 특정 이벤트가 발생했을 때 프로그램이 어떤 반응을 보이는지 만드는 것입니다. 이벤트 라는 단어가 생소할 수 있는데, 스마트폰을 예를 들면, 터치가 발생했을 때 다음화면으로 넘어가도록 작동시키는 것이 이벤트 처리이다. 안드로이드에서는 터치 이벤트 처리를 onTouchListener라는 클래스로 동작시킨다. 


기존에 자바 스크립트의 경우도 이벤트를 등록하기 위해 addEventListener라는 클래스를 사용하는데, 이는 윈도우 객체에 연결되어 있기 때문에 window.addEventListener라고 사용하지만, node.js에서는 전역객체인 process에 붙여서 사용한다. 하지만 node.js는 addEventListener라는 긴 이름보다 on이라는 간단한 메서드를 사용하여 표기할 수 있다. 





다음으로 간단하게 이벤트를 처리하는 방법을 알아보겠습니다. 예제에서는 uncaughtException을 사용해서 이벤트 처리가 어떤식으로 이루어지는지 보여주고 있습니다.




등록한 uncaughtException은 에러가 발생했을 때 실행됩니다. 아래서 setInterval을 통해 2초마다 에러를 주고 3번 에러가 발생시 종료되는 코드를 작성했습니다. 예상대로라면 2초마다 omg이 나오고 3번째 omg에 goodbye가 나와야 하는데 이상하네요.. 중요한 것이 아니니 그냥 넘어가겠습니다.




프로젝트를 진행하다보면 여러가지 이벤트 핸들러를 등록하게 되는데 node.js에서는 하나의 이벤트를 10번 등록하면 개발자의 실수로 생각하고 오류를 보냅니다. 만약 한 이벤트를 10개 이상 등록한다면 setMaxListeners(limit)를 통해서 개수를 늘릴 수 있습니다. 만약 무한개 연결하고 싶으면 limit을 0으로 설정하면 됩니다.



이벤트 연결은 on을 사용하였지만 제거는 어떻게 사용할까요. 특정 이벤트 핸들러를 제거할 경우는 removeListener(eventName, handler)를 사용하고 모든 이벤트 핸들러를 제거할 경우는 removeAllListener([eventName])을 입력하면 됩니다. []표시는 생략가능 표시입니다.


그 밖에도 이벤트를 강제 실행시키는 메소드는 emit('event')입니다. 이벤트를 강제로 실행시킬경우 이벤트 핸들러는 실행되지만 이벤트는 실행되지 않는점이 중요합니다. 즉 종료시 이벤트를 강제로 호출할경우 종료되지는 않고 종료할 때 실행되는 코드만 실행됩니다.


실제로 종료하고 싶을 경우는 process.exit()와 같은 메소드를 사용합니다.




node.js에서 이벤트를 연결할 수 있는 모든 객체는 EventEmitter 객체의 상속을 받습니다. process역시 EventEmitter를 상속받기 때문에 이벤트 핸들러를 등록할 수 있었습니다. EventEmitter객체의 메소드는 addEventListener(eventName, eventHandler), on(eventName, eventHandler), setMaxListeners(limit), removeListener(eventName, handler), removeAllListener(), once(eventName, eventHandler)가 있습니다. 


다음 코드는 EventEmitter를 이용해 이벤트 핸들러를 연결하는 예제입니다.





이벤트의 생성과 연결이 번거롭다고 생각할 수도 있습니다. 그냥 함수를 만들고 실행하면 될지도 모르지요. 하지만 보통 생성과 연결을 따로 모듈화 하기 때문에 따로 구현하게 됩니다. 


이벤트의 생성과 이벤트의 연결(핸들러 구현)을 따로 만들어 실제 실행되는 메인에서는 핸들러를 구현하고 연결하며 이벤트의 생성은 모듈로 구현하여 require를 통해 불러오게 됩니다. 







반응형

댓글

Designed by JB FACTORY