반응형
스프링에서 비동기 처리를 위한 async 처리에 대해서 알아보려고 한다.
async 에 대한 내용은 아래 참고 포스팅을 참고 바란다.
자바에서는 기본적인 비동기 처리를 위해 runnable Interface를 구현하여 Thread 클래스를 생성하여 사용한다.
new Thread(new Runnable() { @Override public void run() { // do something } }).start(); |
스프링에서는 비동기 처리를 효율적으로 관리하기 위해 @Async Annotation을 사용한다.
함수나 타입에 해당 어노테이션을 사용하여 비동기 처리를 진행할수 있다.
비동기 처리를 할 경우에는 유의사항이 몇가지 있다.
- 스레드 풀 관리
- 스레드 풀과 관련 설정은 프로퍼티에서 관리를 한다.
- 반환값 handling
- 반환 값이 존재하는 경우 반환값 return 대기와 반환값 처리에 대한 callback 등록으로 해결한다.
- Exception 처리
- Exception handler 등록은 Asynconfig class 의 getAsyncUncaughtExceptionHandler() 을 사용한다.
그럼 사용법에 대해서 다뤄보면
application 클래스에 먼저 적용을 시켜준다.
@EnableAsync @SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } } |
그리고 클래스에서 @Async 어노테이션을 사용해준다.
@Service @RequiredArgsConstructor public class TestService { @Async("sample") public void testAsync(String message){ System.out.println("비동기"); } } |
이렇게 하면 async 적용이 된다.
또 다른 방법으로는 Thread Pool 에서 사용이 가능하다.
위에 application 에서 @EnableAsync 를 지워주고 , AsyncConfig 를 생성해준다.
@Configuration @EnableAsync public class AsyncConfig { private int CORE_POOL_SIZE = 3; private int MAX_POOL_SIZE = 10; private int QUEUE_CAPACITY = 100_000; @Bean(name = "sampleExecutor") public Executor threadPoolTaskExecutor(){ ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor(); taskExecutor.setCorePoolSize(CORE_POOL_SIZE); taskExecutor.setMaxPoolSize(MAX_POOL_SIZE); taskExecutor.setQueueCapacity(QUEUE_CAPACITY); taskExecutor.setThreadNamePrefix("Executor-"); return taskExecutor; } } |
각 변수 설명은 다음과 같다.
- CorePoolSize : 최초 동작 시에 corePoolSize만큼 스레드가 생성하여 사용된다.(Default 1)
- MaxPoolSize : Queue 사이즈 이상의 요청이 들어오게 될 경우, 스레드의 개수를 MaxPoolSize만큼 늘린다.(Default : Integer.MAX_VAULE)
- QueueCapacity : CorePoolSize 이상의 요청이 들어올 경우, LinkedBlockingQueue에서 대기하게 되는데 그 Queue의 사이즈를 지정해주는 것이다.(Default : Integer.MAX_VAULE)
- SetThreadNamePrefix : 스레드명 설정
여러개의 스레드 풀을 사용시에는 Async annotation에 Bean이름을 지정해주면 된다.
@Async("sampleExecutor") // ThreadPoolTaskExecutor Bean명과 동일하게 가져가기 public void testAsync(String message){ |
참고 포스팅
https://thenicesj.tistory.com/159
반응형
'IT > Java' 카테고리의 다른 글
Thread란? (process비교) (12) | 2023.02.21 |
---|---|
@Transactional 사용시 주의 사항1 (checked Exception) (8) | 2023.02.20 |
Error, Checked Exception, Unchecked Exception 비교 (11) | 2023.02.14 |
findBy 쿼리 메서드에서 dto 명칭(underbar, camel case) (10) | 2023.02.10 |
자바 Timestamp / Date / LocalDate 에서 현재 시간 구하는 방법 (4) | 2023.02.09 |
댓글