[Day 26 | Spring] SpringApplication 이벤트 리스너

y♡ding·2024년 11월 18일

데브코스 TIL - Spring

목록 보기
9/46

SpringApplication :: Spring Boot

스프링 부트의 SpringApplication 이벤트 리스너는 애플리케이션의 시작과 종료 시점에서 발생하는 이벤트들을 처리할 수 있도록 지원하는 기능입니다. 애플리케이션의 특정 단계에서 이벤트 리스너를 사용하면, 환경 설정 로드, 애플리케이션 초기화, 에러 처리 등 다양한 작업을 수행할 수 있습니다.

주요 SpringApplication 이벤트 종류

스프링 부트 애플리케이션의 실행 과정에서 발생하는 주요 이벤트는 다음과 같습니다.

  1. ApplicationStartingEvent:
    • SpringApplication.run()이 호출된 직후에 발생하는 이벤트입니다.
    • 이 이벤트는 리스너 등록 외에 설정이 완료되지 않았기 때문에, 로깅 설정과 같은 초기화 작업에 유용합니다.
  2. ApplicationEnvironmentPreparedEvent:
    • 환경 설정(Environment)이 생성되고 구성된 후 발생하는 이벤트입니다.
    • 이를 통해 프로퍼티 값을 미리 읽어오거나 환경 설정 관련 작업을 수행할 수 있습니다.
  3. ApplicationContextInitializedEvent:
    • ApplicationContext가 초기화된 후 발생하는 이벤트입니다.
    • 빈들이 로드되기 전이기 때문에 초기 컨텍스트 설정 작업에 사용할 수 있습니다.
  4. ApplicationPreparedEvent:
    • ApplicationContext가 초기화된 후, 빈을 로드하기 직전에 발생하는 이벤트입니다.
    • 이 시점까지 기본적인 스프링 설정이 완료되었으며, 추가 설정 작업을 수행할 수 있습니다.
  5. ApplicationStartedEvent:
    • ApplicationContext가 초기화되고, 모든 빈이 생성된 후 발생하는 이벤트입니다.
    • 애플리케이션이 실행될 준비가 완료되었으므로, 필요한 경우 애플리케이션 실행 전 작업을 추가할 수 있습니다.
  6. ApplicationReadyEvent:
    • 애플리케이션이 완전히 실행된 후 발생하는 이벤트입니다.
    • 이 시점에서 애플리케이션이 요청을 처리할 준비가 되었으므로, 초기 데이터 로드나 최종 설정 확인 작업을 수행할 수 있습니다.
  7. ApplicationFailedEvent:
    • 애플리케이션이 시작하는 중에 예외가 발생한 경우 발생하는 이벤트입니다.
    • 애플리케이션 시작 중에 발생하는 예외를 처리할 수 있습니다.

SpringApplication 이벤트 리스너 작성 예제

ApplicationListener 인터페이스를 구현하여 특정 이벤트를 처리하는 예제를 살펴보겠습니다. 예제에서는 애플리케이션 시작 후 ApplicationReadyEvent가 발생할 때 특정 작업을 수행하도록 설정합니다.

import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;

@Component
public class MyApplicationReadyListener implements ApplicationListener<ApplicationReadyEvent> {

    @Override
    public void onApplicationEvent(ApplicationReadyEvent event) {
        System.out.println("애플리케이션이 완전히 시작되었습니다. 초기화 작업을 수행합니다.");
        // 초기화 작업 수행 예시
    }
}
  • ApplicationReadyEvent를 수신하는 리스너로, 애플리케이션이 준비된 후 초기화 작업을 수행합니다.
  • @Component로 등록했기 때문에 스프링 컨텍스트가 로드하면서 자동으로 리스너가 활성화됩니다.

SpringApplication에서 직접 이벤트 리스너 등록하기

SpringApplication 객체를 생성하고 직접 이벤트 리스너를 등록하는 방법도 있습니다.

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.event.ApplicationStartingEvent;
import org.springframework.context.ApplicationListener;

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication app = new SpringApplication(DemoApplication.class);

        // ApplicationStartingEvent 리스너 등록
        app.addListeners(new ApplicationListener<ApplicationStartingEvent>() {
            @Override
            public void onApplicationEvent(ApplicationStartingEvent event) {
                System.out.println("애플리케이션 시작 중...");
            }
        });

        app.run(args);
    }
}
  • 이 예제에서는 *ApplicationStartingEvent에 대해 리스너를 등록하여 애플리케이션이 시작될 때 메시지를 출력합니다.
  • SpringApplication 객체의 addListeners() 메서드를 사용해 리스너를 등록합니다.

여러 이벤트 리스너 사용하기

애플리케이션의 다양한 이벤트 시점에서 작업을 수행하려면 여러 이벤트 리스너를 정의할 수 있습니다. 예를 들어, 애플리케이션 시작과 종료 시점을 구분하여 각각 리스너를 두면 다음과 같이 구성할 수 있습니다.

import org.springframework.boot.context.event.ApplicationStartedEvent;
import org.springframework.boot.context.event.ApplicationFailedEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;

@Component
public class ApplicationStartedListener implements ApplicationListener<ApplicationStartedEvent> {
    @Override
    public void onApplicationEvent(ApplicationStartedEvent event) {
        System.out.println("애플리케이션이 시작되었습니다.");
    }
}

@Component
public class ApplicationFailedListener implements ApplicationListener<ApplicationFailedEvent> {
    @Override
    public void onApplicationEvent(ApplicationFailedEvent event) {
        System.out.println("애플리케이션 시작 중 오류가 발생했습니다: " + event.getException().getMessage());
    }
}

요약

스프링 부트의 SpringApplication 이벤트 리스너는 애플리케이션 실행 과정에서 발생하는 다양한 이벤트에 대해 특정 작업을 수행할 수 있게 도와줍니다. 주요 이벤트를 통해 애플리케이션의 시작과 종료, 예외 상황 등을 제어하고 원하는 작업을 손쉽게 추가할 수 있습니다.


예제 코드

package org.example.boot;

import org.springframework.boot.context.event.ApplicationStartingEvent;
import org.springframework.context.ApplicationListener;

// ApplicationStartingEvent - 프로그램 시작되면
public class CustomListener1 implements ApplicationListener<ApplicationStartingEvent> {
    @Override
    public void onApplicationEvent(ApplicationStartingEvent event) {
        System.out.println("Application starting");
    }
}

//- 
package org.example.boot;

import org.springframework.boot.context.event.ApplicationStartedEvent;
import org.springframework.context.ApplicationListener;

public class CustomListener2 implements ApplicationListener<ApplicationStartedEvent> {
    @Override
    public void onApplicationEvent(ApplicationStartedEvent event) {
        System.out.println("Application started");
    }
}

//- 
package org.example.boot;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.ApplicationPidFileWriter;

@SpringBootApplication
public class Boot02Application {

    public static void main(String[] args) {
        SpringApplication app = new SpringApplication(Boot02Application.class);
        app.addListeners(new CustomListener1(), new CustomListener2()); // 중간에 일어나는 이벤트 감시
        app.run(args);
    }
}

0개의 댓글