카테고리 없음

스프링 부트 @async

jw-backend 2024. 7. 24. 18:02
반응형

스프링 부트에서 @Async 애너테이션을 사용하면 비동기적으로 작업을 수행할 수 있으며, 이때 스레드풀에 담긴 스레드의 개수만큼 동시에 작업을 수행할 수 있습니다.

스프링 부트의 비동기 처리

  1. 비동기 작업: @Async 애너테이션을 메서드에 적용하면, 해당 메서드는 비동기적으로 실행됩니다. 즉, 메서드 호출 시 즉시 반환되고, 실제 작업은 별도의 스레드에서 실행됩니다.
  2. 스레드풀: 비동기 작업은 기본적으로 스레드풀에서 관리되는 스레드를 사용하여 실행됩니다. 스레드풀의 크기는 설정에 따라 다르며, 동시에 실행할 수 있는 최대 작업 수를 결정합니다.

동작 방식

  1. 스레드풀 설정: 스프링 부트에서 비동기 작업을 위해 사용할 스레드풀을 설정할 수 있습니다. 예를 들어, @EnableAsync 애너테이션을 사용하고 Executor 빈을 정의하여 스레드풀의 크기와 큐 용량 등을 설정합니다.

java

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.Executor;

@Configuration
@EnableAsync
public class AsyncConfig {

    @Bean(name = "taskExecutor")
    public Executor taskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(5); // 최소 스레드 수
        executor.setMaxPoolSize(10); // 최대 스레드 수
        executor.setQueueCapacity(25); // 큐 용량
        executor.initialize();
        return executor;
    }
}
  1. 비동기 메서드 호출: 비동기 메서드를 호출하면, 호출한 스레드는 즉시 반환되고, 비동기 작업은 스레드풀에 있는 스레드에서 실행됩니다.
  2. 동시 작업 처리: 스레드풀의 크기(예: 5)만큼의 스레드가 동시에 작업을 수행할 수 있습니다. 만약 동시에 요청된 비동기 작업 수가 스레드풀의 크기를 초과하면, 추가 작업은 큐에 저장됩니다.

예시 시나리오

  • 스레드풀 크기: 5
  • 동시 요청 수: 8
  1. 비동기 메서드가 호출될 때, 첫 5개의 요청은 각각 스레드풀의 스레드에 할당되어 동시에 실행됩니다.
  2. 나머지 3개의 요청은 큐에 저장되어 대기합니다.
  3. 스레드 중 하나가 작업을 완료하면, 큐에서 대기 중인 작업 중 하나를 가져와 실행합니다.

요약

스프링 부트의 @Async를 통해 비동기 작업을 수행하면, 스레드풀의 크기만큼의 스레드가 동시에 작업을 처리할 수 있습니다. 이를 통해 많은 사용자가 동시에 접근하는 경우에도 효율적으로 작업을 수행할 수 있습니다.