@Async는 Spring Framework에서 제공하는 어노테이션으로, 메서드를 비동기로 실행하도록 지시한다.
이 어노테이션을 메서드에 적용하면, 호출이 일어날 때 메서드가 별도의 스레드에서 실행되게 된다. 즉, 메서드 호출이 즉시 반환되고, 실제 작업은 호출자 스레드와는 독립적으로 백그라운드에서 진행된다.
이를 통해 원래의 작업 흐름은 블로킹(blocking)되지 않고, 계속해서 다음 작업을 진행할 수 있다.
주의 사항 및 고려점:
1 비동기 메서드의 반환 타입:
- void: 반환값이 없는 경우.
- Future 또는 CompletableFuture: 비동기 작업의 결과를 나중에 받기 위해 사용한다.
@Async
1 Exception Handling:
- @Async 메서드에서 발생한 예외는 호출자에게 전파되지 않는다.
- 별도의 AsyncUncaughtExceptionHandler를 등록하여 예외를 처리할 수 있다.
2 Proxy 기반의 AOP:
- @Async는 프록시 기반의 AOP를 사용한다.
- 같은 클래스 내에서 다른 메서드를 호출할 때 @Async는 동작하지 않을 수 있다. 이는 프록시가 내부 호출에는 반응하지 않기 때문이다.
3 설정:
- @EnableAsync 어노테이션을 설정 클래스에 추가하여 @Async 활성화를 해야 한다.
ThreadPool
1 스레드 풀 설정:
- @Async를 사용하면 기본적으로 SimpleAsyncTaskExecutor를 사용한다. 하지만, 스레드 풀을 직접 정의하여 사용하는 것이 좋다.
- ThreadPoolTaskExecutor를 빈으로 등록하여 커스텀 스레드 풀을 사용할 수 있다.