소프트웨어 전문지 마이크로소프트웨어 394호는 클라우드(Cloud)와 백엔드(Back-End)를 주제로 담았습니다. RxJava, 데브옵스, PaaS, 마이크로서비스 아키텍처 등 마소 394호의 주요 기사들을 IT조선 독자에게도 소개합니다. [편집자주]

RxJava는 자바 개발자에게 항상 뜨거운 감자다. 강력한 기능을 제공하지만 배우기 어렵다는 생각이 널리 퍼져있기 때문이다. RxJava는 비동기 라이브러리다. 기존 자바에는 Java 5부터 ‘java.util.concurrent’ 패키지가 제공돼 단순히 스레드를 만들지 않고도 비동기 처리에 많은 발전을 이뤘다. 하지만 여전히 비동기 프로그래밍은 어렵다. 두꺼운 자바의 기본서도 ‘concurrent’ 패키지에 대해서는 자세히 다루지 않는다.

모든 자바 개발자가 고난도 비동기 상황을 만나는 것은 아니다. 예를 들어 WAS 같은 컨테이너를 쓰거나 좋은 라이브러리를 사용하거나 RDBMS 같은 데이터베이스를 적절히 배치하면 클라이언트 사이드에서는 비동기 상황의 많은 부분을 컨테이너에 위임할 수 있다. 이때는 소위 엔지니어링 이슈보다 순수 비즈니스 로직에 집중해야 한다.

하지만 서버 사이드는 다르다. 많은 솔루션을 활용하지만, 여전히 대형 쇼핑몰 같은 프로젝트의 경우 아키텍처나 모듈화 설계를 통해 많은 부분의 비동기성을 고려해야만 한다. 나는 서버 사이드 개발자가 아니라 많은 부분을 논할 수 없지만 개발자 커뮤니티를 통해 많은 사례를 접할 수 있었다. 한편으로 이런 어려움이 SW 엔지니어로서 자부심을 주기도 했다.

이제 RxJava에 대해 좀 더 알아보도록 하자. RxJava 홈페이지(reactivex.io)는 RxJava를 시작하기 전에 꼭 들어가보자. Rx(Reactive Extension)는 자바 이외에도 RX(C#), RxJS(자바스크립트), RxCpp(C++) 등 많은 언어를 지원한다. 같은 패러다임을 공유하고 있기 때문에 한 가지를 알게 되면 다른 언어로 작성된 코드도 쉽게 이해할 수 있다.

리액티브X 홈페이지. / 마이크로소프트웨어 394호 발췌
리액티브X 홈페이지. / 마이크로소프트웨어 394호 발췌
홈페이지에는 RxJava를 포함한 RX에 대한 간결한 정의가 있다. "An API for asynchronous programming with observable streams."

번역하면 옵저버블(Observable) 스트림을 활용한 비동기 프로그래밍 API다. 정의를 하나씩 뜯어보자. API는 Application Programming Interface의 약자로 응용 프로그램에서 호출할 수 있는 인터페이스를 의미한다. 그다음은 비동기 프로그래밍이다. 여기까지는 크게 새로운 의미가 아니다. 하지만 마지막 남은 단어가 우리의 머리를 아프게 한다. 도대체 ‘옵저버블 스트림’이 뭔가?

옵저버블 스트림. 두 단어를 한 번에 이해하기에 앞서 분할 정복(Divide and Conquer)기법을 위해 옵저버블과 스트림이라는 두 단어로 나눠본다.

스트림은 무언가 흐른다는 의미다. 전통적으로는 파일을 열 때 ‘InputStream’ 클래스를 사용했다. 전체 파일을 바이트 단위로 나눠서 읽는 역할을 한다. 2013년에 발표한 Java 8에서는 ‘Stream API’를 제공하면서 일반적인 로직으로 개념이 확장됐다. ‘for’, ‘if’, ‘while’ 등의 제어문을 사용하지 않고도 ‘map’, ‘filter’, ‘reduce’와 같은 함수형 프로그래밍(functional programming) 도구를 사용할 수 있게 됐다.

이제 옵저버블에 대해 알아보자. 옵저버블은 스트림과 비슷하지만 주어지는 데이터가 시간(비동기성)을 담고 있다. <코드1>에서 ‘widgets’는 코드 내에 이미 마련돼 있지만, 옵저버블 스트림의 경우 위젯 데이터가 당장 오지 않아도 되고, 데이터가 들어오면 그때 처리할 수 있다.

유동환 필자의 ‘RxJava로 생각하기’에 대한 자세한 내용은 ‘마이크로소프트웨어 394호(https://www.imaso.co.kr/archives/3939)’에서 확인할 수 있다.


관련기사