brunch

매거진 개발개발

You can make anything
by writing

C.S.Lewis

by 워니 Jun 21. 2016

Node.js - Event

Node.js 배우기

Event(이후 '이벤트'로 통칭)

Node.js(이후 '노드'로 통칭)는 이벤트 기반 비동기 방식으로 작동한다. 

그러므로 노드를 잘 다루기 위해서는 이벤트에 대해 이해하여야 한다.


노드에서 이벤트를 호출하고 여러 처리를 하기 위해서는 EventEmitter 객체를 상속받아 구현해야 한다.

아래 예제 코드를 통해 EventEditter를 상속받은 객체를 가지고 이벤트를 생성하고 호출하는 등 여러 처리하는 법을 살펴보자.

* 코드 복사붙여넣기가 필요한 경우 http://madeitwantit.tistory.com/32 에서 가능하다.



EventEmitter

EventEmitter 클래스는 events 모듈에 의해 정의되고 제공된다.

EventEmitter = require('events');

위와 같이 EventEmitter를 정의할 수 있다.


EventEmitter의 메서드

EventEmiter.on('이벤트 이름', '리스너 함수') - 지정한 '이벤트 이름' 이벤트에 '리스너 함수'를 리스너 배열 가장 끝에 추가한다. 

EventEmiter.once('이벤트 이름', '리스너 함수') - on() 메서드와 기능이 비슷하다. 다만 이 메서드로 등록된 리스너는 일회성으로 한 번 실행된 후 제거된다. 

EventEmiter.addListener('이벤트 이름', '리스너 함수') - on() 메서드와 같다.

EventEmiter.emit('이벤트 이름'[, arg]...) - '이벤트 이름'  이벤트에 등록된 리스너 함수를 등록된 순서에 따라 호출한다. 이벤트가 존재한다면 true, 그 외에는 false를 반환한다.

EventEmiter.setMaxListeners(n) - EventEmitter는 디폴트로 최대 리스너 수가 10으로 지정되어 있다. 10보다 더 많은 리스너를 등록할 때 사용한다. Infinity나 0을 지정하면 제한 없이 리스너를 등록할 수 있다.

EventEmiter.getMaxListeners() - 현재 EventEmitter에 지정된 최대 리스너 수를 반환한다.

EventEmiter.listenerCount('이벤트 이름') - '이벤트 이름'에 등록되어 있는 리스너의 수를 반환한다.

EventEmiter.listeners('이벤트 이름') - '이벤트 이름'에 등록되어 있는 리스너 배열의 사본을 반환한다.

EventEmiter.removeAllListeners(['이벤트 이름']) - 모든 리스너나 파라미터에 지정한 '이벤트 이름'의 리스너를 제거한다.

EventEmiter.removeListeners('이벤트 이름', '리스너 함수') - '이벤트 이름'에 등록되어 있는 특정 '리스너 함수'를 제거한다. 같은 리스너가 여러 개 등록되어 있으면 이 메서드를 여러 번 호출해야 한다.


EventEmitter의 이벤트

'newListener' - 새로운 이벤트를 등록할 때, 추가될 리스너를 리스너 배열에 추가하기 전에 호출된다. 이벤트에 리스너가 전달되기 위해 이벤트 이름과 추가될 리스너가 전달된다.

'removeListener' - 리스너가 제거된 후 호출된다.


하단의 예제를 통해 newListener가 호출되는 시점에 대해 살펴보자.                                                              

* 코드 복사붙여넣기가 필요한 경우 http://madeitwantit.tistory.com/32 에서 가능하다.




참고문헌:
모던 웹을 위한 Node.js 프로그래밍 - 윤인성
Haruair (http://haruair.com/blog/3396)
Node.js Documentation (https://nodejs.org/api)
조대협의 블로그 (http://bcho.tistory.com/885)
매거진의 이전글 자바스크립트 기초 문법 정리 Part 3
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari