Spring ‐ Reactive Programming - dnwls16071/Backend_Study_TIL GitHub Wiki
📚 비동기 처리
- Kafka를 다루면서 비동기 프로그래밍을 덤으로 적용해보려고 했다. 그 과정에서 배웠던 비동기 프로그래밍에 대해 정리해보려고 한다.
- 비동기 처리는 특정 작업이 다른 작업과 독립적으로 동작하도록 하여 다음 단계 작업이 이전 단계 작업 완료를 기다리지 않고 동시에 실행할 수 있도록 하거나 특정 작업의 완료를 기다리는 동안 다른 작업을 처리할 수 있는 장점이 있다.
- 흔히 사용하는 방식은 동기적 처리로 한 작업이 완료되기를 기다렸다가 다음 작업을 순차적으로 실행하도록 구현하는 방식이고 비동기 처리는 여러 작업이 동시에 실행될 수 있고, 다른 작업의 완료를 기다리지 않고 실행하여 시스템의 자원을 최대한 활용할 수 있는 방식이다.
- 비동기 처리를 통해서 성능 향상, 시스템 활용도 증가, 동시성 관리, 자원 활용 등의 장점을 누릴 수 있으나 복잡성 증가, 디버깅 어려움, 가독성 감소와 같은 단점을 고려할 필요가 있었다.
📚 CompletableFuture
- Java5부터 Future 인터페이스는 비동기 연산을 위해 추가되었지만 몇 가지 문제점을 가지고 있다.
- 여러 연산을 결합하기 어렵다.
- 비동기 처리 중 발생하는 예외 처리가 어려운 문제
- 이러한 Future 인터페이스 문제를 개선한 CompletableFuture 클래스가 Java8에 등장했다.
- CompletableFuture 클래스는 Future 인터페이스를 개선하기 위해 등장한 만큼 여러 연산을 결합한 비동기 연산 처리, 예외 처리 등을 위한 50가지의 다양한 메서드들을 제공하고 있다.
Future | CompletableFuture |
---|---|
Blocking(동기식) | Non-Blocking(비동기식) |
여러 연산 연결 어려움 | 여러 연산 연결 가능 |
여러 연산 결합 어려움 | 여러 연산 결합 가능 |
연산 성공 여부만 확인 가능하고 예외 처리가 어려움 | exceptionally(), handle() 통한 예외 처리 |