https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Future.html

비동기 작업의 결과를 나타내는 객체. 멀티 스레드 환경에서 스레드가 작업 결과 공유. 결과를 받아오는 환경에서 활용됨. Java5 부터 지원. 작업 결과를 바로 받지 못하고 미래의 어느 특정 시점에 결과를 받을 수 있는 객체.

  • 외부에서 완료 불가
  • 블로킹 메서드(get()) 통해서만 이후의 결과 처리 가능
  • 여러 Future 조합 불가
    • 회원정보 가져오고, 알림을 발송 하는 등
  • 여러 작업 조합하거나 예외 처리 불가

위 한계때문에 CompleteableFuture 등장

Future Class의 한계점

Future API는 비동기 프로그래밍을 위한 도구인데, 위에서 언급된 내용들은 Future API가 가진 몇 가지 중요한 제약 사항들을 지적하고 있습니다. 하나씩 좀 더 자세히 풀어볼게요.

1. Futures cannot be completed manually (퓨처는 수동으로 완료할 수 없습니다)

Future는 ‘미래의 어떤 시점에 완료될 작업의 결과’를 나타내는 객체입니다. 일반적으로 어떤 비동기 작업(예: 네트워크 요청, 파일 읽기 등)이 시작되면 Future 객체가 생성되고, 그 작업이 완료되면 Future에 결과가 담기게 됩니다.

여기서 중요한 점은 Future의 완료는 해당 비동기 작업의 완료에 의해서만 결정된다는 것입니다. 우리가 임의로 “이 Future는 이제 완료된 것으로 처리해 주세요”라고 지정할 수 없습니다. 즉, 수동으로 Future의 상태를 완료됨으로 바꾸거나 결과를 설정할 수 없다는 의미입니다.

2. Actions cannot be performed until the result is available (결과가 나오기 전까지 어떤 행동도 할 수 없습니다)

Future의 주요 목적은 비동기 작업의 결과를 안전하게 가져오는 것입니다. 하지만 Future의 결과가 아직 준비되지 않았다면 (즉, 비동기 작업이 아직 완료되지 않았다면), 그 결과를 이용해서 어떤 특정 행동을 즉시 수행할 수 없습니다.

예를 들어, 웹 서버에서 사용자 정보를 가져오는 비동기 작업의 Future가 있다고 가정해 봅시다. 우리는 이 Future의 결과(사용자 정보)가 도착하기 전까지는 그 정보를 화면에 표시하거나 다른 계산에 사용하는 등의 행동을 할 수 없습니다. 결과가 준비될 때까지 기다리거나, 결과가 도착했을 때 실행될 코드를 미리 지정해두는 방식(콜백 등)을 사용해야 합니다.

3. Attaching a callback function is not possible (콜백 함수를 붙일 수 없습니다)

콜백 함수는 비동기 작업이 완료되었을 때 특정 코드를 실행하고 싶을 때 사용되는 패턴입니다. Future API의 기본적인 설계에는 작업이 완료되었을 때 실행될 함수(콜백)를 Future 객체에 직접 연결하는 기능이 없습니다.

다른 비동기 프로그래밍 모델에서는 Future나 Promise와 유사한 객체에 .then()과 같은 메서드를 사용하여 작업 성공 시 실행할 콜백 함수를 등록할 수 있지만, 여기서 설명하는 Future API에는 그런 기능이 없다는 의미입니다.

4. Multiple Futures cannot be chained together (여러 개의 퓨처를 함께 연결할 수 없습니다)

비동기 작업이 순차적으로 이루어져야 하는 경우가 많습니다. 예를 들어, 첫 번째 API 호출의 결과를 바탕으로 두 번째 API 호출을 해야 하는 상황이죠. 이런 경우, 이전 작업의 Future가 완료된 후 다음 작업을 시작하는 ‘Future 체이닝’이 필요합니다.

하지만 이 Future API에서는 여러 개의 Future를 순차적으로 연결하여 이전 작업의 결과를 다음 작업에 넘겨주는 등의 흐름을 쉽게 구현할 수 없습니다. 각 Future의 완료를 개별적으로 처리해야 하므로, 순차적인 비동기 흐름을 관리하기가 복잡해질 수 있습니다.

5. Multiple Futures cannot be combined together (여러 개의 퓨처를 함께 결합할 수 없습니다)

여러 개의 비동기 작업이 동시에 실행되고, 이 모든 작업이 완료된 후에 어떤 작업을 수행해야 하는 경우가 있습니다. 예를 들어, 여러 곳에서 데이터를 가져와서 이 데이터를 모두 합쳐서 보여줘야 하는 상황입니다. 이런 경우, 여러 Future의 완료를 기다렸다가 결과를 하나로 합치는 ‘Future 결합’ 기능이 필요합니다.

하지만 이 Future API에서는 여러 개의 Future가 모두 완료될 때까지 기다리거나, 그 결과를 모아서 처리하는 기능을 직접적으로 제공하지 않습니다. 여러 Future의 상태를 개별적으로 확인하고 관리해야 하므로, 병렬적인 비동기 작업의 결과를 처리하기가 번거로울 수 있습니다.

6. There is no Exception handling in the Future API (Future API에는 예외 처리가 없습니다)

비동기 작업은 언제든지 실패할 수 있습니다. 네트워크 문제, 서버 오류, 파일 접근 오류 등 다양한 이유로 작업이 정상적으로 완료되지 못할 수 있죠. 따라서 비동기 작업의 결과를 다루는 API는 작업 실패 시 발생하는 예외를 처리하는 메커니즘을 제공하는 것이 중요합니다.

하지만 이 Future API에는 비동기 작업 중에 발생한 예외를 Future 객체를 통해 안전하게 전달하고 처리할 수 있는 기능이 없습니다. 예외가 발생하면 프로그램이 예상치 않게 종료되거나, 오류를 제대로 처리하지 못할 위험이 있습니다.

요약하자면, 이 설명에서 언급된 Future API는 기본적인 비동기 작업의 결과를 나타내는 데는 유용할 수 있지만, 더 복잡하고 정교한 비동기 프로그래밍 패턴(순차적 실행, 병렬 실행, 오류 처리, 콜백 등)을 구현하기에는 여러 가지 제약이 있다는 것을 의미합니다. 이러한 한계점들은 개발자가 비동기 코드를 작성하고 관리하는 데 어려움을 줄 수 있습니다.