>  기사  >  웹 프론트엔드  >  Node.js의 EventEmitter를 사용한 이벤트 중심 프로그래밍 마스터하기

Node.js의 EventEmitter를 사용한 이벤트 중심 프로그래밍 마스터하기

王林
王林원래의
2024-09-11 06:32:391026검색

Mastering Event-Driven Programming with the EventEmitter in Node.js

Node.js는 이벤트 중심 아키텍처를 사용하여 비동기 I/O를 처리하는 데 탁월합니다. 이 시스템의 중심에는 이벤트 중심 애플리케이션을 구축하는 데 필수적인 EventEmitter 클래스가 있습니다. 이 기사에서는 Node.js의 EventEmitter, 작동 방식, 실제 애플리케이션에서 효과적으로 사용하는 방법을 살펴보겠습니다. 또한 이벤트 중심 프로그래밍의 장점을 보여주는 이벤트 처리, 사용자 정의 이벤트, 모범 사례 및 사용 사례도 다룰 것입니다.

Node.js의 EventEmitter란 무엇입니까?

EventEmitter는 이벤트 방출 및 처리를 용이하게 하는 Node.js의 핵심 클래스입니다. 이를 통해 이벤트를 생성하고 수신할 수 있으므로 비동기 작업을 더 쉽게 관리하고 유지 관리가 가능한 모듈식 애플리케이션을 구축할 수 있습니다.

EventEmitter의 기본 사용법

EventEmitter 클래스는 Node.js 이벤트 모듈의 일부이므로 사용하기 전에 가져와야 합니다.

예:

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

이제 EventEmitter 객체가 있으므로 이벤트를 내보내고 수신하는 방법을 정의해 보겠습니다.

이벤트 내보내기 및 듣기

emit() 메서드를 사용하여 이벤트를 내보내고 on() 또는 addListener() 메서드를 사용하여 이벤트를 수신할 수 있습니다.

예:

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

// Create an event listener
eventEmitter.on('greet', (name) => {
  console.log(`Hello, ${name}!`);
});

// Emit an event
eventEmitter.emit('greet', 'Aadyaa');

출력:

Hello, Aadyaa!

이 예에서는 Greeting이라는 맞춤 이벤트를 정의합니다. 이벤트가 발생하면 'Aadyaa' 인수를 이벤트 리스너에 전달하여 인사말을 기록합니다.

여러 이벤트 작업

동일한 EventEmitter 객체에서 여러 이벤트를 내보내고 별도의 이벤트 리스너를 사용하여 처리할 수 있습니다.

예:

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

// Event listeners
eventEmitter.on('start', () => {
  console.log('Starting...');
});

eventEmitter.on('stop', () => {
  console.log('Stopping...');
});

// Emit events
eventEmitter.emit('start');
eventEmitter.emit('stop');

출력:

Starting...
Stopping...

이 예에서는 여러 이벤트를 독립적으로 처리하여 애플리케이션의 다양한 작업을 더 효과적으로 제어하는 ​​방법을 보여줍니다.

비동기 이벤트 처리

이벤트 리스너도 비동기식일 수 있습니다. Node.js를 사용하면 이벤트 리스너 내부에 비동기 함수를 정의할 수 있으며 이는 비차단 작업에 유용할 수 있습니다.

예:

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

// Async event listener
eventEmitter.on('fetchData', async () => {
  const data = await new Promise((resolve) => {
    setTimeout(() => resolve('Data fetched!'), 2000);
  });
  console.log(data);
});

// Emit the event
eventEmitter.emit('fetchData');

출력(2초 후):

Data fetched!

이 예에서는 setTimeout을 사용하여 비동기 작업을 시뮬레이션하는 fetchData에 대한 이벤트 리스너를 정의합니다. 리스너는 가져온 데이터를 기록하기 전에 약속이 해결될 때까지 기다립니다.

이벤트 리스너 제거

경우에 따라 목적을 달성한 후 이벤트 리스너를 제거해야 할 수도 있습니다. RemoveListener() 또는 off() 메서드를 사용하여 특정 리스너를 제거하거나, RemoveAllListeners()를 사용하여 특정 이벤트에 대한 모든 리스너를 제거할 수 있습니다.

예:

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

const greetListener = (name) => {
  console.log(`Hello, ${name}!`);
};

