[Java Web] (1) WebFlux 체험 하기
학습데이터를 NLU에 전송을 할때 비동기로 처리해야할 필요가 생겼다.
이전에 RestTemplate는 스프링 5 (스프링 부트 2.x) 대 버전 부터 AsyncRestemplate의 지원을 중단 하였다.
그렇기에 spring boot에서 비동기 요청을 하기 위해선 WebFlux를 사용해야 한다.
물론 위의 목적이 다라면, 편법으로 Thread를 사용해서 처리하는 방법도 있다.
이 포스팅에선 해당 방법과 Reactive Programming 그리고 WebFlux에 대해 알아보도록 한다..
0.목차
- Reactive Programing
- Reactive Programing 이란
- Async와 Observer
- Callback 보다 Observer
- Thread Runnable
- Reactive Streams 라이브러리
- WebFlux
- Mono
1. Reactive Programming
1-1. Reactive Programing 이란
Reactive Programming 한줄 요약
Reactive Programming is programming with asynchronous data stream
리엑티브 프로그래밍이란 비동기적 데이터 흐름을 처리하는 프로그램이다.
Reactive Programming 이란, 데이터 흐름과 전달에 관한 프로그래밍 패러다임이다.
우리는 주로 알고리즘 문제와 같이 절차를 명시하여 순서대로 실해되는 Imperaive Programming (명령형 프로그래밍)을 한다.
반면 Reactive Programming이란 데이터의 흐름을 머저 정의하고 데이터가 변경되었을 떄 연관된 작업이 실행이 된다.
즉 프로그래머가 어떠한 기능을 직접 정해서 실행하는것이 아닌, 시스템에 이벤트가 발생했을때 알아서 처리가 되는 기능이다.
기존의 프로그래밍 방식을 Pull 방식, Reactive 프로그래밍을 Push 방식이라고 한다.
- Pull 방식은 데이터를 사용하는 곳 (Consumer) 에서 데이터를 직접 가져와 사용한다.
- Push 방식은 데이터의 변화가 발생한 곳에서 새로운 데이터를 Consumer에게 전달한다.
따라서 Reacive 프로그래밍은 주변 환경과 끊임없이 상호작용을 한다. 다만 프로그램이 주도하는 것이 아닌, 환경이 변함에 따라 이벤트를 받아 동작함으로써 상호작용한다.
1-2. Async와 Observer
위에서 언급하였듯, Reactive Programming의 핵심은 비동기 (Async) 이벤트 와 Observer 디자인 패턴 이다.
먼저 비동기 (Asynchronous) 이벤트란 프로그램에서 다양한 작업들이 동시에 수행되는 중에 어떤 작업이 완료되는 것과 같은 이벤트를 말한다. 앱에서 발생하는 비동기적인 이벤트는 정말 다양하다. 앱과 서버는 서로에게 끊임없이 정보를 요구하고 주고 바덱 되며 이 과정에서 유저의 인터페이스를 방해하지 않고 뒷단에서 데이터를 가져오는 작업이 바로 비동기 적인 작업이라 할수 있다. 요청한 데이터를 모두 가져오게 되면, 앱이나 서버가 ‘요청한 정보를 다 가져왔다’라는 정보를 __통보__하는 것이 비동기적인 이벤트가 발생한 것이라 할수 있다.
Reactive Programming을 위해 유저가 입력할 떄마다 즉각적으로 반응하려면, 프로그램이 지속적으로 값을 관찰 해야한다. 값에 변화가 일어날 때마다 특정 연산이 수행이 되어야 하고, 이러한 관찰 패턴을 Observer 패턴이라고 한다. 비동기 이벤트를 처리하는 Reactive Programming 에선 이것이 근간이 된다.
Reactive Programming 에서는 관찰(observe) (listen) 이라고 하기도 하지만 해당 스트림에 가입(Stream) 한것이라 표현하기도 한다.
1-3. Callback 보다 Observer
비동기 이벤트를 처리하기 위해선 Observer 대신 Callback 을 쓰는것도 가능하다. Callback은 함수의 인자에 들어간 함수로서, 본 함수의 작업이 완료된 다음 인자에 들어간 함수를 호출하는 방식으로 이벤트를 처리할 수 있다.
실제로 대부분 Async 작업을 처리하는 메서드들은 Callback 구조로 되어 있다. 하지만 Callback 을 토앟ㄴ Async 작업은 굉장히 복잡한 구조가 될 소지가 있다.