티스토리 뷰

반응형

Spring 에서 @Async 을 이용해서 쉽게 비동기 method 을 만들 수 있습니다.

대략 다음과 같이 method 정의를 먼저 할 수 있을 겁니다.


1
2
3
4
5
6
@Async
public CompletableFuture<String> async(String param1, int param2) {
 
    return CompletableFuture.completedFuture(param1 + " : " + param2);
 
}


그리고 이를 다음과 같이 사용할 수 있겠죠.


1
CompletableFuture<String> result = service.async("status", 100);


하지만, 이렇게 그냥 사용할 경우 @Async 는 SimpleAsyncTaskExecutor 을 기본 TaskExcutor 로 이용하기 때문에 async method 을 호출할 때마다 새로운 Thread 을 생성하게 됩니다. 반드시 문제가 발생한다고 할 수는 없지만, 새로운 Thread 을 생성하고 소멸하는 비용이 증가하고 많은 요청이 몰릴 경우 시스템 장애로 이어질 수 있기 때문에 Pool 을 써야할 때가 있습니다.



Spring Boot 에서 Java Config 을 이용해서 쉽게 이를 해결할 수 있는데 아래와 같이 ThreadPoolTaskExecutor 을 이용하도록 해주면 됩니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@Configuration
@EnableAsync
public class ExecutorConfig {
 
    @Bean(name = "taskExecutor")
    public TaskExecutor taskExecutor() {
 
        ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
        taskExecutor.setCorePoolSize(3);
        taskExecutor.setMaxPoolSize(30);
        taskExecutor.setQueueCapacity(10);
        taskExecutor.setThreadNamePrefix("task-pool-");
        taskExecutor.initialize();
 
        return taskExecutor;
 
    }
 
}


org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor 을 새롭게 생성해서 pool 의 크기와 Thread 명의 접두사 등을 선언해줄 수 있습니다. 그리고 @Bean 으로 등록할 때 name 을 지정할 수 있는데, 이런 식으로 복수의 TaskExecutor 을 등록한 뒤 @Async 에서 원하는 TaskExecutor 을 선택해서 사용할 수도 있습니다.

반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함