본문 바로가기
Java/Spring

@Async 어노테이션

by 전재경 2023. 1. 9.

@Async 어노테이션 비동기처리

 

@Async 어노테이션을 빈Bean에 넣으면 별도의 쓰레드에서 실행.

호출자는 호출된 메소드가 완료될 때 까지 기다릴 필요가 없다.

 

@Async 의 두가지 제약사항

  • public 메소드에만 적용해야한다
  • 셀프 호출self invocation – 같은 클래스안에서 async 메소드를 호출 – 은 작동하지않음

메소드가 public이어야 프록시가 될수 있기 때문이고 셀프호출은 프록시를 우회하고 해당 메소드를 직접 호출하기때문에 작동하지않는 것

 

 

리턴타입이 없는 메소드 Methods with void Return Type

@Async
public void asyncMethodWithVoidReturnType() {
    System.out.println("Execute method asynchronously. " + Thread.currentThread().getName());
}

 

리턴타입이 있는 메소드 Methods with Return Type

@Async
public Future<String> asyncMethodWithReturnType() {
    System.out.println("Execute method asynchronously - " + Thread.currentThread().getName());
    try {
        Thread.sleep(5000);
        return new AsyncResult<String>("hello world !!!!");
    } catch (InterruptedException e) {
        //
    }
    return null;
}

 

위의 메소드를 호출하여 Future 객체를 사용해 비동기 처리의 결과값을 가져오면

 

public void testAsyncAnnotationForMethodsWithReturnType()
    throws InterruptedException, ExecutionException {
    System.out.println("Invoking an asynchronous method. "
      + Thread.currentThread().getName());
    Future<String> future = asyncAnnotationExample.asyncMethodWithReturnType();
 
    while (true) {
        if (future.isDone()) {
            System.out.println("Result from asynchronous process - " + future.get());
            break;
        }
        System.out.println("Continue doing something else. ");
        Thread.sleep(1000);
    }
}

실행자 The Executor

 

스프링은 기본값으로 SimpleAsyncTaskExecutor 를 사용하여 실제 메소드들을 비동기 실행한다. 기본 설정은 두가지 레벨로 오버라이드할 수 있다 - 어플리케이션 레벨 또는 개인 메소드 레벨.

 

 메소드 레벨로 실행자 오버라이드하기 Override the Executor at the Method Level

@Configuration
@EnableAsync
public class SpringAsyncConfig {
     
    @Bean(name = "threadPoolTaskExecutor")
    public Executor threadPoolTaskExecutor() {
        return new ThreadPoolTaskExecutor();
    }
}

 

그 후 실행자 이름을 @Async에서 속성값으로 제공

 

@Async("threadPoolTaskExecutor")
public void asyncMethodWithConfiguredExecutor() {
    System.out.println("Execute method with configured executor - "  + Thread.currentThread().getName());
}

 

어플리케이션 레벨로 실행자 오버라이드하기 Override the Executor at the Application Level

이 경우 설정 클래스는AsyncConfigurer 인터페이스를 구현해주어야한다 - 이는 getAsyncExecutor() 메소드를 구현해야한다는 의미이다. 여기에 우리는 전체 어플리케이션을 위한 실행자를 리턴할 것이다 - 이는 이제 @Async로 어노테이션된 메소드를 실행하는 기본 실행자가 된다.

 

@Configuration
@EnableAsync
public class SpringAsyncConfig implements AsyncConfigurer {
     
    @Override
    public Executor getAsyncExecutor() {
        return new ThreadPoolTaskExecutor();
    }
     
}

 

 

참고블로그

 

 

스프링에서 @Async로 비동기처리하기

스프링에서 @Async로 비동기처리하기 @Async in Spring[원문: http://www.baeldung.com/spring-async] 1. 개요 Overview이 글에서 스프링의 비동기 실행 지원asynchronous execution support과 @Async annotation에 대해 살펴볼 것

springboot.tistory.com

 

 

[Spring] @Async Annotation(비동기 메소드 사용하기)

java.util.concurrent.ExecutorService을 활용해서 비동기 방식의 method를 정의 할 때마다, 위와 같이 Runnable의 run()을 재구현해야 하는 등 동일한 작업들의 반복이 잦았다. With @Async @Async Annotati

velog.io

 

 

Spring Boot @Async 어떻게 동작하는가?

스프링부트 환경에서, @Async 어노테이션 사용해서 비동기 메서드 구현 | 이 글에서는, 스프링 프레임워크에서 제공하는 @Aysnc 비동기 메서드 사용 방법에 대해서 설명한다. 이 글을 읽기 위해서

brunch.co.kr

 

댓글