KATEKEITH / TIL_log

📚 Today I Learned.
0 stars 0 forks source link

Spring MVC VS Spring Webflux #42

Closed KATEKEITH closed 8 months ago

KATEKEITH commented 9 months ago

그럼 WebFlux가 왜 생겼냐??

==================================================================================

MVC (Servlet)

WebFlux(Reactive)

KATEKEITH commented 9 months ago

Blocking / Non-blocking

입출력 처리는 시작만 해둔 채 완료되지 않은 상태에서 다른 처리 작업을 계속 진행할 수 있도록 멈추지 않고 입출력 처리를 기다리는 방법을 말한다.

I/O 처리를 하는 전통적인 방법은 I/O 작업을 시작하면 완료될 때까지 기다리는 방법이다.

기존에는 synchronous I/O 혹은 blocking I/O를 통해 I/O 작업을 진행하는 동안 프로그램의 진행을 멈추고(block) 기다리는 방식이 사용되었으나, 이는 수많은 I/O 작업이 있는 경우 I/O 작업이 진행되는 동안 프로그램이 아무일도 하지 않고 시간을 소비하게 만든다.

반면, Non-blocking I/O 방식을 사용하면 외부에 I/O 작업을 하도록 요청한 후 즉시 다음 작업을 처리함으로써 시스템 자원을 더 효율적으로 사용할 수 있게된다.

그러나 I/O 작업이 완료된 이후에 처리해야하는 후속 작업이 있다면, I/O 작업이 완료될 때까지 기다려야 한다.

따라서 이 후속 작업이 프로세스를 멈추지 않도록 만들기 위해, I/O 작업이 완료된 이후 후속 작업을 이어서 진행할 수 있도록 별도의 약속(Polling, Callback function 등)을 한다.

non-blocking

어떤 쓰레드에서 오류가 발생하거나 멈추었을 때 다른 쓰레드에 영향을 끼치지 않도록 만드는 방법들을 말한다

공유자원(메모리나 파일 등)을 사용하는 멀티 쓰레드 프로그래밍을 할 때, 특정 공유자원을 사용하는 부분에서 상호배제나 세마포어 등을 사용하여 여러 쓰레드에서 동시에 접근하지 못하도록 하는 전통적인 방법과 달리 Non-blocking algorithm을 사용하면 공유자원을 안전하게 동시에 사용할 수 있다.

function 호출자 (){
  // 1. 역시 호출자 함수가 처음엔 제어권을 갖고 있다.
  function A()
  // 2_1. A 함수를 호출하면 제어권을 A에게 넘겼다가 바로 다시 호출자에게 돌아온다.
  // 2_3. A의 리턴을 기다리지 않고 호출자 함수는 그대로 B를 C를 이어서 실행한다.
  function B()
  function C()
}
function A(){
  /*엄청난 로직*/
  // 2_2. 호출받은 A는 제어권없이 그래도 로직을 처리하고 리턴한다.
  // 3. 그렇다면 함수 A의 결과값은 어떻게 된걸까?
  return Sth;
}

blocking

function 호출자 (){
  // 1. 호출자 함수가 처음에 제어권을 갖고 있다.
  function A()
  // 2. A 함수를 호출하면 제어권을 A에게 넘긴다.
  // 4. A의 리턴값과 함께 제어권을 넘겨받은 호출자는 그제서야 함수 B를 실행할 수 있게 된다.
  function B()
  function C()
}
function A(){
  /*엄청난 로직*/
  // 3. 제어권을 넘겨 받은 A는 안에서 로직을 처리한 뒤 리턴하면 값과 함께 제어권을 다시 넘긴다.
  return Sth;
}
KATEKEITH commented 9 months ago

Sync / Async 는 호출된 함수의 종료를 호출한 함수가 처리하느냐, 호출된 함수가 처리하느냐의 차이다.

프로그래밍에서의 동기란 동시에 일어난다는 뜻으로, 이는 요청하는 함수와 응답하는 함수 간의 데이터 동기를 한다는 의미를 가진다. 작업의 단위 (Transaction)을 동기화하면 Sync, 동기화하지 않는다면 Async이다.

image

동기(Sync)

동기는 처리되는 작업의 요청과 결과가 한 자리에서 일어난다. 즉, 현재 처리되고 있는 작업의 요청이 모두 완료하여 응답을 리턴한 후에 다음 작업을 처리할 수 있다.

이 때, 동기는 호출하는 함수가 호출된 함수의 작업이 완료되었는지를 계속 신경쓰고 있다.

비동기(Async)

반대로, 비동기는 호출하는 함수가 호출된 함수의 작업 완료 여부를 신경쓰지 않는다. 호출하는 함수는 함수를 호출할 때 callback 함수를 같이 전달하고, 작업이 완료되면 callback 함수가 실행된다. 즉, 호출된 함수가 수행결과와 종료를 직접 신경쓰고 처리한다.

https://sujinhope.github.io/2021/06/13/Network-%EB%8F%99%EA%B8%B0vs%EB%B9%84%EB%8F%99%EA%B8%B0,-%EB%B8%94%EB%A1%9C%ED%82%B9vs%EB%85%BC%EB%B8%94%EB%A1%9C%ED%82%B9%EC%9D%98-%EC%B0%A8%EC%9D%B4.html