WEB/Spring

스프링캠프 2017 Async & Spring

Tony Lim 2021. 9. 10. 11:07
728x90

동기 비동기를 언급할 때는 항상 무엇과 무엇이 와 어떤 시간을? 관한 언급이 있어야 한다.

메소드 리턴시간 과 실제로 결과를 전달받는 시간이 다르면 비동기 라고 생각하면 된다.

블록킹 논블록킹 은 동기 비동기와 는 개념이 다르다. 내가 직접 제어할 수 없는 대상을 상대하는 방법 (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가 많은 서버 앱에서 서버 자원을 효율적으로 사용해 성능을 높이려고 (낮은 레이턴시 높은 처리율)

서버 외부의 이벤트를 받아 처리하는 것과 같은 비동기 작업이 필요해서

 

728x90