본문 바로가기
IT/Java

Spring 에서 async 처리 (@Async)

by 성준하이 2023. 2. 19.
반응형

스프링에서 비동기 처리를 위한 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

 

동기 / 비동기 프로그래밍

자바스크립트를 다뤄본 사람은 비동기 프로그래밍이라고 들어본적이 있을것이다. 사전적 의미를 먼저 보자면 동기적(synchronous) 어떤 일이나 행동을 일으키게 하는 계기가 되는. 또는 그런 것.

thenicesj.tistory.com

 

반응형

댓글