api 통신을 효율적으로 함으로써 화면을 부드럽게 그릴 수 있을까 하고 알아보다 자바에서 제공하는 인터페이스인 CompletableFuture라는 것을 알게 되었다.
내가 마주한 api 통신의 문제는 1. 많은 데이터 양이 통신 될 때 모든 통신을 기다려야 함. 2. 기다리는 동안 화면을 스크롤 할 시 버벅거림 같은 현상이었고 이를 해결하기 위해 사용하였다.
CompletableFuture 이전에는 Future 라는 게 있었지만,
1) 블로킹 호출 : 'Future.get()' 메서드를 호출하여 사용하면 해당 호출이 완료될 때까지 스레드가 블로킹되어 api 호출을 동시에 처리할 때 문제가 되었다.
2) 콜백 지원 부족 : Future는 완료 시 실행할 수 있는 콜백을 지원하지 않았다. 그래서 비동기작업이 완료 되었을 때 추가적인 작업을 명시적으로 처리하는 게 어려웠다.
그래서 이 문제점을 해결하려고 나타난게 CompletableFuture 인 것이다.
CompletableFuture의 가장 좋은 점은 외부에서 명시적으로 Complete 시킬 수가 있다. 즉, 몇 초 이내에 응답이 오지 않는다면 기본값으로 미리 캐시에 넣어둔 값이나, 특정한 값을 리턴하게 할 수 있다.
예를 들면, 아래의 코드 처럼
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
public class CompletableFutureExample {
public static void main(String[] args) {
// CompletableFuture 생성
CompletableFuture<String> completableFuture = new CompletableFuture<>();
// CompletableFuture에 값 설정
String value = "미리 세팅 해 둔 값";
completableFuture.complete(value);
try {
String result = completableFuture.get();
System.out.println("CompletableFuture에서 가져온 값: " + result);
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
}
비동기 작업 중에 CompletableFuture 의 complete를 이용하여 명시적으로 기본값으로 지정한다.
대신, complete() 매서드를 호출하면 CompletableFuture의 상태가 즉시 완료 된다. 심지어 CompletableFuture 가 비동기 작업을 수행하는 도중이더라도 상태를 완료로 설정한다. 그러면 상태가 완료된 CompletableFuture 의 get()을 통해 미리 지정해 둔 값을 가져와 후속 작업을 진행할 수 있다.
'JAVA' 카테고리의 다른 글
[Java] nextLine() 오류 (0) | 2024.10.31 |
---|---|
[Java] 문자열을 반복하는 메서드 - repeat() (0) | 2024.10.24 |
자바의 <T> 제네릭 타입 (Generic Type) (0) | 2024.05.24 |
MVC 모델 (0) | 2023.10.27 |
StringBuilder 사용법과 메서드 정리 (0) | 2023.09.09 |