5초마다 현재 시간을 출력하는 애플리케이션 만들기
@Scheduled
활용.
비동기 테스트 코드 형성에 도움이 되는 라이브러리...라기보단 본인들 말에 따르면 Domain specific Language (비동기성이라는 특정 도메인 영역에 특화된 언어)의 일종이라고 함.
이 프로젝트에서 넣으라고 했는데... 문제는 필요가 없다... 참고.
@Scheduled
주기적으로 돌아가야 하는 작업을 설정할 때 사용하는 annotation.
여러 option이 있으나, 여기서는 fixedRate
를 사용했다. method 호출 이후 몇 ms 뒤에 다시 호출하는지를 지정. 여기서는 5초로 지정을 했다 (5000ms)
@Component
Bean으로 등록하는데 사용되는 annotation. 이 annotation을 기반으로 IoC container이 무슨 bean을 만들지를 찾는게 가능해진다.
여기서는 logging을 담당하는 ScheduledTask
라는 녀석에 대해 bean을 만들 필요가 있다는 것을 지정.
해당 class는 logging을 담당할 객체를 private field로 가져가지고 logging을 한다. 5초마다 호출되는 method를 통해 5초마다 logging을 함.
@SpringBootApplication
@Configuration
(정확히는 @SpringBootConfiguration
인데 @Configuration
이랑 동일. 단 계층 관계를 통해 단 하나만 존재하는게 가능하다는게 유일한 차이점), @EnableAutoConfiguration
, @ComponentScan
을 합한거다.
@Configuration
은 application context에다가 해당 class가 bean 정의를 담당하는 곳이라고 표기를 하는 것이다. 이게 무슨 소리냐면, 해당 class의 method가 return하는 녀석이 Bean일 수 있다는 것이다. 이 경우 @Bean
annotation이 해당 method 위에 붙는다. IoC container은 그런 method에서 return 된 value를 Bean으로 취급하면서 관리해야 한다. 그런데 이와 더불어 좀 특이한 특징이 있는데, 먼저 @Component
를 포함하고 있기에 본인 또한 bean으로 취급되어서 dependency injection 혜택을 받을 수 있다는 것이고, 이름에서 유추 가능하듯이 이 class에서 만든 bean은 application 내 타 bean들의 configuration과 관련된 정보를 담는 bean이 된다. 참고.
@EnableAutoConfiguration
은 해당 class에 대해, 우리가 지정한 dependency를 기반으로 자동으로 configuration을 설정하라는 뜻이다. 정확히 말하자면 classpath 상에 있는 jar파일들, 그리고 우리가 정의한 bean들을 참고해서 알아서 결정한다고 한다.
@ComponentScan
: 해당 package에 있는 다른 class들 중에 @Component
, @Configuration
및 service를 포함하는 annotation들이 존재하는지를 파악할 때 쓰인다. 사실 앞에서 정의한 ScheduledTasks
라는 class는 자동으로 Bean으로 취급되는 것이 아니라 이 @ComponentScan
에 의해 Bean으로 취급이 되는 것이다.
@EnableScheduling
@Scheduled
로 인해 scheduling이 지정된 method들이 실제로 실행이 될려면 무조건 위 annotation을 집어 넣어야 한다.
@Configuration
class에다가 저 annotation을 넣어야 하는데, 앞에 말했듯 @SpringBootApplication
이 여기에 해당되기 때문에 문제가 없다.
여담으로 기본적으로 모든 @Scheduled
method들은 하나의 thread를 공유한다. 왜냐하면 @Scheduled
에서는 TaskScheduler이 명시되지 않으면 ConcurrentTaskScheduler
을 활용하는데, 이 녀석이 thread 하나에서 여러개의 method를 concurrent하게 실행하기 때문. 여러개의 thread를 활용하고 싶으면 ThreadPoolTaskScheduler
을 활용해야 한다.
slf4j
에 있는 class.
로깅을 편하게 하도록 해준다.
https://github.com/baekrang256/Backend-Practice/tree/main/SpringTutorial/Scheduling-Tasks/demo