본문 바로가기

프로그래밍/Spring

[스프링부트] 이벤트 발행 및 구독

이 글은 오늘 배운 내용을 정리하는 블로그 글 입니다. 


오늘은 스프링에서 간단하게 이벤트를 발행하고 구독하는 방법에 대해서 알아보겠습니다.

간단하게 시나리오는 아래와 같습니다. 

 

"글 작성이 완료되면 '작성완료' 라는 이벤트를 발행한다"

 

 

이벤트 클래스 만들기

 

우선 이벤트를 만들어야 합니다. 이벤트는 별도의 스프링 프레임워크를 사용하지 않고, POJO 클래스로 구현하면 됩니다. 

 

클래스명과 변수는 아래와 같이 하겠습니다. 

- 클래스 명: WriteCompletedEvent

- 변수 명

      - Object source: 소스 정보

      - int writingNumber: 글 번호 (임의로 넣어본 값이며, 여기에 관리하실 값들을 넣어주시면 됩니다)

 

소스 코드는 아래와 같습니다.

 

public class WriteCompletedEvent {

    private Object source;

    private int writingNumber;

    public WriteCompletedEvent(Object source, int writingNumber) {
        this.source = source;
        this.writingNumber = writingNumber;
    }

    public Object getSource() {
        return source;
    }

    public int getWritingNumber() {
        return writingNumber;
    }
}

 

이벤트 발행 클래스 만들기

 

이벤트를 만들었으면 이제 발행하는 코드를 만들어보겠습니다. 

여기서는 'ApplicationRunner'를 이용해서 프로그램이 실행될 때. 이벤트를 발행하도록 해 보겠습니다. 

 

AppRunner 클래스를 먼저 만들어줍니다. 

 

@Component
public class AppRunner implements ApplicationRunner {

    @Override
    public void run(ApplicationArguments args) throws Exception {

    }
}

 

이제 이 코드에 이벤트를 발행하는 부분을 넣어야 합니다. 

 

이벤트 발행은 'ApplicationEventPublisher' 인터페이스에 있는 'publishEvent()' 메서드를 이용해서 할 수 있습니다. 

'ApplicationEventPublisher'가 인터페이스이기 때문에 사용하기 위해서는 구현체가 필요한데, 'ApplicationContext' 인터페이스가  상속받고 있기 때문에 이를 활용할 수 있습니다. 

 

public interface ApplicationContext extends EnvironmentCapable, 
            ListableBeanFactory, 
            HierarchicalBeanFactory,
            MessageSource, 
            ApplicationEventPublisher, 
            ResourcePatternResolver {

 

'ApplicationContext'의 경우는 빈에 등록이 되어 있기 때문에 'Autowired' 애노테이션을 이용해서 바로 의존성 주입을 받을 수 있습니다. 

 

완성된 'AppRunner' 클래스는 아래와 같습니다. 

 

@Component
public class AppRunner implements ApplicationRunner {

    @Autowired
    ApplicationEventPublisher publisher;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        System.out.println("이벤트 발행");
        publisher.publishEvent(new WriteCompletedEvent(this, 1));
    }
}

 

이벤트 구독 기능 추가하기

 

발행된 이벤트를 구독하는 코드를 작성해보겠습니다. 

 

'WriteCompletedEventHandler' 이름으로 클래스를 만들고, 그 안에 이벤트를 구독했을 때 동작할 함수를 추가합니다. 

중요한 것은 해당 함수 위에 '@EventListener' 라는 애노테이션을 추가해줘야 합니다. 

 

코드는 아래와 같습니다. 

 

@Component
public class WriteCompletedEventHandler {

    @EventListener
    public void handle(WriteCompletedEvent event) {
        System.out.println("이벤트 구독");
        System.out.println("글 번호: " + event.getWritingNumber());
    }
}

 

실행 및 검증

 

마지막으로 코드를 실행해보면 아래와 같이 이벤트가 발행되고 구독되는 것을 확인할 수 있습니다. 

 

이벤트 발행
이벤트 구독
글 번호: 1