들어가며
Spring Cloud Gateway를 공부하던 중 SCG는 Spring webFlux로 동작한다는 사실을 알게 되었다. 그럼 Spring webFlux가 뭐지?
Spring webFlux는 Spring 5에서 새롭게 추가된 모듈로 client, server에서 reactive 스타일의 어플리케이션 개발을 도와주는 모듈이라고 한다.
non-blocking에 reactive stream을 지원하며 Spring MVC의 Tomcat과 달리 Netty를 사용한다고 한다.
Netty의 공식홈페이지에 가면 다음과 같이 설명하고있다.
Netty는 유지 관리 가능한 고성능 프로토콜 서버 및 클라이언트의 신속한 개발을 위한 비동기 이벤트 기반 네트워크 애플리케이션 프레임워크입니다.
비동기(async), non-blocking?? 기존부터 많이 들었지만 정확히 어떤 차이인지 몰라 크게 혼동이 왔다.
때문에 정확히 어떤 차이가 있는지 짚어보고자 글을 쓴다.
Blocking / Non-Blocking
Blocking과 Non-Blocking은 다른 주체가 작업할 때 자신의 제어권이 있는지 없는지로 구분한다.
- Blocking : A 함수가 B 함수를 호출할 때, B 함수가 자신의 작업이 종료되기 전까지 A함수에게 제어권을 돌려주지 않는 것
- Non-blocking : A 함수가 B 함수를 호출할 때, B 함수가 제어권을 바로 A 함수에게 넘겨주면서, A 함수가 다른 일을 할 수 있도록 하는 것.
Sync / Async
Sync와 Async는 작업완료여부를 호출한 함수가 신경 쓸 것인지, 호출된 함수(callback)가 신경쓸 것인지로 구분한다.
- Sync : 호출한 함수가 작업의 완료를 신경 쓴다.
- Async : 호출된 함수(callback)가 작업의 완료를 신경 쓴다.
Sync, Async, Blocking, Non-blocking의 혼용
Sync-Blocking 모델과 Async-Nonblocking 모델은 Java나 Javascript의 동작으로 흔하게 접하고 있기에 그림으로 충분히 이해가 될 것이다.
Sync-NonBlocking
해당 모델은 이해하기 어려울 수 있다. 하나씩 개념을 되짚어보자.
- Non-blocking : 호출을 한 함수가 호출된 함수에게 제어권을 주고난 다음 거의 동시에 호출을 한 함수에게 다시 넘겨준다.
- Sync : 호출을 한 함수가 호출이 된 함수의 작업완료여부를 신경을 쓴다.
즉, 호출을 한 함수는 제어권을 다시 돌려받고 자신의 작업을 계속해서 진행하지만 동시에 호출한 함수의 작업완료여부를 계속적으로 신경 써야 한다.
Async - Blocking
- Blocking : 호출을 한 함수가 호출이 된 함수가 완료될 때까지 제어권을 돌려받지 못한다.
- Async : 호출된 함수가 작업완료 여부를 호출을 한 함수에게 알려준다.
즉, 호출을 한 함수는 제어권을 받지 못해 대기하고 있고 호출된 함수는 작업 완료 여부를 작업이 끝났을 때 알려주게 된다.
이 조합은 어차피 다른 일을 못하므로 일부러 사용하는 경우는 없다.
참고 자료 :
https://www.inflearn.com/news/72620
'백엔드 > etc' 카테고리의 다른 글
[우아한 테크 세미나] 제어할 수 없는 것에 의존하지 않기 (1) | 2023.05.21 |
---|---|
AMQP(Advanced Message Queing Protocol) (0) | 2023.05.19 |
Cross-Origin Resource Sharing (CORS) (0) | 2023.05.15 |