동기 비동기를 언급할 때는 항상 무엇과 무엇이 와 어떤 시간을? 관한 언급이 있어야 한다.
메소드 리턴시간 과 실제로 결과를 전달받는 시간이 다르면 비동기 라고 생각하면 된다.
블록킹 논블록킹 은 동기 비동기와 는 개념이 다르다. 내가 직접 제어할 수 없는 대상을 상대하는 방법 (IO, 멀티스레드 동기화)
이 경우에는 내가 비동기적으로 시킨 제 3의 스레드에서 결과를 다 만들어서 값을 리턴할떄까지 블록상태(대기)에 들어간다.
@Async 메소드의 리턴타입은 void, Future<T> , ListenableFuture<T> , CompletableFuture<T> 로 총 4가지다.
메소드호출에서 리턴되는 시점하고 실제 결과를 가져오는 시점이 다르다.
spring 4.0에서 추가된 자바 인터페이스이다. 성공했을때와 실패해서 예외가 발생할 경우 호출되는 람다식 2개를 준것이다. Future를 non blocking방식으로 처리한것이다.
내가 비동기 작업을 완료하고 그 결과값을 쓸 수 있는 상태로 리턴된다.
@Async 가 사용하는 기본 스레드는 사용되고나면 버려진다. 기본 TaskExecutor는 쓰레드풀 개념이 아니다.
SimpleAsyncTaskExecutor 가 기본이고 Executor , ExecutorService , TaskExecutor 타입의 Bean중 하나만 존재하게 되면 이것들을 사용한다. @Async("myExecutor") 여러개라면 이렇게 구체적으로 지정을 하면 된다.
Servelt3.0 - Asynchronous Processing
무엇인가 기다리느라 서블릿 요청처리를 완료하지 못하는 경우를 위해서 등장
서블릿에서 AsyncContext를 만든 뒤 즉시 서블릿 메소드 종료 및 서블릿 쓰레드 반납
어디서든 AsyncContext를 이용해서 응답을 넣으면 클라이언트에 결과를 보냄
Spring MVC async
DeferredResult<T>
임의의 쓰레드에서 리턴 값 설정 가능
Callable 처럼 새로운 쓰레드를 만들지 않음
다양한 비동기 처리기술과 손쉽게 결합
controller 에서 request를 담당했던 스레드는 바로 return 되고 실제 request 의 결과물을 받을 수 있는 일종의 채널같은 것을 형성해준다. 그리고 추후에 event를 쓰면 브라우저로 결과를 날려보내준다.
@Async 와 함께 유용하게 쓸수 있다. myService.async() 에 @Async가 존재한다.
CompletableFuture<T>
콜백핼 에서 벋어날 수 있게 javascript promise 마냥 연결해줄수 있다.
AsyncTemplate 을 쓸때 non blocking IO 를 지원해준느 Netty 같은것을 가져다 써야 비동기 방식으로 api를 호출할 때 다 뒤에 쓰레드에 맡겨놔서 갑자기 스레드가 증가하는 현상을 막을 수 있다.
ListenableFuture 를 CompleteableFutrue로 바꾸는 작업이다.
그러면 콜벡핼을 벗어나고 체인 형식으로 작성할 수 있다.
비동기 스프링이 기술을 사용하는 이유
IO가 많은 서버 앱에서 서버 자원을 효율적으로 사용해 성능을 높이려고 (낮은 레이턴시 높은 처리율)
서버 외부의 이벤트를 받아 처리하는 것과 같은 비동기 작업이 필요해서
'WEB > Spring' 카테고리의 다른 글
스프링 핵심 원리 - 고급편 1) 예제만들기 (0) | 2022.01.02 |
---|---|
[java brains , spring docs] Aspect Oriented Progamming (0) | 2021.10.13 |
김영한 (스프링 핵심원리 9) 프로토타입 스코프 - 싱글톤 빈과 함께 사용시 문제점 (0) | 2021.02.15 |
김영한 (스프링 핵심원리 8) 빈 생명주기 콜백 시작 (0) | 2021.02.14 |
김영한 (스프링 핵심 원리 7) 의존관계 자동 주입 (0) | 2021.02.14 |