Closed KATEKEITH closed 8 months ago
입출력 처리는 시작만 해둔 채 완료되지 않은 상태에서 다른 처리 작업을 계속 진행할 수 있도록 멈추지 않고 입출력 처리를 기다리는 방법을 말한다.
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 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;
}
function 호출자 (){
// 1. 호출자 함수가 처음에 제어권을 갖고 있다.
function A()
// 2. A 함수를 호출하면 제어권을 A에게 넘긴다.
// 4. A의 리턴값과 함께 제어권을 넘겨받은 호출자는 그제서야 함수 B를 실행할 수 있게 된다.
function B()
function C()
}
function A(){
/*엄청난 로직*/
// 3. 제어권을 넘겨 받은 A는 안에서 로직을 처리한 뒤 리턴하면 값과 함께 제어권을 다시 넘긴다.
return Sth;
}
프로그래밍에서의 동기란 동시에 일어난다는 뜻으로, 이는 요청하는 함수와 응답하는 함수 간의 데이터 동기를 한다는 의미를 가진다. 작업의 단위 (Transaction)을 동기화하면 Sync, 동기화하지 않는다면 Async이다.
동기는 처리되는 작업의 요청과 결과가 한 자리에서 일어난다. 즉, 현재 처리되고 있는 작업의 요청이 모두 완료하여 응답을 리턴한 후에 다음 작업을 처리할 수 있다.
이 때, 동기는 호출하는 함수가 호출된 함수의 작업이 완료되었는지를 계속 신경쓰고 있다.
반대로, 비동기는 호출하는 함수가 호출된 함수의 작업 완료 여부를 신경쓰지 않는다. 호출하는 함수는 함수를 호출할 때 callback 함수를 같이 전달하고, 작업이 완료되면 callback 함수가 실행된다. 즉, 호출된 함수가 수행결과와 종료를 직접 신경쓰고 처리한다.
그럼 WebFlux가 왜 생겼냐??
더 적은 스레드와 더 적은 하드웨어 리소스로 동시성 문제(concurrency)를 non-blocking 웹 스택으로 해결하기 위해서
Servlet 3.1에서도 non-blocking I/O를 지원하는 API를 제공하는 반면, 사용하게 되면 다른 Servlet API(Filter, Servlet, getParamter, getPart 등)를 사용하기 어렵다. 하지만 여러 서버들은 Netty 같은 비동기, non-block으로 잘 구성되어 있기 때문에 서버 runtime에서 non-block 기반 새로운 API를 제공할 필요성이 생겼다.
또 한 가지 이유는 함수형 프로그래밍. WebFlux는 Java 8에서 기존 어노테이션 컨트롤러와 함수형 웹 엔드포인트 두 가지 선택권을 부여함으로써 더 좋은 프로그래밍 모델을 만들수 있게 된다.
==================================================================================
MVC (Servlet)
WebFlux(Reactive)