"자바에서는 비동기를 어떻게 구현할까" 에 대해서 고민한 부분을 간단히 정리하고 예제 코드를 공유하려고 합니다.
이곳에서 설명 및 예제 코드를 확인할 수 있습니다.
비동기 호출을 구현하기 위해서는 어쩔 수 없이 쓰레드를 사용해야 하지 않을까? 라는 생각으로 관련된 정보를 정리해보았습니다.
Java 라이브러리에서는 비동기를 구현하기 위해 Future 와 Callback 이라는 방식을 사용합니다.
Future 와 Callback
이 둘은 쓰레드를 생성하고 함수를 실행하여 사용 중인 쓰레드를 차단 없이 지속적으로 사용하려는 목적을 가집니다. 이때 결과값을 처리하는 방법에 따라 Future 와 Callback 으로 나눌 수 있을 것 같습니다.
Future
생성한 스레드에서 프로세스를 실행한 후 결과값을 공유자원에 저장하고 가져오는 방법입니다.
(자바는 1.5 버전부터 Future 를 사용할 수 있으며 FutureTask 라는 구현체를 제공합니다.)
일반적으로 메서드를 실행 후 공유저장소로 Future 인스턴스를 반환받도록 구현합니다.
반환받은 Future 에서 get() 메서드를 사용하면 앞으로 도착할 결과값을 기다렸다가 받아서 사용할 수 있
습니다. 이때 사용 중인 스레드는 차단됩니다.

Callback
생성한 스레드에서 프로세스를 실행 후 파라미터로 전달받은 callback 클래스의 메서드를 실행하는
방법입니다. 이때 메인 스레드는 차단되지 않고 본 작업을 계속 수행할 수 있습니다.

Future vs Callback
이 둘의 큰 차이점은 작업한 결과를 처리하는 대상이 누구인가 하는 점입니다.
만약 연산 결과를 주 실행 쓰레드에서 사용한다면 Future 를, 영향이 없다면 Callback 을 사용하면됩니다.
ListenableFuture
guava 는 이 둘을 혼합한 ListenableFuture 를 제공합니다. (스프링에서는 4.0부터 제공합니다)
이 방법은 작업이 완료되었을 때 실행되는 callback 을 나중에 등록할 수 있는 것이 핵심입니다.
생성된 스레드에서 프로세스를 처리 후 바로 실행하는 callback 과 달리 future 방식을 이용해
값을 보관하여 실행을 지연시킬 수 있습니다.
이를 통해 callback 함수를 별도로 추가할 수 있고 더 나아가 여러 작업들을 구성하여 사용할 수 있습니다.

CompletableFuture
CompletableFuture 는 완료될 것을 가정하여 인스턴스를 만들고 앞으로 진행할 작업들을 미리
예약하거나 예외처리하는 방법입니다.
ListenableFuture 와 의미적으로 비슷하지만 이런 작업들을 fluent 하게 처리한다는 점에서 다릅니다.
그 외에도 다음과 같은 장점이 있습니다.
- 비동기 작업 후 다음 작업 구성 시 동기 혹은 비동기로 처리하는 추가 메서드를 제공합니다.
- 여러개의 비동기 작업을 하나로 묶는 메서드를 제공합니다.
CompletableFuture 는 Future 와 Callback 을 사용해 비동기적인 구성을 자연스럽게 최적화하고
예외처리할 수 있도록 도와주는 클래스 입니다.
비동기에 대한 개념을 추상적으로 이해하기 보다 실용적으로 이해하려면 어떻게 해야
할까 고민중에 정리해보았습니다.
예제 코드는 위에 링크를 참고해주세요