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에게 결과값을 받음 다음 응답