// Add and remove an event listener
eventEmitter.on('greet', greetListener);
eventEmitter.emit('greet', 'Aadyaa');

eventEmitter.removeListener('greet', greetListener);
eventEmitter.emit('greet', 'Aadyaa');  // No output

출력:

Hello, Aadyaa!

이 경우 리스너는 한 번 호출된 후 제거되므로 후속 이벤트 방출에는 아무런 영향이 없습니다.

EventEmitter 동작 사용자 정의

기본적으로 EventEmitter 객체는 단일 이벤트에 대해 최대 10개의 이벤트 리스너를 가질 수 있습니다. 이 한도를 초과하면 경고를 받게 됩니다. setMaxListeners() 메소드를 사용하여 이 제한을 조정할 수 있습니다.

예:

eventEmitter.setMaxListeners(15);

이를 통해 EventEmitter는 경고를 발행하지 않고 각 이벤트에 대해 최대 15개의 이벤트 리스너를 처리할 수 있습니다.

EventEmitter 모범 사례

  • 설명이 포함된 이벤트 이름 사용: userLoggedIn, dataFetched 또는 errorOccurred와 같이 작업이나 상태를 설명하는 이벤트 이름을 선택합니다. 이렇게 하면 코드를 더 읽기 쉽고 유지 관리하기가 더 쉬워집니다.
  • 이벤트 리스너 수 제한: 리스너를 너무 많이 추가하면 성능 문제가 발생할 수 있으므로 주의하세요. 더 이상 필요하지 않은 청취자를 제거하는 것은 좋은 습관입니다.
  • 오류 처리: 항상 이벤트 리스너 내에서 오류를 처리합니다. 오류가 발생했지만 처리되지 않으면 애플리케이션이 중단될 수 있습니다. 오류 이벤트를 사용하여 전역적으로 오류를 포착합니다. :
  eventEmitter.on('error', (err) => {
    console.error('Error:', err.message);
  });

  eventEmitter.emit('error', new Error('Something went wrong!'));
  • 메모리 누수: 루프 내부에 또는 코드 실행 경로에 반복적으로 이벤트 리스너를 추가할 때는 주의하세요. 제대로 관리하지 않으면 메모리 누수가 발생할 수 있습니다.

실제 사용 사례: 채팅 애플리케이션을 위한 이벤트 기반 아키텍처

이벤트 중심 프로그래밍은 여러 이벤트(예: 메시지 수신 및 전송)를 비동기식으로 처리해야 하는 채팅 애플리케이션에서 일반적으로 사용됩니다. EventEmitter를 사용하여 간단한 채팅 애플리케이션을 구현해 보겠습니다.

예:

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

let users = {};

// Register a new user
eventEmitter.on('userJoined', (username) => {
  users[username] = [];
  console.log(`${username} has joined the chat!`);
});

// Send a message
eventEmitter.on('sendMessage', (username, message) => {
  if (users[username]) {
    users[username].push(message);
    console.log(`${username} sent: ${message}`);
  }
});

// User leaves the chat
eventEmitter.on('userLeft', (username) => {
  if (users[username]) {
    delete users[username];
    console.log(`${username} has left the chat.`);
  }
});

// Simulating chat activity
eventEmitter.emit('userJoined', 'Aadyaa');
eventEmitter.emit('sendMessage', 'Aadyaa', 'Hello, everyone!');
eventEmitter.emit('userLeft', 'Aadyaa');

출력:

Aadyaa has joined the chat!
Aadyaa sent: Hello, everyone!
Aadyaa has left the chat.

In this basic chat application, we use events to manage user interactions, such as joining the chat, sending messages, and leaving the chat.

Conclusion

Event-driven programming is a powerful paradigm that allows you to build scalable and efficient applications. By mastering the EventEmitter in Node.js, you can handle asynchronous events with ease, ensuring that your application remains responsive and modular. Whether you're building a chat application, handling real-time notifications, or managing file streams, the EventEmitter class provides the tools to create event-driven solutions.

In this article, we covered the basics of EventEmitter, working with multiple events, handling asynchronous events, removing listeners, and common best practices. Understanding and applying these concepts will significantly enhance your ability to write effective event-driven Node.js applications.

위 내용은 Node.js의 EventEmitter를 사용한 이벤트 중심 프로그래밍 마스터하기의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.