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 | 스프링 애플리케이션 레벨에서 메서드를 별도 스레드에서 실행하도록 해 주는 어노테이션 |