패리어드
502
2020-01-10 14:35:47 작성 2020-01-13 16:35:16 수정됨
3
3449

Java 에서 비동기를 어떻게 구현해볼 수 있을까?


"자바에서는 비동기를 어떻게 구현할까" 에 대해서 고민한 부분을 간단히 정리하고 예제 코드를 공유하려고 합니다.


이곳에서 설명 및 예제 코드를 확인할 수 있습니다.


비동기 호출을 구현하기 위해서는 어쩔 수 없이 쓰레드를 사용해야 하지 않을까? 라는 생각으로 관련된 정보를 정리해보았습니다.


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 FutureCallback 을 사용해 비동기적인 구성을 자연스럽게 최적화하고
예외처리할 수 있도록 도와주는 클래스 입니다.

비동기에 대한 개념을 추상적으로 이해하기 보다 실용적으로 이해하려면 어떻게 해야 
할까 고민중에 정리해보았습니다.

예제 코드는 위에 링크를 참고해주세요
9
8
  • 댓글 3

  • ljseokd
    336
    2020-01-10 15:20:23

    좋은 글 감사합니다.

    2
  • 앙앙이
    4k
    2020-01-11 09:16:23

    제가 코다 RPC 서버와 코다 RPC  서버 접속 API 를 만들면서


    nio selector 이용하여 비동기를 구현하였는데

    의도치 않게 비동기로 싱크 흉내낼때에는 'Future' 를 사용하였고

    비동기 그자체는 'Callback' 을 사용했네요.


    좋은 설명 감사합니다.

    0
  • kkey21a
    3k
    2020-01-16 11:46:47
    비주얼 세대답게 설명도 비주얼로~

    잘 설명해주신만큼 비주얼이 좋으실듯 
    0
  • 로그인을 하시면 댓글을 등록할 수 있습니다.