Node.js - 이벤트: 초보자 가이드

안녕하세요, 미래의 Node.js 마법사 여러분! 오늘 우리는 Node.js 이벤트의 세계에 흥미로운 여정을 떠납니다. 코드를 한 줄도 작성해본 적이 없어도 걱정하지 마세요 - 저는 여러분의 친절한 안내자가 되겠습니다. 이 주제를 단계별로 탐구해보겠습니다. 그럼 커피(또는 차, 만약 그게 여러분의 취향이라면)를 한 잔 마시고, 시작해보겠습니다!

Node.js - Events

Node.js에서 이벤트는 무엇인가요?

복잡한 내용에 뛰어들기 전에 간단한 비유로 시작해보겠습니다. 상상해보세요, 여러분이 파티(물론 Node.js 파티겠죠!)에 참석했을 때. 친구들과 이야기하다가 갑자기 누군가가 "피자가 왔어!"라고 소리칩니다. 그 소리는 이벤트이고, 여러분의 반응 - 아마도 한 조각을 집어들이는 것일 텐데 -는 그 이벤트를 처리하는 방법입니다.

Node.js에서 이벤트는 비슷하게 작동합니다. 이들은 프로그램에서 일어나는 일들로, 이러한 이벤트가 발생할 때 특정 반응(우리는 이를 "리스너"라고 부릅니다)을 설정하여 응답할 수 있습니다.

EventEmitter 클래스

Node.js 이벤트의 핵심은 EventEmitter 클래스입니다. 이를 파티의 주인으로 생각해보세요. 그는 발표를 외치며(이벤트를 발생시키며) 피자(또는 다른 이벤트)에 대해 들을 수 있는 모든 사람에게 메시지를 전달하는 역할을 합니다.

그럼 우리가 자신만의 EventEmitter를 어떻게 만들 수 있는지 보겠습니다:

const EventEmitter = require('events');

// 새로운 EventEmitter 객체 생성
const myEmitter = new EventEmitter();

이 코드에서는 먼저 events 모듈을 임포트하여 EventEmitter 클래스에 접근할 수 있게 합니다. 그런 다음, myEmitter라는 이름의 새로운 EventEmitter 인스턴스를 생성합니다. 이제 myEmitter 객체는 이벤트를 발생시키고 이를 듣을 수 있습니다.

이벤트 발생 및 처리

이제 우리의 EventEmitter를 사용해보겠습니다. 가장 중요한 두 가지 메서드인 on()emit()를 시작으로 배우겠습니다.

on() 메서드

on() 메서드는 특정 이벤트에 리스너 함수를 연결합니다. 친구들에게 "피자가 도착하면 알려줘!"라고 말하는 것과 같습니다.

다음과 같이 사용합니다:

myEmitter.on('pizzaArrived', () => {
console.log('와우! 피자가 왔어!');
});

이 예제에서 우리는 myEmitter에게 'pizzaArrived' 이벤트를 듣도록 지정했습니다. 이 이벤트가 발생하면 제공된 함수가 실행되어 콘솔에 메시지를 출력합니다.

emit() 메서드

emit() 메서드는 이벤트를 트리거합니다. 파티에서 "피자가 왔어!"라고 외치는 것과 같습니다.

다음과 같이 작동합니다:

myEmitter.emit('pizzaArrived');

이 줄이 실행되면 'pizzaArrived' 이벤트가 트리거되며, 이 이벤트에 연결된 모든 리스너가 자신의 함수를 실행합니다.

다음과 같이 모두 합치면 됩니다:

const EventEmitter = require('events');
const myEmitter = new EventEmitter();

myEmitter.on('pizzaArrived', () => {
console.log('와우! 피자가 왔어!');
});

myEmitter.emit('pizzaArrived');
// 출력: 와우! 피자가 왔어!

이 코드를 실행하면 콘솔에 메시지가 출력됩니다. 축하드립니다! 여러분은 첫 번째 Node.js 이벤트를 생성하고 처리했습니다!

이벤트에 인자 전달

때로는 이벤트와 함께 추가 정보를 전달하고 싶을 수 있습니다. 예를 들어, 도착한 피자의 종류를 지정하고 싶을 수 있습니다. 이를 위해 emit() 메서드에 인자를 전달할 수 있습니다:

const EventEmitter = require('events');
const myEmitter = new EventEmitter();

myEmitter.on('pizzaArrived', (type) => {
console.log(`와우! ${type} 피자가 왔어!`);
});

myEmitter.emit('pizzaArrived', '피망');
// 출력: 와우! 피망 피자가 왔어!

