본문 바로가기

dev/스프링

Spring Async CompletableFuture

앞에서 작성한 글에 이어서 비동기로 호출한 메소드들의 결과값을 처리하는 방법입니다.

 

비동기로 호출한 메소드들의 결과값을 처리하려면 Async와 CompletableFuture를 사용하면 됩니다.

 

페이징 처리를 예시로 들면 일반적으로 데이터 목록을 조회하는 메소드와 데이터 갯수를 조회하는 메소드 2개를 호출하는데

 

이렇게 하면 동기로 순차적으로 처리되기 때문에 비효율적입니다.

 

2개의 메소드가 서로에게 영향을 끼치지 않기 때문에 비동기로 호출하는 것이 효율적입니다.

 

ElasticSearchRepositoryImp.java

 

위의 ElasticSearchRepositoryImp 자바 코드를 보게 되면

 

데이터 목록을 조회하는 메소드와 데이터 목록 개수를 조회하는 메소드들을 각각 비동기로 호출하고 결과값을 리턴하고 있습니다.

 

@Async 어노테이션을 통해 메소드를 비동기로 호출하고 있습니다.(45라인, 59라인)

 

CompletableFuture 클래스를 통해 비동기로 호출한 메소드의 결과값을 설정하고 있습니다.(47라인, 61라인)

 

각 메소드들은 QueryDsl을 통해 데이터 목록과 데이터 목록 개수를 조회하고 있습니다.(48 ~ 54라인, 62 ~ 66라인)

 

비동기로 호출된 각 메소드들의 결과값을 CompletableFuture 클래스에 감싸서 리턴하고 있습니다.(56라인,. 68라인)

 

PagingDto.java

 

ElasticSearchServiceImp.java

 

위의 ElasticSearchServiceImp 자바 코드를 보게 되면

 

비동기로 호출한 메소드들의 결과값을 받아서 PagingDto 객체에 전달하고 있습니다.

 

데이터 목록을 조회하는 메소드와 데이터 목록 개수를 비동기로 조회하는 메소드들의 결과값을 받고 있습니다.(105 ~ 106라인)

 

CompletableFuture.allOf를 통해 비동기로 호출한 메소드들의 결과값들이 모두 받기 전까지 동기화하고 있습니다.(108라인)

 

비동기로 호출한 메소드들의 작업이 끝났기 때문에 결과값을 처리하고 있습니다.(110 ~ 111라인)

 

각 결과값을 PagingDto 객체에 전달하고 리턴하고 있습니다.(113 ~ 114라인)

 

디버깅 화면

 

디버깅 화면을 보면 비동기 호출이 정상적으로 실행된 것을 확인할 수 있습니다.

 

Async CompletableFuture을 사용하면 비동기로 작업해야 하는 경우

 

예를 들면 API 연계 같은 작업을 효율적으로 처리할 수 있습니다.

 

저번에 작성한 jquery deferred로 비동기로 호출하는 방법과 비슷하다고 생각하면 쉽게 이해할 수 있습니다.

 

https://tiqndjd12.tistory.com/151

 

jquery deferred

jquery에서 비동기 처리 함수를 여러 건 호출하는데 여러 개의 비동기 함수들을 한 번에 처리해야 하려면 어려운 점이 많습니다. 이럴 때 jquery deferred를 사용하면 쉽게 해결할 수 있습니다. testFnc1

tiqndjd12.tistory.com

 

'dev > 스프링' 카테고리의 다른 글

Spring Async 비동기 처리  (0) 2024.06.10
Spring ElasticSearch Snapshot Backup Restore  (0) 2024.05.21
Spring ElasticSearch 첨부파일 조회  (0) 2024.05.12
Spring ElasticSearch 첨부파일 색인  (0) 2024.05.11
Spring ClassPathResource  (0) 2024.04.21