Responsive Advertisement

Node.js Events: 이벤트 처리와 활용 방법

Node.js는 비동기 이벤트 기반의 런타임 환경으로, 이벤트를 통해 비동기 작업을 처리하는 것이 핵심입니다. 이를 위해 Node.js는 이벤트 모듈(Event Module)을 제공하며, 이벤트 리스너와 이벤트 발생을 쉽게 구현할 수 있습니다. 이 글에서는 Node.js의 이벤트 시스템을 이해하고, 어떻게 이벤트를 처리하고 활용할 수 있는지 알아보겠습니다.

Node.js 이벤트란?

Node.js는 비동기 작업을 처리할 때 이벤트 기반 아키텍처를 사용합니다. 이 구조에서는 특정 작업이 완료되면 이벤트가 발생하고, 그 이벤트에 연결된 리스너(Listener) 함수가 실행됩니다. 이 방식을 사용하면 비동기 작업을 효율적으로 관리할 수 있습니다.

Node.js의 events 모듈은 이러한 이벤트를 처리하기 위한 도구를 제공합니다. 이를 통해 이벤트를 발생시키고, 특정 이벤트가 발생했을 때 실행될 리스너 함수를 등록할 수 있습니다.

이벤트 모듈 불러오기

const EventEmitter = require('events');

Node.js에서 이벤트를 사용하려면 events 모듈에서 EventEmitter 클래스를 불러와야 합니다. 이 클래스는 이벤트를 처리하는 핵심 도구로, 이벤트를 생성하고 관리할 수 있는 다양한 메서드를 제공합니다.

EventEmitter 사용하기

EventEmitter를 사용해 이벤트를 처리하는 기본적인 방법은 다음과 같습니다:

  • 이벤트 리스너 등록: 특정 이벤트가 발생했을 때 실행할 함수를 등록합니다.
  • 이벤트 발생: 이벤트를 수동으로 발생시켜 등록된 리스너를 실행합니다.

이벤트 리스너 등록

이벤트 리스너는 on() 또는 addListener() 메서드를 사용해 등록할 수 있습니다.

// 이벤트 모듈 불러오기
const EventEmitter = require('events');

// EventEmitter 인스턴스 생성
const eventEmitter = new EventEmitter();

// 'greet' 이벤트에 대한 리스너 등록
eventEmitter.on('greet', () => {
    console.log('Hello, Node.js!');
});

// 이벤트 발생
eventEmitter.emit('greet');  // 결과: 'Hello, Node.js!'

위 코드에서는 greet라는 이벤트에 리스너를 등록하고, emit() 메서드를 사용해 이벤트를 발생시킵니다. 이벤트가 발생하면 등록된 리스너 함수가 실행되어 "Hello, Node.js!" 메시지를 출력합니다.

매개변수를 사용한 이벤트 처리

이벤트를 발생시킬 때, 리스너 함수로 데이터를 전달할 수 있습니다. emit() 메서드에 추가적인 인수를 전달하면, 리스너 함수가 해당 데이터를 받을 수 있습니다.

// 'greet' 이벤트에 매개변수를 전달하는 리스너 등록
eventEmitter.on('greet', (name) => {
    console.log(`Hello, ${name}!`);
});

// 이벤트 발생 시 매개변수 전달
eventEmitter.emit('greet', 'John');  // 결과: 'Hello, John!'

위 코드에서는 emit() 메서드에 "John"이라는 매개변수를 전달하여, 리스너 함수가 이를 받아 출력합니다. 이벤트를 발생시킬 때 필요한 데이터를 함께 전달할 수 있습니다.

한 번만 실행되는 이벤트 리스너

이벤트 리스너는 특정 이벤트가 발생할 때마다 실행되지만, once() 메서드를 사용하면 해당 이벤트가 한 번만 실행되도록 설정할 수 있습니다.

// 'greet' 이벤트에 대한 리스너 등록 (한 번만 실행)
eventEmitter.once('greet', () => {
    console.log('이 이벤트는 한 번만 실행됩니다.');
});

// 이벤트 발생
eventEmitter.emit('greet');  // 결과: '이 이벤트는 한 번만 실행됩니다.'
eventEmitter.emit('greet');  // 실행되지 않음

위 코드에서는 once() 메서드를 사용해 greet 이벤트에 리스너를 등록했으며, 이벤트가 한 번 발생하면 이후에는 실행되지 않습니다.

이벤트 리스너 제거

이벤트 리스너를 더 이상 사용하지 않으려면 removeListener() 또는 off() 메서드를 사용하여 리스너를 제거할 수 있습니다.

// 리스너 함수 정의
function greetUser(name) {
    console.log(`Hello, ${name}!`);
}

// 이벤트에 리스너 등록
eventEmitter.on('greet', greetUser);

// 리스너 실행
eventEmitter.emit('greet', 'Alice');  // 결과: 'Hello, Alice!'

// 리스너 제거
eventEmitter.removeListener('greet', greetUser);

// 이벤트 발생 (리스너가 제거되었으므로 실행되지 않음)
eventEmitter.emit('greet', 'Alice');

위 코드에서는 removeListener()를 사용해 greet 이벤트에 등록된 리스너를 제거했습니다. 이후 이벤트를 발생시켜도 리스너가 실행되지 않습니다.

이벤트 리스너의 개수 확인

EventEmitter 인스턴스에서 등록된 이벤트 리스너의 개수를 확인하려면 listenerCount() 메서드를 사용할 수 있습니다.

// 여러 개의 리스너 등록
eventEmitter.on('greet', () => console.log('첫 번째 리스너'));
eventEmitter.on('greet', () => console.log('두 번째 리스너'));

// 'greet' 이벤트에 등록된 리스너의 개수 확인
const listenerCount = eventEmitter.listenerCount('greet');
console.log(`'greet' 이벤트에 등록된 리스너: ${listenerCount}`);

이 코드는 greet 이벤트에 두 개의 리스너를 등록한 후, listenerCount()를 사용해 해당 이벤트에 등록된 리스너의 수를 출력합니다.

이벤트 활용 사례

Node.js의 이벤트 시스템은 서버 측에서 매우 유용하게 활용됩니다. 예를 들어, HTTP 서버에서 요청을 처리할 때도 이벤트 기반으로 동작합니다.

HTTP 서버에서 이벤트 처리

const http = require('http');

// 서버 생성
const server = http.createServer((req, res) => {
    if (req.method === 'GET') {
        res.writeHead(200, { 'Content-Type': 'text/plain' });
        res.write('GET 요청을 받았습니다.');
        res.end();
    }
});

// 'request' 이벤트에 리스너 등록
server.on('request', (req, res) => {
    console.log('클라이언트 요청이 발생했습니다.');
});

// 서버 실행
server.listen(3000, () => {
    console.log('서버가 http://localhost:3000 에서 실행 중입니다.');
});

위 예제에서 http.createServer()는 HTTP 서버 객체를 생성하며, 이 객체는 EventEmitter를 상속받아 request와 같은 이벤트를 처리합니다. 클라이언트 요청이 들어오면 request 이벤트가 발생하고, 서버는 이에 대한 응답을 반환합니다.

결론

Node.js의 이벤트 시스템은 비동기 작업을 효율적으로 처리하는 강력한 도구입니다. EventEmitter를 사용해 이벤트를 발생시키고, 리스너를 등록하여 다양한 작업을 비동기적으로 처리할 수 있습니다. 이러한 이벤트 기반 아키텍처는 Node.js의 핵심이며, 서버 개발에서 매우 중요한 역할을 합니다. 프로젝트에서 Node.js의 이벤트 시스템을 활용하여 효율적인 비동기 처리를 구현해보세요!

댓글 쓰기