Node.js는 이벤트 중심 아키텍처를 사용하여 비동기 I/O를 처리하는 데 탁월합니다. 이 시스템의 중심에는 이벤트 중심 애플리케이션을 구축하는 데 필수적인 EventEmitter 클래스가 있습니다. 이 기사에서는 Node.js의 EventEmitter, 작동 방식, 실제 애플리케이션에서 효과적으로 사용하는 방법을 살펴보겠습니다. 또한 이벤트 중심 프로그래밍의 장점을 보여주는 이벤트 처리, 사용자 정의 이벤트, 모범 사례 및 사용 사례도 다룰 것입니다.
EventEmitter는 이벤트 방출 및 처리를 용이하게 하는 Node.js의 핵심 클래스입니다. 이를 통해 이벤트를 생성하고 수신할 수 있으므로 비동기 작업을 더 쉽게 관리하고 유지 관리가 가능한 모듈식 애플리케이션을 구축할 수 있습니다.
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 객체는 단일 이벤트에 대해 최대 10개의 이벤트 리스너를 가질 수 있습니다. 이 한도를 초과하면 경고를 받게 됩니다. setMaxListeners() 메소드를 사용하여 이 제한을 조정할 수 있습니다.
예:
eventEmitter.setMaxListeners(15);
이를 통해 EventEmitter는 경고를 발행하지 않고 각 이벤트에 대해 최대 15개의 이벤트 리스너를 처리할 수 있습니다.
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.
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!