AI Briefing

Java CompletableFuture로 비동기 처리하기

·2024.01.04 00:00

CompletableFuture로 순차 실행을 비동기로 바꿔 성능과 안정성을 개선한다.

중앙 집중식 데이터베이스를 영역별로 분리하는 과정에서, 이관 전후 로직을 순차 실행 하다 보니 전체 실행 시간이 두 배로 늘고, 1초 차이로 조회 결과가 달라져 정상 케이스도 비교에 실패하는 문제가 생겼다.

이 문제를 해결하기 위해 Java 8의 CompletableFuture 를 활용해 비동기 처리를 적용했다. 기존 Future 가 갖고 있던 연산 결합과 예외 처리의 불편함을 보완하면서, 비동기 흐름을 더 유연하게 다룰 수 있다는 점이 핵심이다.

CompletableFuture는 supplyAsync() 로 인스턴스를 만들고, get() 이나 join() 으로 완료를 기다릴 수 있다. 이후 연산은 목적에 따라 다음 메서드들을 조합해 처리한다.

  • thenApply(): 이전 단계의 결과를 받아 다음 값을 계산할 때 사용한다.
  • thenAccept(): 결과를 소비만 하고 반환값이 필요 없을 때 사용한다.
  • thenRun(): 반환값 없이 후속 작업만 수행할 때 사용한다.

연산을 연결할 때는 thenCompose()thenCombine() 의 차이를 구분하는 것이 중요하다. thenCompose() 는 이전 단계의 결과를 바탕으로 또 다른 비동기 작업을 이어 붙이고, thenCombine() 은 서로 독립적인 두 Future의 결과를 결합한다.

결과가 필요 없는 후처리라면 thenAcceptBoth() 가 유용하고, 여러 작업을 동시에 기다려야 할 때는 allOf() 로 병렬 실행을 묶을 수 있다. 다만 allOf() 는 기본적으로 Void 를 반환하므로, 결과를 다시 꺼내려면 join() 같은 추가 처리가 필요하다.

마지막으로 이 글은 예외 처리Timeout 까지 함께 다루며, 순차 처리로 인한 성능 저하와 결과 불일치 문제를 비동기로 개선하는 실전 패턴을 정리한다.

이 요약은 원문 이해를 돕기 위한 큐레이션입니다. 저작권은 원저작자에게 있으며, 정확한 내용과 맥락은 원문을 확인하세요.

요약 오류, 출처 표기 문제, 삭제 요청은 문의 · 건의로 알려주세요.