가이드 원본 사이트

만들려고 하는거

  • 5초마다 현재 시간을 출력하는 애플리케이션 만들기

  • @Scheduled 활용.

awaitility

  • 비동기 테스트 코드 형성에 도움이 되는 라이브러리...라기보단 본인들 말에 따르면 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들을 참고해서 알아서 결정한다고 한다.

    • dependency에 넣은 starter들도 이 jar파일들로 만들어지기 때문에 dependency에 뭘 넣었냐에 따라 자동으로 필요한 configuration을 설정하는 것이라고도 생각이 가능하다.
    • 그리고 프로그래머가 따로 만든 configuration이 있으면 그걸 우선 적용하며, 몇몇 자동 configuration을 수동으로 제거하는 것도 가능하다.
    • 뭣보다 자동 configuration의 시작 기준이 되는 패키지가 이 annotation이 있는 class의 패키지이기 때문에 항상 root package에 이를 배치해가지고 subpackage들도 configuration에 접근이 가능하도록 설정해야 한다는 점 유의
    • 자세한건 이 글을 참고하면 좋다.
  • @ComponentScan : 해당 package에 있는 다른 class들 중에 @Component, @Configuration 및 service를 포함하는 annotation들이 존재하는지를 파악할 때 쓰인다. 사실 앞에서 정의한 ScheduledTasks라는 class는 자동으로 Bean으로 취급되는 것이 아니라 이 @ComponentScan에 의해 Bean으로 취급이 되는 것이다.

  • @Component, @Bean, @ComponentScan에 관한 좋은 글

@EnableScheduling

  • @Scheduled로 인해 scheduling이 지정된 method들이 실제로 실행이 될려면 무조건 위 annotation을 집어 넣어야 한다.

  • 관련 doc

  • @Configuration class에다가 저 annotation을 넣어야 하는데, 앞에 말했듯 @SpringBootApplication이 여기에 해당되기 때문에 문제가 없다.

  • 여담으로 기본적으로 모든 @Scheduled method들은 하나의 thread를 공유한다. 왜냐하면 @Scheduled에서는 TaskScheduler이 명시되지 않으면 ConcurrentTaskScheduler을 활용하는데, 이 녀석이 thread 하나에서 여러개의 method를 concurrent하게 실행하기 때문. 여러개의 thread를 활용하고 싶으면 ThreadPoolTaskScheduler을 활용해야 한다.

LoggerFactory

  • slf4j에 있는 class.

  • 로깅을 편하게 하도록 해준다.

  • 관련 doc

결과물

https://github.com/baekrang256/Backend-Practice/tree/main/SpringTutorial/Scheduling-Tasks/demo

profile
안 흔하고 싶은 개발자. 관심 분야 : 임베디드/컴퓨터 시스템 및 아키텍처/웹/AI

0개의 댓글