Java CompletableFuture로 비동기 처리하기
핵심 내용
CompletableFuture로 순차 실행을 비동기로 바꿔 성능과 안정성을 개선한다.
자세히 보기
중앙 집중식 데이터베이스를 영역별로 분리하는 과정에서, 이관 전후 로직을 순차 실행 하다 보니 전체 실행 시간이 두 배로 늘고, 1초 차이로 조회 결과가 달라져 정상 케이스도 비교에 실패하는 문제가 생겼다.
이 문제를 해결하기 위해 Java 8의 CompletableFuture 를 활용해 비동기 처리를 적용했다. 기존 Future 가 갖고 있던 연산 결합과 예외 처리의 불편함을 보완하면서, 비동기 흐름을 더 유연하게 다룰 수 있다는 점이 핵심이다.
CompletableFuture는 supplyAsync() 로 인스턴스를 만들고, get() 이나 join() 으로 완료를 기다릴 수 있다. 이후 연산은 목적에 따라 다음 메서드들을 조합해 처리한다.
thenApply(): 이전 단계의 결과를 받아 다음 값을 계산할 때 사용한다.thenAccept(): 결과를 소비만 하고 반환값이 필요 없을 때 사용한다.thenRun(): 반환값 없이 후속 작업만 수행할 때 사용한다.
연산을 연결할 때는 thenCompose() 와 thenCombine() 의 차이를 구분하는 것이 중요하다. thenCompose() 는 이전 단계의 결과를 바탕으로 또 다른 비동기 작업을 이어 붙이고, thenCombine() 은 서로 독립적인 두 Future의 결과를 결합한다.
결과가 필요 없는 후처리라면 thenAcceptBoth() 가 유용하고, 여러 작업을 동시에 기다려야 할 때는 allOf() 로 병렬 실행을 묶을 수 있다. 다만 allOf() 는 기본적으로 Void 를 반환하므로, 결과를 다시 꺼내려면 join() 같은 추가 처리가 필요하다.
마지막으로 이 글은 예외 처리 와 Timeout 까지 함께 다루며, 순차 처리로 인한 성능 저하와 결과 불일치 문제를 비동기로 개선하는 실전 패턴을 정리한다.
이 한국어 요약은 AI가 자동으로 만들었습니다. 원문의 주장과 맥락은 원문에서 확인해 주세요. 저작권은 원저작자에게 있습니다.