본문 바로가기
TIL(Today I Learned)

ApplicationRunner interface에 대한 정리

by kkkdh 2023. 6. 8.
728x90

들어가며...

이번 글은 기존에 schema.sql 파일에 저장되어 있는 기본 데이터 import 부분을 ApplicationRunner라는 일종의 spring boot 프로젝트 실행 시점에 실행되는 initializer를 이용해 개발하는 업무를 담당하게 되어, ApplicationRunner라는 것이 도대체 무엇인지를 먼저 파악하기 위해 작성한다.


ApplicationRunner interface는 일종의 initializer

ApplicationRunner는 'org.springframework.boot' package에 포함되며, Spring Boot application이 시작되는 시점에 몇 가지 특정 작업을 수행하기 위해서 사용할 수 있다고 한다.

 

즉, 애플리케이션의 시작 단계에 코드를 실행하기 위한 목적으로 설계되었다.

 

ApplicationRunner interface의 코드를 살펴보자.

ApplicationRunner interface 코드를 확인

코드를 보면 알 수 있듯이, 우선 functional interface이며, run()이라는 하나의 추상 메서드의 정의를 포함하고 있다.


run() method의 역할 정의

method 설명에 "Callback used to run the bean"이라고 작성되어 있다.

 

이 말이 의미하는 바를 명확하게 모르겠어 ChatGPT에 질의 한 결과 다음과 같은 답을 얻을 수 있다.

chatGPT에 물어본 결과

이에 따라 생각했을때, spring framework에 의해 특정 시점에 빈이 실행되는데, 이 시점에 실행할 코드를 개발자가 run() method원하는 방식으로 구현해서 사용하면 되는 것으로 이해할 수 있었다.

 

다시 돌아오면, 결국 ApplicationRunner interface를 구현해서 Spring Application의 시작 시점에 특정 작업을 수행할 수 있고, 구현체에서는 run method를 overriding 해서 원하는 로직을 구현하면 된다.


구현체 구현 예시

따라서 다음과 같이 ApplicationRunner를 구현해서 사용하면 된다.

import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;
 
@Component
public class MyApplicationRunner implements ApplicationRunner {
 
    @Override
    public void run(ApplicationArguments args) throws Exception {
        // Custom logic to be executed after the application starts
        ~~Service.createTestData();
    }
}

@Component 어노테이션을 붙여, 컴포넌트 스캔 대상에 포함시켜야 하며, 이를 통해 스프링 빈으로 등록되어 spring application의 실행 시점에 동작 가능하다.

 

따라서 이번에는 test data를 import하는 custom ApplicationRunner를 별도로 설계할 예정이다.

  • 필요한 bean을 생성자 주입을 통해 주입받아 사용하도록 구현
  • test data로 생성할 대상은 기존 schema.sql에서 insert query를 통해 입력되는 데이터
  • 별도로 통계 데이터를 위한 test data는 스키마 개발 시점 이후에 추가되어야 할 것으로 예상

추가 정보

spring boot 구동 시점에 특정 코드를 실행시키기 위한 두 가지 방법 중 하나이다.

(나머지 하나는 CommandLineRunner)

 

이번 케이스의 경우 test data를 추가하는 작업만 애플리케이션 구동 시점 이전에 실행하면 되기 때문에, 둘 중 어느것을 사용하던 무관한 것으로 판단.

(CommandLineRunner는 자바 문자열에 접근하는 방식, ApplicationRunner는 ApplicationArguments라는 객체를 이용해서 입력에 접근한다.)

 

여러 개의 ApplicationRunner 빈을 등록할 수 있고, 각각의 실행 순서를 @Order annotation을 이용해서 명시해 줄 수 있다. (실행 순서가 문제되는 경우에 유연하게 대처 가능하게 만들어준다.)

728x90

댓글