함수형 인터페이스는 1개의 추상 메소드를 가지고 있는 인터페이스이다.
(Function, Consumer, Supplier, Runnable)
함수형 인터페이스는 1급 객체로 사용할 수 있어
1) 함수형 인터페이스에 변수를 할당
2) 함수형 인터페이스로 인자를 전달
3) 함수형 인터페이스를 반환값으로 사용
4) 함수형 인터페이스를 구현한 익명 클래스를 람다식으로 변경할 수 있다.
이 함수형 인터페이스는 호출한 Thread에서 실행된다.
이는 Bloking과 Nonbloking과 관련이 있다.
함수 호출의 관점에서 A -> B를 call 할 때, A -> B에서 B의 응답과정이 동기와 비동기로 나뉘는 요점이 된다.
즉 A -> B call 시에 A는 B가 어떤 결과를 반환하기까지 기다려야 하는 상황이면 블로킹 상태라고 하며
이 동안에는 Caller인 A는 아무것도 할 수 없는 상태이다.
블로킹 상태에서 동기처리가 되는 경우 Caller가 값을 받아 직접 처리하는 경우이며,
논블로킹 상태의 비동기처리는 결과 자체는 Callee가 처리하는 경우이다.
반면, A -> B call 시 B가 어떤 결과를 반환하기까지 기다리지 않고 다른 일을 할 수 있는 상황은 논블로킹 상태라고 하며,
논블로킹 상태의 동기처리가 되는 경우 Caller인 A는 계속 다른 일을 할 수 있으며
결과값을 받아 직접 처리하는 경우이고,
논블로킹 상태의 비동기 처리는 Caller인 A가 계속 다른일을 하다가 결과를 받아 직접 처리 하는 경우이다.
I/O 관점 Blocking/Non-bloking을 보면
CPU bound blocking
thread가 대부분의 시간동안 CPU를 점유하는 경우이다.
연산이 많은 경우로, 코어와 같은 하드웨어적인 부분을 증설해주는 수밖에 없다.
I/O bound blocking
thread가 대부분을 wait하고 있다가 읽기/쓰기, 네트워크 요청처리, 요청 전달 등으로 블로킹 되는 경우
I/O bound blocking이라고 한다.
근데 이런 I/O bound blocking의 경우, 여러 가지 일들이 중첩적으로 일어나는 경우 더 문제가 될 수 있다.
예를 들면 블로킹이 여러개 있다가 중간에 논블로킹 task가 있는데 중간의 블로킹에서 시간이 소요되는 경우
논블로킹 task가 끝나더라도 응답을 받을 수 없는 상태에 있어 결국 처리되지 못한다.
즉, 관계된 모든 함수들이 non-blocking이어야 non-blocking이 진정한 의미를 갖게 될 수 있다.
즉 Spring Reactive Web 측면에서 봤을 때에는 I/O bound blocking을 극복할 수 있는 무기가 된다.
'Spring Boot(JAVA)' 카테고리의 다른 글
6. Reactive - Reactor Schedulers (0) | 2024.04.05 |
---|---|
5. Reactive - Reactor와 연산자 (0) | 2024.04.04 |
4. Reactive - Spring MVC VS Webflux (0) | 2024.04.04 |
3. Reactive - Netty (0) | 2024.04.04 |
2. Reactive - CompletableFuture (0) | 2024.04.04 |