이벤트 기반 패턴(Event-Driven Pattern)은 시스템 내에서 발생하는 이벤트를 중심으로 컴포넌트들이 독립적으로 상호작용할 수 있게 하는 아키텍처 패턴이다.
이벤트-버스(Event-Bus)는 이러한 이벤트가 발생했을 때 전달될 수 있도록 이벤트를 전파하는 매개체 역할을 수행한다.
이벤트 기반 패턴은 비동기적인 상호작용이 필요한 시스템에서 주로 사용되며, 컴포넌트 간의 결합도를 낮춰 독립적인 동작이 가능하도록 해준다.
이벤트 기반 패턴은 채팅 애플리케이션, 주문 처리 시스템, IoT 시스템 등 다양한 분야에서 활용된다.
주문 처리 시스템에서 주문이 들어오면 이벤트가 발생하고, 해당 이벤트를 감지한 다른 서비스가 이를 처리한다.
[Event Emitter] ----> [Event Bus] ----> [Event Listener]
주문 처리 시스템에서 OrderPlacedEvent
가 발생하면 이를 감지한 리스너가 주문을 확인하고, 처리를 시작하는 시나리오를 Java로 구현할 수 있다.
// Event 클래스: 발생한 이벤트를 나타내는 클래스
public class Event {
private String message;
public Event(String message) {
this.message = message;
}
public String getMessage() {
return message;
}
}
// EventListener 인터페이스: 특정 이벤트가 발생했을 때 수행할 작업을 정의
public interface EventListener {
void onEvent(Event event);
}
// EventBus 클래스: 이벤트를 리스너에게 전달하는 중개자 역할을 하는 클래스
import java.util.ArrayList;
import java.util.List;
public class EventBus {
private List<EventListener> listeners = new ArrayList<>();
public void register(EventListener listener) {
listeners.add(listener);
}
public void publish(Event event) {
for (EventListener listener : listeners) {
listener.onEvent(event);
}
}
}
// OrderService 클래스: 이벤트 발행자 역할을 하는 주문 처리 서비스 클래스
public class OrderService {
private EventBus eventBus;
public OrderService(EventBus eventBus) {
this.eventBus = eventBus;
}
public void placeOrder(String orderDetails) {
System.out.println("주문이 접수되었습니다: " + orderDetails);
Event orderEvent = new Event("OrderPlacedEvent: " + orderDetails);
eventBus.publish(orderEvent); // 이벤트 버스를 통해 이벤트 발행
}
}
// NotificationService 클래스: 주문이 접수되면 알림을 보내는 리스너 클래스
public class NotificationService implements EventListener {
@Override
public void onEvent(Event event) {
System.out.println("알림: " + event.getMessage() + "에 대한 처리 시작");
}
}
// Main 클래스: 주문을 처리하고 알림을 전송하는 시스템 시연
public class Main {
public static void main(String[] args) {
EventBus eventBus = new EventBus();
// 리스너 등록
NotificationService notificationService = new NotificationService();
eventBus.register(notificationService);
// 이벤트 발행
OrderService orderService = new OrderService(eventBus);
orderService.placeOrder("상품 A, 수량 2");
}
}
주문이 접수되었습니다: 상품 A, 수량 2
알림: OrderPlacedEvent: 상품 A, 수량 2에 대한 처리 시작
이벤트 기반 패턴은 모듈 간 결합도를 줄이고 독립적으로 상호작용을 가능하게 하며 비동기 처리가 필요한 시스템에서 유용하다.
특히 실시간 데이터 처리와 비동기적 메시징 시스템에서 자주 활용된다.
아래 글에서 다른 아키텍쳐 패턴들을 확인할 수 있다.
아키텍처 패턴 모음