리액티브 프로그래밍

Posted by 엘키의 주절 주절 on June 22, 2018

리액티브 프로그래밍에 대해 간단히 설명하자면, 다음과 같은 특징과 가치를 모두 보유한 시스템을 의미한다.

Reponsive (Future Pattern) : 요청 즉시 응답을 준 뒤, 실제로 완료하고 나서 다시금 응답한다.

Elastic: 결합도가 뭉텅이 작업이 아닌, 작은 동작의 조합으로써 하나의 큰 로직을 구현함으로써, 확장성있게 시스템을 구축하는 데에 목표가 있다.

Resilent : 상태를 갖지 않으므로, 회복 탄력성과 응답성을 가질 수 있다.

Message-driven (Reactor Pattern) : 메시지 기반으로 동작함으로써 클래스간 결합도는 존재하지 않는다. 자연스레 유연하고, 상태에 영향이 적어진다. 메시지를 처리 후에 삭제하므로, fail-over에도 강하다.

나는 처음 리액티브 프로그래밍이 비동기와 아주 큰 연관이 있을거라고 생각했다.

물론 연관이 없지 않다. 리액티브 프로그래밍이 구현되기 위해선 비동기 기법, 비동기식 동작이 반드시 필요하다.

하지만 내가 찾아본 바로는 리액티브 프로그래밍에서의 큰 가치는 비동기 데이터 흐름이 좀 더 큰 포커스였다.

“리액티브 프로그래밍(Reactive Programming)은 비동기 데이터 흐름(data flow)에 기반을 둔 프로그래밍 패러다임이다. 데이터 흐름은 마치 강과 같아서 이를 관찰하거나 필터링하거나 다룰 수 있으며 새로운 사용자를 위한 새로운 흐름을 만들기 위해 다른 흐름과 병합할 수도 있다.” (RxJava Essentials 21p) 

비동기 데이터 흐름을 만든다는 것은, 같은 input이 발생했을 때 같은 output이 발생해야하며, 그러기 위해선 가변 상태를 보유하지 않아야 한다는 점에서 함수형 프로그래밍 패러다임과 일맥 상통한다.

즉 언어는 함수형이 아니지만, 코딩은 함수형처럼 해야 리액티브 프로그래밍의 핵심 가치를 지킬 수 있다는 점이다.

[리액티브 시스템vs리액티브 프로그래밍] http://blog.lespinside.com/reactive-programming-versus-reactive-systems/

  • 2015년부터 특히 2016년에 상용 미들웨어 벤더사와 사용자 모두 리액티브에 대한 관심이 급격히 증가했다.
  • 구현 관점에서 리액티브 프로그래밍은 리액티브 시스템의 일부이다.
  • 리액티브 프로그래밍은 컴포넌트 수준에서 내부 로직과 데이터 플로우(flow) 관리를 위한 성능과 자원 효율성을 통해 개발자의 생산성을 높여준다.
  • 리액티브 시스템은 시스템 수준에서 “클라우드 네이티브”[1] 혹은 다른 대규모 분산 시스템을 구축하기 위한 복원성과 탄력성을 통해 아키텍트와 데브옵스의 생산성을 높여준다.
  • 리액티브 시스템의 컴포넌트 안에서 리액티브 프로그래밍을 사용하는 것은 매우 유용하다.
  • 리액티브 프로그래밍을 사용하여 작성한 컴포넌트들로 시스템을 만들 때 리액티브 시스템을 사용하는 것은 매우 유용하다.

리액티브 프로그래밍에 대해 알아보고자 했을 때, 리액티브 시스템 얘기가 함께 나왔다. 그래서 찾아봤던 부분인데, 리액티브 시스템은 리액티브 프로그래밍으로 이루어진 소프트웨어를 시스템 단위에서 리액티브하게 다룰 수 있고 운용 할 수 있는 환경을 의미하는 것으로 이해했다.

즉 GCP같은 PaaS레이어의 auto-scaling이라던지, docker swarm을 통한 scaleing, AWS등의 클라우드 서버에서의 트래픽에 따른 scaling이라던지하는 자동화 된 시스템 확장 축소를 리액티브 시스템이라고 지칭하는 것이더라.

이렇게 이해하고나니, 사실상 리액티브 프로그래밍의 맥락도 국지적 최적화 (in-process 최적화)를 벗어난, 높은 확장성을 통한 through-put 향상이 목표였음을 알 수 있다.

결국 핵심은 많은 데이터를 다루기 위한 접근이, bulk를 크게 구성해서라도 전체적인 through-put을 높이는 데에 있었음을 알 수 있고, 이 것이 현재의 패러다임이라는 생각이 든다.

내가 국지적 최적화의 관점에서 오래 코딩을 해온 시스템 프로그래머의 레이어에 오래있었음에도 이런 접근은 공감이 됐고, 실제로 더 많은 양의 데이터를 처리하기에 적합하다.

또한 굳이 대용량 처리를 말하지 않아도, 로직 처리에서도 빠른 응답에 대한 가치는 높다. 그래서 리액티브 프로그래밍이 화두가 되고 있지 않나 생각이 든다.