Spring에서 @Async를 사용할 때 주의해야 할 점은 무엇인가요?
답변 포인트
프록시 기반 동작, 스레드 풀 설정, 예외 처리, 트랜잭션 전파를 함께 생각해보세요.
정답 및 해설
빠른 요약
`@Async`는 Spring에서 메서드를 별도 스레드에서 비동기로 실행하게 해주는 기능입니다. 이메일 발송, 로그 처리, 외부 API 호출처럼 요청 흐름을 막지 않아도 되는 작업에 사용할 수 있습니다.
@Async는 Spring에서 메서드를 별도 스레드에서 비동기로 실행하게 해주는 기능입니다. 이메일 발송, 로그 처리, 외부 API 호출처럼 요청 흐름을 막지 않아도 되는 작업에 사용할 수 있습니다.
하지만 몇 가지 주의점이 있습니다.
첫째, Spring AOP 프록시 기반이므로 같은 클래스 내부에서 this.asyncMethod()처럼 호출하면 비동기로 동작하지 않습니다. 프록시를 거쳐 호출되어야 합니다.
둘째, 스레드 풀을 명시적으로 설정해야 합니다. 기본 executor에 의존하면 트래픽이 늘었을 때 스레드가 과도하게 생성되거나 큐가 예측하기 어렵게 쌓일 수 있습니다.
@Bean
public Executor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(10);
executor.setMaxPoolSize(30);
executor.setQueueCapacity(100);
executor.initialize();
return executor;
}셋째, 예외 처리를 놓치기 쉽습니다. 반환 타입이 void면 호출자가 예외를 받을 수 없으므로 AsyncUncaughtExceptionHandler나 로깅 전략이 필요합니다. CompletableFuture를 반환하면 실패를 조합해 다룰 수 있습니다.
마지막으로 트랜잭션 컨텍스트가 다른 스레드로 자동 전파되지 않는다는 점도 중요합니다. DB 커밋 이후 실행해야 하는 작업인지 신중히 설계해야 합니다.