Logo

스프링 부트 구동 시점에 특정 코드 실행 시키기 (CommandLineRunner & ApplicationRunner)

스프링 부트 애플리케이션 구동 시점에 특정 코드 실행 시키기기 위해서 2가지 인터페이스를 제공하고 있습니다.

CommandLineRunner

CommandLineRunner 인터페이스는 구동 시점에 실행되는 코드가 자바 문자열 아규먼트 배열에 접근해야할 필요가 있는 경우에 사용합니다. 다음과 같이 CommandLineRunner 인터페이스를 구현한 클래스에 @Component 어노테이션을 선언해두면 컴포넌트 스캔이되고 구동 시점에 run 메소드의 코드가 실행됩니다.

import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

import java.util.Arrays;

@Component
public class DemoCommandLineRunner implements CommandLineRunner {

    @Override
    public void run(String... args) throws Exception {
        System.out.println("CommandLineRunner Args: " + Arrays.toString(args));
    }

}

테스트

jar 파일로 패키징된 애플리케이션을 실행시킬 때 abc123을 인자로 넘깁니다.

$ java -jar target/demo-0.0.1-SNAPSHOT.jar abc 123

DemoCommandLineRunner 클래스의 run() 메소드의 인자로 넘어와서 출력됩니다.

2017-08-27 15:52:12.054  INFO 96622 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http)
CommandLineRunner Args: [abc, 123]

ApplicationRunner

ApplicationRunner 인터페이스도 CommandLineRunner 인터페이스와 마찬가지로 구동 시점에 run() 메소드를 실행시키지만 다른 타입의 인자를 받습니다. 단순 인자의 스트링 배열을 포함한 추상화한 ApplicationArguments 타입의 객체가 대신 run() 메소드의 인자로 넘어옵니다.

import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;

import java.util.Arrays;

@Component
public class DemoApplicationRunner implements ApplicationRunner {

    @Override
    public void run(ApplicationArguments args) throws Exception {
        System.out.println("ApplicationRunner Args: " + Arrays.toString(args.getSourceArgs()));
    }

}

테스트

jar 파일로 패키징된 애플리케이션을 실행시킬 때 abc123을 인자로 넘깁니다.

$ java -jar target/demo-0.0.1-SNAPSHOT.jar abc 123

ApplicationRunner 클래스의 run() 메소드의 인자로 넘어와서 출력됩니다.

2017-08-27 15:54:52.310  INFO 5156 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http)
ApplicationRunner Args: [abc, 123]

실행 순서

하나의 스프링 부트 애플리케이션에 여러 개의 CommandLineRunner 또는 ApplicationRunner 빈을 등록할 수 있습니다. 러너 간의 실행 순서가 문제가 되는 경우에는 러너 클래스에 @Order 어노테이션으로 실행 순서를 명시해주면 됩니다.

@Order(1)
@Component
public class DemoCommandLineRunner implements CommandLineRunner { ...

@Order(2)
@Component
public class DemoApplicationRunner implements ApplicationRunner { ...

이상으로 CommandLineRunnerApplicationRunner 인터페이스 사용 방법에 대해서 알아보았습니다.

참고