Web/Spring 2019. 2. 21. 22:14

Springboot - CommandLineRunner(커맨드라인러너)



Springboot에서 서버 구동 시점에 초기화작업으로 무엇인가를 넣고 싶다면 사용할 수 있는 방법 중 하나가 

CommandLineRunner인터페이스를 상속받는 것이다.


@SpringBootApplication 어노테이션이 붙어있는 부트구동 클래스에 CommandLineRunner를 implements

하고 run(String... strings)를 Override한다.

그리고 해당 run()에 애플리케이션의 초기작업(빈등록 과정 등등)이후 실행할 로직을 작성해주면 된다.




예제 코드는 항공편 예약서비스 예제인데, 애플리케이션 구동 시점에 예약가능한

비행편을 알아보기위하여 검색 마이크로서비스 애플리케이션에 초기데이터를 

삽입하는 코드이다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
@SpringBootApplication
public class Application implements CommandLineRunner {
    private static final Logger logger = LoggerFactory.getLogger(Application.class);
    
    @Autowired
    private FlightRepository flightRepository;
    
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
    @Override
    public void run(String... strings) throws Exception {
        List<Flight> flights = new ArrayList<>();
        flights.add(new Flight("BF100""SEA","SFO","22-JAN-18",new Fares("100""USD"),new Inventory(100)));
        flights.add(new Flight("BF101""NYC","SFO","22-JAN-18",new Fares("101""USD"),new Inventory(100)));
        flights.add(new Flight("BF105""NYC","SFO","22-JAN-18",new Fares("105""USD"),new Inventory(100)));
        flights.add(new Flight("BF106""NYC","SFO","22-JAN-18",new Fares("106""USD"),new Inventory(100)));
        flights.add(new Flight("BF102""CHI","SFO","22-JAN-18",new Fares("102""USD"),new Inventory(100)));
        flights.add(new Flight("BF103""HOU","SFO","22-JAN-18",new Fares("103""USD"),new Inventory(100)));
        flights.add(new Flight("BF104""LAX","SFO","22-JAN-18",new Fares("104""USD"),new Inventory(100)));
        
        flightRepository.saveAll(flights);
        
        logger.info("Looking to load flights...");
        for (Flight flight : flightRepository.findByOriginAndDestinationAndFlightDate("NYC""SFO""22-JAN-18")) {
            logger.info(flight.toString());
        }
    }
     
}
cs


만약 애플리케이션 구동 순서에 선후가 존재한다면 후행 애플리케이션에 위와같이 run()을 오버라이드하여

선행 애플리케이션에 Health Check등을 하는 로직을 넣어도 괜찮은 방법이 될 것 같다.

posted by 여성게
: