Spring Boot @Async로 비동기 처리 구현하기: 서비스 응답 속도 개선
서론
사용자가 요청을 보냈을 때 이메일 발송, 리포트 생성, 외부 API 호출 등 시간이 오래 걸리는 작업이 포함되어 있다면 응답 속도가 느려질 수밖에 없습니다. 이럴 때 **비동기 처리(Asynchronous Processing)**를 도입하면, 핵심 로직만 즉시 응답하고 무거운 작업은 백그라운드에서 실행하여 사용자 경험을 크게 향상시킬 수 있습니다.
@Async 활성화 및 설정
Spring Boot에서 비동기 기능을 사용하려면 먼저 @EnableAsync 설정을 추가해야 합니다.
1. 비동기 설정 클래스
기본 ThreadPool 대신 커스텀 설정을 통해 안정성을 확보하는 것이 좋습니다.
@Configuration
@EnableAsync
public class AsyncConfig {
@Bean(name = "taskExecutor")
public Executor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(5); // 기본 스레드 수
executor.setMaxPoolSize(10); // 최대 스레드 수
executor.setQueueCapacity(500); // 큐 용량
executor.setThreadNamePrefix("AsyncThread-");
executor.initialize();
return executor;
}
}
비동기 메서드 구현
비동기로 동작할 메서드 위에 @Async 어노테이션을 붙여주기만 하면 됩니다.
@Service
public class EmailService {
@Async("taskExecutor")
public void sendEmail(String recipient, String content) {
// 시간이 오래 걸리는 이메일 전송 로직 구현
System.out.println("Sending email in: " + Thread.currentThread().getName());
// 실제 전송 작업 수행...
}
}
비동기 작업 결과 처리: CompletableFuture
비동기 작업의 결과값이 필요한 경우 Java의 CompletableFuture를 활용할 수 있습니다.
@Async("taskExecutor")
public CompletableFuture<String> processAsyncTask() {
// 시간이 걸리는 비즈니스 로직 수행
return CompletableFuture.completedFuture("Task Result");
}
핵심 SEO 포인트: 비동기 처리와 성능 향상
- 비동기 도입의 장점: 사용자에게 즉각적인 응답을 제공하여 서비스 체감 속도를 높입니다.
- ThreadPool 최적화: 시스템 리소스를 적절히 배분하여 무분별한 스레드 생성을 방지하고 메모리 부족(OOM) 오류를 예방합니다.
결론
Spring Boot의 @Async는 복잡한 비동기 프로그래밍을 어노테이션 하나로 해결해 주는 강력한 도구입니다. 시간이 걸리는 작업을 비동기로 분리하여 고성능 애플리케이션을 구축해 보시기 바랍니다.