본문 바로가기

개발/Spring

#1) Spring WebFlux (함수 호출 관점 동기/비동기 Blocking/Non-Blocking, 함수형 인터페이스, WebFlux 장점)

함수 호출 관점에서 동기와 비동기 / Blocking과 Non-Blocking

- 함수가 다른 함수를 호출 하는 상황일 때

  • caller: 호출 하는 함수
  • callee: 호출 당하는 함수
  • 동기: caller는 callee의 결과에 관심이 있고 callee가 주는 결과 값을 이용해서 다음 action을 수행한다. 
  • 비동기: caller는 callee의 결과에 관심이 없고 callee는 결과 값을 이용하여 콜백을 수행한다.

 

  • Blocking: callee를 호출 후, callee가 완료되기 전까지 caller는 아무것도 할 수 없다. 즉 제어권을 callee에게 줌, caller와 다른 별도의 스레드가 필요하지 않다.
  • Non-Blocking: callee를 호출 후, callee가 완료되기 전에도 caller는 다른 업무를 수행할 수 있다. 즉 제어권을 caller가 그대로 가지고 있음. caller와 다른 별도의 스레드가 필요하다.

 

  동기 비동기
Blocking caller는 callee를 호출 후 아무것도 할 수 없는 상태가 되고 결과값을 받으면 직접 처리한다. caller는 callee를 호출 후 아무것도 할 수 없는 상태가 되고 결과는 callee가 처리한다.
Non-Blocking caller는 callee를 호출 후 다른 일을 할 수 있다. 결과값을 받으면 직접 처리한다. caller는 callee를 호출 후 다른 일을 할 수 있다. 결과는 callee가 처리한다.

 

 

 

 

함수형 인터페이스

- java8부터 함수형 프로그래밍을 지원하기 위해 함수형 인터페이스 도입

- 1개 이상의 추상 메서드를 갖고있는 인터페이스 (@FunctionableInterface)

- 함수를 1급 객체로 사용할 수 있다 : 함수를 변수에 할당하거나 인자로 전달하거나 반환값으로 사용 가능

- Function, Consumer, Supplier, Runnable 등

- 함수형 인터페이스를 구현한 익명 클래스를 람다식으로 변경 가능

- 호출한 쓰레드에서 실행된다. (메인 쓰레드에서 실행하면 메인 쓰레드에서 실행)

 

Spring WebFlux의 장점

- 효율적인 리소스 사용 : 적은 cpu로 많은 처리를 할 수 있다. 요청이 스파크하게 들어와도 유연하게 커버할 수 있다.

- 동시성을 극대화하여 응답시간이 빠른 서비스를 제공할 수 있다.

- 성숙한 생태계가 형성되어 있다.

 

단점

- 비동기 로직에 대한 처리 고민

- 팀원들과 함께 적용하기 위한 러닝커브가 있다.

- 디버깅, 에러 핸들링이 어렵다.



 

출처 : 패스트캠퍼스 강의(Spring Webflux 완전 정복 : 코루틴부터 리액티브 MSA 프로젝트까지)

 

 

 

반응형