비동기적 데이터 흐름을 처리하는 프로그래밍 기법
interface ShoppingCardService{
Output calculate(input value);
}
class OrderService{
private final ShoppingCardService scService;
void process(){
input input = ...;
Output output = scService.calculate(input);
... // 사후 처리 로직
}
}
ShoppingCardService가 HTTP요청이나 데이터베이스 쿼리와 같이 시간이 걸리는 I/O 작업을 실행한다고 가정하자. 위 코드에 대한 설명은 아래와 같다.
→ 정리하자면 OrderService로직을 처리하는 동안 스레드가 차단된다. 따라서 별도 독립적은 처리를 위해서는 스레드를 추가 할당해야한다. 다만 스레드 추가할당은 많은 비용이 들기때문에 손익을 잘 고려해야한다.
interface ShoppingCardService{
void calculate(input value, Consumer<Output> c);
}
class OrderService{
private final ShoppingCardService scService;
void process(){
Input input = ...;
scService.calculate(input, output ->{
... // 사후 처리 로직
});
}
}
→ OrderService는 작업 완료 후에 반응할 콜백함수를 전달한다. 이는 OrderService가 ShoppingCardService로부터 분리되었음을 의미하며, OrderService로 결과를 전달하는 함수형 콜백 호출을 위해 동기, 비동기 방식으로 calculate메서드를 구현할 수 있다.