티스토리 뷰

spring boot 2 기반 애플리케이션을 spring boot 3 로 올리면서 겪은 이슈들에 대해 정리하고자 한다. 기본적인 방법은 공식 마이그레이션 가이드( https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Migration-Guide )를 참고하면 되는데, 문서에 나와있지 않거나 나와있지만 까다로운 부분들을 중점으로 다뤄보고자한다.

 

spring framework 6(boot 가 아니다)부터 ListenableFuture 인터페이스가 deprecate 되었다. 인터페이스가 deprecate 되면서 자연히 그 구현체들도 모두 deprecate 되어 퇴출수순을 밟고있다. 다른 대체 인터페이스를 제공하는 것은 아니며 기존 JDK 에서 제공하는 CompletableFuture 를 사용하도록 했다.

// ListenableFuture 에 추가된 설명
@deprecated as of 6.0, in favor of {@link CompletableFuture}

 

ListenableFuture 가 deprecate 된 이유는 찾지 못했는데 개인적인 이유로는 7 이하 구버전 JDK 에 대한 지원을 완전히 중단하면서 8 부터 추가된 CompletableFuture 로 넘어가는게 아닐까싶다. 혹시 이유를 알고있는 분이 계시다면 댓글을 부탁드리고 싶다.

 

여튼 deprecate 정도라면 당장 기존 코드를 바꾸지 않아도 애플리케이션 구동에는 문제가 없으나 문제는 ListenableFuture 를 사용하는 다른 spring 코드들이다. 나는 구체적으로 KafkaTemplate 에서 이 문제를 마주했는데, KafkaTemplate 은 spring boot 2 까지는 send() 메서드 호출시 ListenableFuture 를 리턴했지만 spring boot 3 부터 CompletableFuture 를 리턴하도록 됐다.

 

ListenableFuture 를 사용했다면 기존에는 비동기 작업 후 동작을 callback 을 등록하여 해결했을텐데 CompletableFuture 는 동일한 메서드를 제공하지 않는다. whenComplete() 메서드를 이용해야한다.

// SuccessCallback, FailureCallback 을 각각 전달하는 경우
SuccessCallback<String> successCallback = result -> System.out.println("success -> " + result);
FailureCallback failureCallback = ex -> ex.printStackTrace();

var listenableFuture = new CompletableToListenableFutureAdapter<>(future);
listenableFuture.addCallback(successCallback, failureCallback);

// 두 콜백을 합쳐서 ListenableFutureCallback 으로 전달하는 경우
ListenableFutureCallback<String> listenableFutureCallback = new ListenableFutureCallback<>() { 
    @Override                                                                                        
    public void onFailure(Throwable ex) {                                                            
        ex.printStackTrace();                                                                        
    }                                                                                                
                                                                                                     
    @Override                                                                                        
    public void onSuccess(String result) {                                                           
        System.out.println("success -> " + result);                                                  
    }                                                                                                
};                                                                                                   

listenableFuture.addCallback(listenableFutureCallback);

위처럼 ListenableFuture 에 callback 을 전달하고 있었다면

var future = CompletableFuture.supplyAsync(supplier);   
future.whenComplete((result, ex) -> {                   
    if(ex == null) {                                    
        System.out.println("success -> " + result);     
    } else {                                            
        ex.printStackTrace();                           
    }                                                   
});

CompletableFuture 를 통해 이런식으로 마이그레이션 할 수 있다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함