Spring/기타 여러가지

비동기 서블릿(Asynchronous Servlet)

doriver 2025. 5. 29. 16:21

 

비동기 서블릿(Asynchronous Servlet)

서블릿 3.0부터 도입됨

요청-응답 사이클을 일반적인 동기 방식( 요청이 들어오면 처리 스레드를 끝까지 점유, 요청→처리→응답까지 한 스레드가 블록킹하며 처리 )이 아니라 비동기 방식을 가능하게함

이로써

높은 부하에도 요청 처리용 스레드를 효율적으로 재사용할 수 있고, API 게이트웨이, SSE, 롱폴링 같은 장시간 연결 시나리오에 유리

 

비동기 방식

1. startAsync()로 AsyncContext 확보 → 스레드 반환

AsyncContext asyncCtx = request.startAsync();

 

이때 컨테이너(Tomcat 등)는
요청을 처리하던 스레드를 곧바로 반환
, 해당 HTTP 커넥션은 닫지 않은 채로 “열어” 놓는다.

2. 다른 스레드에서 작업 수행

asyncCtx.start(Runnable) 같은 API로 
별도 스레드/스레드 풀에서 긴 작업을 수행하거나,
메시지 큐, 타이머, 다른 서블릿 등에 위임할 수도 있다.

3. asyncCtx.complete() 시점에야 응답 전송/종료

컨테이너가 응답 스트림을 닫고, 커넥션을 정리

 

 

request.startAsync() 과 @Async 비교

둘 다 “비동기” 처리를 돕는다는 점은 같다

request.startAsync() 서블릿 레벨에서 HTTP 요청‐응답 사이클을 논블로킹으로 전환하기 위한 API
@Async 스프링 애플리케이션 레벨에서 메서드를 별도 스레드에서 실행하도록 해 주는 어노테이션