[java] Spring Framework를 사용한 이벤트 드리븐 아키텍처 구현하기

소개

이벤트 드리븐 아키텍처(Event-driven Architecture)는 비동기적인 방식으로 시스템을 구성하는 아키텍처 패턴입니다. 이 패턴은 시스템의 다양한 컴포넌트들이 이벤트를 발행하고, 이벤트를 구독하여 필요한 작업을 수행하는 방식으로 동작합니다. 이를 통해 시스템의 유연성, 확장성, 탄력성이 향상될 수 있습니다.

Spring Framework는 이벤트 드리븐 아키텍처를 구현하기 위한 다양한 기능과 클래스를 제공합니다. 이번 블로그 포스트에서는 Spring Framework를 사용하여 간단한 이벤트 드리븐 아키텍처를 구현하는 방법에 대해 알아보겠습니다.

Spring의 이벤트 관리 기능

Spring Framework는 ApplicationEventApplicationEventPublisher 인터페이스를 통해 이벤트 관리 기능을 제공합니다. ApplicationEvent는 발생한 이벤트에 대한 정보를 담고 있는 클래스이며, ApplicationEventPublisher는 이벤트를 발행하는 역할을 합니다.

먼저, 이벤트를 발생시킬 클래스를 생성합니다. 이 클래스는 ApplicationEvent를 상속받아 이벤트에 대한 정보를 담고, 발생한 이벤트를 처리할 메서드를 구현합니다.

public class MyEvent extends ApplicationEvent {

    private String message;

    public MyEvent(Object source, String message) {
        super(source);
        this.message = message;
    }

    public String getMessage() {
        return message;
    }
    
    // 이벤트 처리 로직
    public void handleEvent() {
        // 이벤트 처리 작업 수행
        System.out.println("MyEvent 처리: " + message);
    }

}

다음으로, 이벤트를 발행하는 클래스를 생성합니다. 이 클래스는 ApplicationEventPublisher를 주입받아 이벤트를 발행하는 메서드를 구현합니다.

public class EventPublisher {

    private final ApplicationEventPublisher eventPublisher;

    public EventPublisher(ApplicationEventPublisher eventPublisher) {
        this.eventPublisher = eventPublisher;
    }

    public void publishEvent(String message) {
        MyEvent event = new MyEvent(this, message);
        eventPublisher.publishEvent(event);
    }
    
    // 이벤트 발행 로직
    public void publish() {
        // 이벤트 발행 작업 수행
        publishEvent("이벤트 발행");
    }
    
}

마지막으로, 이벤트를 처리하는 클래스를 생성합니다. 이 클래스는 ApplicationListener를 구현하여 이벤트를 구독하고, 이벤트 발생 시 처리할 메서드를 구현합니다.

public class EventSubscriber implements ApplicationListener<MyEvent> {

    @Override
    public void onApplicationEvent(MyEvent event) {
        // 이벤트 처리 작업 수행
        event.handleEvent();
    }
    
    // 이벤트 구독 로직
    public void subscribe() {
        // 이벤트 구독 작업 수행
        System.out.println("이벤트 구독");
    }

}

이제, Spring Framework의 Bean으로 등록된 클래스들을 통해 이벤트를 발행하고, 구독하는 기능을 사용할 수 있습니다.

@Configuration
public class AppConfig {

    @Bean
    public EventPublisher eventPublisher(ApplicationEventPublisher eventPublisher) {
        return new EventPublisher(eventPublisher);
    }

    @Bean
    public EventSubscriber eventSubscriber() {
        return new EventSubscriber();
    }

}
public class Application {

    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);

        EventPublisher eventPublisher = context.getBean(EventPublisher.class);
        EventSubscriber eventSubscriber = context.getBean(EventSubscriber.class);

        eventSubscriber.subscribe();
        eventPublisher.publish();
    }

}

결론

Spring Framework를 사용하여 이벤트 드리븐 아키텍처를 구현하는 방법에 대해 알아보았습니다. Spring의 이벤트 관리 기능을 사용하면 비동기적인 방식으로 시스템을 구성할 수 있으며, 이를 통해 시스템의 유연성과 확장성을 향상시킬 수 있습니다. 이벤트 드리븐 아키텍처를 적용하여 좀 더 효율적인 시스템을 개발해보세요.

참고 자료