홈 › 실무 확장 › 16 / 22

긴 작업 비동기 처리와 진행률

202 Accepted, 작업 상태, 폴링·SSE, 취소, 중복 방지, 완전 종료
섹션 7진행 0 / 22

7. 정리

긴 작업은 요청 스레드에서 처리하지 않고, 제출은 202 Accepted + 작업 ID 로 즉시 응답합니다. 실제 처리는 별도 스레드 풀이 백그라운드에서 담당합니다.

상태는 PENDING·RUNNING·DONE·FAILED·CANCELLED 다섯 가지로 관리하고, processed/total 진행률과 메시지를 함께 노출합니다. 진행률 전달은 단순하면 폴링, 실시간성이 필요하면 SSE 를 씁니다.

nginx 뒤에서 SSE 를 쓸 때는 proxy_buffering off 와 X-Accel-Buffering: no 를 반드시 챙깁니다. 다중 인스턴스 환경에서는 작업 상태를 메모리가 아니라 DB 로 관리하고, 재기동 시 남은 RUNNING 을 FAILED 로 정리합니다.

중복 제출은 owner 기준 체크나 멱등키로 막고, 취소는 플래그를 두고 작업 스스로 확인하는 협력적 방식으로 처리합니다. 스레드 풀은 크기와 큐 한도를 명시하고, 서버 종료 시 awaitTermination 으로 완전 종료합니다. Spring 에서는 @Async + ThreadPoolTaskExecutor, SseEmitter 로 같은 패턴을 선언적으로 구현하되 self-invocation 함정을 조심합니다.