Spring
SpringBoot [Async Controller]
성찬우
2022. 7. 15. 02:08
생소 할 수 있지만 정말 천천히 읽어보기를 권장함.
서버로 들어오는 요청들을 비동기로 처리하여 돌려주는 방법 이라고 설명할 수 있다.
*비동기
동시에 일어나지 않음을 의미. 요청과 응답이 동시에 일어나지 않음.
동기보다 복잡하지만 결과가 주어지는데 시간이 걸리더라도 그 시간동안 다른 작업을 할 수 있으므로
자원을 효율적으로 사용할 수 있다.
핵심은 Callable 이다.
Callable 이란 결과를 반환하고 예외를 반생시킬 수 있는 작업이다.
Callable은 Runnable(결과를 리턴시키지 않는 특징이 있음.)과 유사하다. 동시에 다른 스레드에 의해 인스턴스가 실행 될 수 있는 클래스를 위해 설계되었다.
유의할점.
Callable은 기본적으로 SimpleAsyncTaskExecutor에서 실행됨
- Production에선 환경에 알맞게 AsyncTaskExecutor을 세팅할 필요성이 있음
- Callable을 사용하면서 AsyncTaskExecutor을 바꾸기 위해선 RequestMappingHandlerAdapter을 직접 바꾸는 방법밖에 없음
내부적인 동작

1. 요청이 들어옵니다.
2. DispatcherServlet 이 Controller method 를 찾아 요청을 하고 Callable을 돌려받음
3. DispatcherServlet 은 Callalbe을 비동기 처리하기 위해 WebAsyncManager에 요청
4. WebAsyncManager는 Callable을 특정 TaskExecutor에 할당하여 비동기 처리
5. Callalbe의 작업이 완료 -> WebAsyncManager로 결과값을 돌려줌
6. WebAsyncManager 는 DispatcherServlet 에게 요청
7. DispatcherServlet은 WebAsyncManager에게 결과값을 받음 다음 응답