서론

사용자가 요청을 보냈을 때 이메일 발송, 리포트 생성, 외부 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는 복잡한 비동기 프로그래밍을 어노테이션 하나로 해결해 주는 강력한 도구입니다. 시간이 걸리는 작업을 비동기로 분리하여 고성능 애플리케이션을 구축해 보시기 바랍니다.