Spring Boot

Spring Boot - 비동기 처리

최-코드 2024. 6. 25. 13:37

spring boot에서 비동기 처리는 멀티 스레딩 환경에서 비동기적으로 실행되는 작업을 처리하는 것을 말한다. 즉 비동기 + 논블록킹 방식으로 작동한다.

 

비동기 처리 작업은 멀티 스레드를 사용하여 작업을 분리하고, 작업이 끝날 때까지 대기하지 않고 다른 작업을 처리할 수 있게 하는 것을 말한다. 즉, 비동기로 처리할 메소드가 있을 때 해당 메소드를 호출할 때마다 새로운 스레드에서 동작하도록 하는 것이다. 따라서 해당 함수를 호출한 곳은 기다리지 않고 계속 진행되게 된다.

 

따라서 요청에 대한 응답 시간을 줄일 수 있고, 처리량을 높일 수 있다.

 

Spring Boot - WebSocket을 이용한 실시간 채팅 구현 (tistory.com)

여기서 handler 클래스를 보면 된다. 비동기 처리할 메소드에 @Async 어노테이션을 붙인다. 기본적으로 @Async만 붙일 시 스레드 풀 방식을 사용하지 않고 무한정 스레드를 찍어놓는 방식을 사용하게 된다. 이를 위해 아래와 같이 설정하면 된다.

 

@Bean 어노테이션에 붙은 name의 값을 @Async에 집어넣으면 해당 설정으로 스레드를 생성하게 된다.

@Configuration
@EnableAsync
public class AsyncConfig {
    @Bean(name = "threadPoolTaskExecutor")
    public Executor asyncExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(5);
        executor.setMaxPoolSize(50);
        executor.setQueueCapacity(100);
        executor.setKeepAliveSeconds(120);
        executor.setAllowCoreThreadTimeOut(true);
        executor.setPrestartAllCoreThreads(true);
        executor.setWaitForTasksToCompleteOnShutdown(true);
        executor.setAwaitTerminationSeconds(20);
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());
        executor.setThreadNamePrefix("Async-Test");
        executor.initialize();

        return executor;
    }
}

 

setCorePoolSize() : 기본 스레드 사이즈를 설정한다
setMaxPoolSize() : 최대 스레드 사이즈를 설정한다
setQueueCapacity() : 스레드 대기 큐의 사이즈를 설정한다
setKeepAliveSeconds() : 해당 초까지 idle상태가 유지되면 스레드를 종료한다 (idle:어떠한 동작 상태도 아닐때)
setAllowCoreThreadTimeOut() : setKeepAliveSeconds에 대한 활성화 여부
setPrestartAllCoreThreads() : 작업 이전에 스레드를 활성화 시킬지에 대한 여부
setWaitForTasksToCompleteOnShutdown() : 진행중이던 작업이 완료 된 후 스레드를 종료시킬지에 대한 여부
setAwaitTerminationSeconds() : 작업을 몇초동안 기다려줄지에 대한 여부. 만약 초과되면 강제 종료됨
setRejectedExecutionHandler() : 스레드 작업중 예외가 발생했을대 핸들링 여부
setThreadNamePrefix() : 스레드의 이름 지정

 

@Transactional 설정과 함꼐 사용할 경우 동작이 잘 안되는 경우가 있으므로 주의해야 한다.

 

비동기의 경우 콜백함수라는 개념을 통해 비동기로 동작하는 함수가 끝난 이후 실행할 함수를 지정할 수 있다.