오늘 뭐했냐/개발에 대한 주저리
23.08.24 node.js (Event 모듈)
스스로에게
2023. 9. 3. 04:19
프로젝트에 필요한 기능을 구현하기 위해서 자료를 찾아보는데 이벤트를 이용한 코드를 보게 되었다. node.js에 내장 모듈이며 자주 사용된다고 하기에 기본은 알고 있어야 할 것 같아서 찾아봤다.
이벤트의 작동원리는 이렇다.
- 이벤트 리스너 등록: 특정 이벤트가 발생했을 때 실행되어야 하는 함수(이벤트 리스너 또는 이벤트 핸들러라고도 함)를 등록합니다. Node.js의 EventEmitter에서는 on 메서드를 사용해 이벤트 리스너를 등록할 수 있습니다.
- 이벤트 발생(emit): 특정 조건이나 상황에서 이벤트를 발생시킵니다. 이것은 대게 emit 메서드를 사용하여 수행됩니다.
- 이벤트 큐와 이벤트 루프: Node.js는 이벤트 루프와 이벤트 큐를 사용하여 비동기 이벤트를 관리합니다. 이벤트가 발생하면 해당 이벤트에 연결된 리스너들이 이벤트 큐에 추가됩니다. 이벤트 루프는 이벤트 큐에 있는 리스너들을 하나씩 실행합니다.
- 리스너 실행: 이벤트 루프가 이벤트 큐에서 리스너를 꺼내와 실행합니다. 만약 여러 리스너가 같은 이벤트에 대해 등록되어 있다면, 그들은 등록된 순서대로 실행됩니다.
- 상태 변경 또는 부가 작업: 리스너 함수 내에서는 어떠한 작업이든 수행될 수 있습니다. 데이터베이스에 쓰기 작업을 할 수도 있고, 다른 이벤트를 발생시킬 수도 있습니다.
- 리스너 해제: 필요한 경우 이벤트 리스너를 해제할 수 있습니다. 이를 위해 removeListener 또는 removeAllListeners 메서드를 사용할 수 있습니다.
이렇게 이벤트 리스너는 특정 이벤트에 대응하여 미리 등록해두고, 해당 이벤트가 발생하면 실행되는 형태로 작동합니다. 콜백과 유사해 보이지만 이는 굉장히 큰 차이점이다. 차이점은, 콜백함수는 비동기식 함수에서 결과를 반환할때 호출되지만,이벤트핸들링은 옵저버 패턴에 의해 작동됩니다. 그래서 Node.js가 I/O 작업이 끝났을 때 또는 특정 상황에서 사용자에게 알릴 필요가 있을 때 유용합니다.
- addListener(event, listener) : on() 메소드와 같습니다. 이벤트를 생성하는 메소드입니다.
- .on(event, listener) : addListener()과 동일합니다. 이벤트를 생성하는 메소드입니다.
- once(event, listener) : 이벤트를 한 번만 연결한 후 제거합니다.
- removeListener(event, listener) : 특정 이벤트의 특정 이벤트 핸들러를 제거합니다. 이 메소드를 이용해 리스너를 삭제하면 리스너 배열의 인덱스가 갱신되니 주의해야 합니다.
- .removeAllListeners([event]) : 모든 이벤트 핸들러를 제거합니다.
- .off([event]) : removeListener와 기능이 같습니다.
- .setMaxListeners(n) : n으로 한 이벤트에 최대허용 개수를 정해줍니다. node.js는 기본값으로 한 이벤트에 10개의 이벤트 핸들러를 작성할 수 있는데, 11개 이상을 사용하고 싶다면 n값을 넘겨주면 됩니다. n값으로 0을 넘겨 주면 연결 개수 제한이 사라집니다.
- .emit(eventName[ ...args]) : 이벤트를 발생시킵니다.
- .listenerCount(이벤트명) : 현재 리스너가 몇개 연결되어 있는지 확인
이벤트를 활용하면 보다 다양하게 방법으로 필요에 따라 처리를 할 수 있다. 그리고 속도도 빠르고 많이 사용한다고 하니 알아둬야겠지.