CommandLineRunner란 Spring에서 지원하는 인터페이스로, Application Context 생성이 종료된 후에 해당 메소드가 자동으로 호출된다.
주로 초기화와 같이 테스트용으로 간단한 작업을 할때 사용된다.
Spring Bean에 등록해야지 작동한다.
참고로 String... args
와 같은 매개변수를 갖는데, Application을 실행시킬 때 넣어준 인자들이 들어가게 된다.
우선 CommandLineRunner를 Implements 해야 사용할 수 있다.
@RequiredArgsConstructor
@Component
public class InitMovies implements CommandLineRunner {
@Override
public void run(String... args) {
}
}
위와같이 간단한 기본 세팅을 해준다.
그리고 난 후에 Movie Document를 조작하기 위해서 MovieRepository를 주입받을 수 있도록 한다.
@RequiredArgsConstructor
@Component
public class InitMovies implements CommandLineRunner {
private final MovieRepository movieRepository;
@Override
public void run(String... args) {
}
}
그리고 만약 EmbeddedMongoDB를 사용하고 있다면 알아서 매 실행마다 초기화되기 때문에 필요 없지만 docker 등으로 직접 돌리고 있을 경우를 대비해서 Movie Document를 따로 초기화 한다.
그리고 초기값을 넣어준다.
@RequiredArgsConstructor
@Component
public class InitMovies implements CommandLineRunner {
private final MovieRepository movieRepository;
@Override
public void run(String... args) {
movieRepository.deleteAll()
.thenMany(Flux.just("movie1", "movie2", "movie3", "movie4", "movie5")
.map(title -> Movie.builder().title(title).build())
.flatMap(movieRepository::save)
).subscribe(null, null, () ->
movieRepository.findAll().subscribe(System.out::println));
}
}
위와 같이 Flux에 Movie의 제목을 위한 String들을 주고, title을 기반으로 Movie를 build하고, 각각의 movie들을 save해 준다.
그 후에는 .subscribe(null, null, () -> movieRepository.findAll().subscribe(System.out::println));
가 눈에 띄는데, subscribe()
의 매개변수에는 여러가지가 있는데,
그 중 매 data마다 실행할 코드
, 에러 발생 시 실행할 코드
는 무시하고 완료 시 실행할 코드
에 각각의 요소 출력을 넣어준 것이다.