이 예제에서 우리는 'pepperoni'를 인자로 전달하여 이벤트를 발생시킵니다. 리스너 함수는 이 인자를 사용할 수 있습니다.

여러 리스너

동일한 이벤트에 여러 리스너를 연결할 수 있습니다. 예를 들어, 파티에 다른 사람들이 피자 도착에 대해 다르게 반응하고 싶을 수 있습니다:

const EventEmitter = require('events');
const myEmitter = new EventEmitter();

myEmitter.on('pizzaArrived', () => {
console.log('사람 1: 접시를 가져올게!');
});

myEmitter.on('pizzaArrived', () => {
console.log('사람 2: 음료를 따를게!');
});

myEmitter.on('pizzaArrived', () => {
console.log('사람 3: 음악을 틀어줄게!');
});

myEmitter.emit('pizzaArrived');
// 출력:
// 사람 1: 접시를 가져올게!
// 사람 2: 음료를 따를게!
// 사람 3: 음악을 틀어줄게!

이 코드를 실행하면 콘솔에 모든 반응이 출력됩니다. 리스너는 등록된 순서대로 호출됩니다.

일회성 리스너

때로는 이벤트를 한 번만 듣고 싶을 수 있습니다. 이를 위해 once() 메서드를 사용할 수 있습니다. "첫 번째 피자가 도착하면 알려줘, 그 이후에는 필요없어"라고 말하는 것과 같습니다:

const EventEmitter = require('events');
const myEmitter = new EventEmitter();

myEmitter.once('pizzaArrived', () => {
console.log('첫 번째 피자가 도착했어!');
});

myEmitter.emit('pizzaArrived');
// 출력: 첫 번째 피자가 도착했어!

myEmitter.emit('pizzaArrived');
// 출력: (아무 것도 출력되지 않음)

이 예제에서 두 번째 emit()는 아무런 출력을 하지 않습니다. 리스너는 한 번 실행되고 제거됩니다.

오류 이벤트

Node.js에서는 'error'라는 특별한 이벤트가 있습니다. 만약 오류 이벤트가 발생하고 그에 대한 리스너가 없다면, Node.js는 스택 트레이스를 출력하고 프로그램을 종료합니다. 오류 리스너를 설정하는 것은 항상 좋은 관행입니다:

const EventEmitter = require('events');
const myEmitter = new EventEmitter();

myEmitter.on('error', (err) => {
console.error('오우! 무언가 잘못됐어:', err);
});

myEmitter.emit('error', new Error('피자 오븐이 고장났어!'));
// 출력: 오우! 무언가 잘못됐어: Error: 피자 오븐이 고장났어!

리스너 제거

이제 더이상 이벤트를 듣고 싶지 않다면, 리스너를 제거할 수 있습니다. removeListener() 메서드를 사용합니다:

const EventEmitter = require('events');
const myEmitter = new EventEmitter();

function pizzaHandler() {
console.log('피자 시간이야!');
}

myEmitter.on('pizzaArrived', pizzaHandler);

myEmitter.emit('pizzaArrived');
// 출력: 피자 시간이야!

myEmitter.removeListener('pizzaArrived', pizzaHandler);

myEmitter.emit('pizzaArrived');
// 출력: (아무 것도 출력되지 않음)

EventEmitter 메서드 요약

이제 우리가 다루었던 주요 메서드를 요약한 표를 제공하겠습니다:

메서드 설명
on(eventName, listener) 지정된 이벤트에 리스너 함수 추가
emit(eventName[, ...args]) 지정된 이벤트를 트리거, 선택적으로 인자 포함
once(eventName, listener) 지정된 이벤트에 일회성 리스너 추가
removeListener(eventName, listener) 지정된 이벤트에서 특정 리스너 제거
removeAllListeners([eventName]) 모든 리스너를 제거하거나, 지정된 이벤트의 리스너를 제거

이제 여러분은 Node.js 이벤트의 세계에 첫 걸음을 뗐습니다. 연습이 완벽을 이루는 것이니, 이 개념들을 실험해보세요. 간단한 게임이나 채팅 애플리케이션을 만들어보세요.

Node.js를 계속 탐구하면서, 이벤트는 반응성 있고 이벤트 주도적인 애플리케이션을 만드는 강력한 도구로 사용됩니다. 많은 Node.js 애플리케이션과 라이브러리에서 널리 사용되므로, 이를 잘 이해하면 미래의 프로젝트에 큰 도움이 될 것입니다.

계속 코딩하고, 학습하고, 특히 친구들과 함께 즐기세요! 기억하세요, 코딩이든 피자이든, 친구들과 함께할 때 더 나은 것입니다. 행복한 Node.js를 되세요!

Credits: Image by storyset