Annotation
@EnableScheduling
스프링의 스케쥴링을 위한 어노테이션이다.
기본적으로 스프링에 의헤 생성된 한개의 Thread Pool에서 작동한다.
하나의 스케쥴이 돌고 있으면 그것이 다 끝나야 다음 스케쥴이 실행되기 때문에 설정을 통해 스케쥴에 대한 스레드풀을 생성하고
그 스레드풀을 사용해서 병렬적으로 처리하는게 좋을 수 있다.
- 스프링 스케쥴링에 사용
- 스프링 빈으로 등록해서 사용한다.
- Application Class에 @EnableScheduling 선언
- scheduler를 사용할 class에 @Component 선언, 메서드에 @Scheduled 선언
- 메서드 타입은 void
- 메서드에 매개변수 사용 불가
- 왜 이거쓰는데?
Spring Quartz라는 더 많은 기능을 가진 스케줄러도 존재한다.
하지만 의존성이 추가되어야 하고 사용법이 좀 더 복잡하기 때문에 단순한 스케쥴링 작업에는
별도의 추가적인 의존성이 필요없고 사용법이 간단한Spring Scheduler를 추천한다.
@Value
properties 파일의 설정정보를 key-value형태로 가져오는데 쓰인다.
단일값 주입에 권장되고 있으며 여러개의 값을 주입받아야 할 경우
@ConfigurationProperties 사용을 권장한다.
- 이거 왜쓰는데?
만약 소스코드로 설정정보를 관리한다면 보안에도 좋지않고, 컴파일 된 바이트코드를 JVM에서 실행 후에 의미있는 정보가 되기때문에 서버를 내리지 않고는 변경할 수 없다.
하지만 properties 파일로 관리하면 key-value값만 불러서 치환하기 때문에 소스코드를 수정 할 필요가 없고 서버의 properties파일만 수정하면 되기 때문에 서버를 중단할 필요가 없다.
또한 각 서버환경에 따라 설정도 유연하게 관리할 수 있다.
@Bean
- @Bean
- 스프링에서 IoC 컨테이너가 관리하는 자바 객체
- 기본적으로 싱글톤으로 생성하고 관리한다.
- @Component
- 개발자가 직접 작성한 클래스를 Bean으로 등록할 때 사용한다.
- 선언 시 Component-Scan에 의해 Bean으로 등록 된다.
- @Configuration
- 외부라이브러리 또는 내장 클래스를 Bean으로 등록하고자 할 경우 사용한다.
- 1개 이상의 @Bean을 제공하는 클래스의 경우 반드시 @Configuration를 선언한다.
- 선언 시 Component-Scan에 의해 Bean으로 등록 된다.
@Async
스프링에서 제공하는 Thread Pool을 활용하는 비동기 메서드 지원 어노테이션이다.
간단하게 사용하고 싶다면 Application 클래스에 @EnableAsync를 선언하고 비동기로 작동하고자 하는 메서드에 @Async를 선언해주면 사용할 수 있다.
하지만 이럴 경우 기본설정인 SimpleAsyncTaskExecutor를 사용해서 스레드를 관리하지 않는 등의 문제가 있기 때문에 AsyncConfigurer 인터페이스를 상속받아 구현하는게 좋을 수 있다.
@Configuration
@EnableAsync
public class AsyncConfig implements AsyncConfigurer {
@Override
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(5);
executor.setMaxPoolSize(30);
executor.setQueueCapacity(50);
executor.setThreadNamePrefix("async-pool");
executor.initialize();
return executor;
}
}
- @Configuration : 빈 등록
- @EnableAsync : 메서드에서 비동기 기능을 사용할 수 있게 한다.
- CorePoolSize : 기본 실행 대기하는 Thread의 수
- MaxPoolSize : 동시 동작하는 최대 Thread의 수
- QueueCapacity : MaxPoolSize 초과 요청에서 Thread 생성 요청시, 해당 요청을 Queue에 저장하는데 이때 최대 수용 가능한 Queue의 수, Queue에 저장되어있다가 Thread에 자리가 생기면 하나씩 빠져나가 동작
- ThreadNamePrefix : 생성되는 Thread 접두사 지정
- 그 후 비동기를 원하는 메서드에
@Async어노테이션을 선언해 주면 된다.
- 주의할 점
- private method에 사용 불가
- 자가호출 불가 즉, 이너클래스에서 사용 불가
- QueueCapacity 초과 요청에 대한 비동기 method 호출시 방어 코드 작성
댓글남기기