티스토리 뷰
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 를 통해 이런식으로 마이그레이션 할 수 있다.
'Java > spring' 카테고리의 다른 글
spring boot 3 migration#03 @ConstructorBinding 스펙 변경 (0) | 2023.11.07 |
---|---|
spring boot 3 migration#02 WebSecurityConfigurerAdapter (0) | 2023.05.14 |
spring boot 에서 ObjectMapper 확장하기 (1) | 2023.03.24 |
domain 에서 프레임워크 의존을 제거할 수 있을까 (4) | 2022.11.20 |
TransactionTemplate 을 이용한 트랜잭션 제어 (0) | 2022.03.06 |
- Total
- Today
- Yesterday
- Spring
- java8
- frontcode
- backend개발환경
- JPA
- spring cloud
- javascript
- OOP
- JavaScript Core
- java
- servlet
- code
- MySQL
- toby
- Kotlin
- 정규표현식
- go-core
- frontend개발환경
- Git
- generics
- DesignPattern
- EffectiveJava
- Jackson
- mariadb
- Design Pattern
- db
- TEST
- programming
- clean code
- http
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |