스프링 부트 구동 시점에 특정 코드 실행 시키기 (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 파일로 패키징된 애플리케이션을 실행시킬 때 abc
와 123
을 인자로 넘깁니다.
$ 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 파일로 패키징된 애플리케이션을 실행시킬 때 abc
와 123
을 인자로 넘깁니다.
$ 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 { ...
이상으로 CommandLineRunner
와 ApplicationRunner
인터페이스 사용 방법에 대해서 알아보았습니다.