brunch

You can make anything
by writing

C.S.Lewis

[RxJava] #2 안드로이드에서 처음 Rx코딩하기

들어가는 글: #1에서는 반응형 프로그래밍에 대한 개념을 알아봤습니다. 오늘은 Android Studio에서 간단한 예제를 만들어보면서 어떻게 쓸 수 있는지 알아보겠습니다. 


오늘 추석 당일이네요^^ 즐거운 추석되세요~ 


1. 새로운 프로젝트 만들기 


안드로이드에서 반응형 프로그래밍을 하려면 RxJava와 RxAndroid 라이브러리를 추가해야 합니다. 

예를 들어 androidrx 라는 프로젝트를 만들었다고 치고 

app 모듈의 build.gradle을 수정합니다. 


최신 버전은 항상 여기를 참조하세요 

https://github.com/ReactiveX/RxAndroid


app 모듈의 build.gradle에 rx 라이브러리 추가



이러면 모든 준비가 끝났습니다. 

안드로이드 스튜디오에서 코딩하시는 분들은 Gradle sync 한 번 해주셔야 합니다. Sync Now 클릭하세요.



위의 홈페이지에 따르면 rxandroid는 rxjava와는 다르게 안드로이드를 위한 일부 특수한 바인딩 기능만 제공하기 때문에 rxjava의 최신 버전을 잘 따라가라고 조언합니다. :-) 


안드로이드 개발자에게 RxAndroid는 RxJava와 거의 일심동체라고 생각하면 됩니다. 여기서는 편의상 둘을 구별하지 않고 RxJava라고 부르겠습니다. 



2. 세상에서 가장 간단한 Rx 예제 


세상에서 가장 간단한 Java 프로그램은 "Hello World" 라면 

세상에서 가장 간단한 Rx 프로그램은 "Hello World, Rx" 일 것입니다. 


Rx를 처음 코딩해보겠습니다. 두근두근.. 


HelloWorld의 소스 코드 

처음 생성되는 MainActivity.java 파일


activity_main.xml 파일도 수정하겠습니다. 

결과를 표시해줘야 하니까요. 

android:id="@+id/hello_text" 만 추가했습니다. 

결과를 표시할 TextView


나머지는 처음 생성되는 코드 그대로입니다.  




아차.. 이대로 Rx 코딩을 하면 아래와 같은 에러를 마주하게 됩니다. 

다시 app 모듈의 build.gradle을 변경합니다. 

추가된 부분은 붉은 색으로 표시하였습니다. 


3. Rx 처음 코딩하기 


우리의 목표는 Hello World! 를 Hello World! Rx! 로 변경하는 것입니다. 


코드는 아래와 같습니다. 

새로 추가된 부분은 붉은 박스로 처리하였습니다. 


실행 결과는 다음과 같습니다. 

Hello World! Rx! 실행 결과 




어.. 이게 반응형 프로그래밍이야? 

이렇게 생각하실 것 같습니다. 

겨우 이것을 가지고 거창하게 설명을 한 것이야? 


4. 좀더 알아보자 


반응형 프로그래밍은 크게 3부분으로 구성되어 있습니다. 

(기존의 책의 설명과는 조금 다를 수 있지만 제가 이해 한 내용으로 설명드립니다) 


1. input 부분: 이벤트가 시작되는 부분 

2. operators 부분: 이벤트를 가공하고 조합(compose) 하여 결과를 만드는 부분

3. output 부분: 가공한 결과를 출력하는 부분 


1) input은 어떤 것도 가능합니다. 


단순하게는 문자열, 배열, ArrayList<T> 등에서 

좀더 복잡하게는 사용자 이벤트, ListView와 같은 UI 컴포넌트, 서버와의 통신도 될 수 있습니다. 


2) operators 부분은 그것을 결과로 가공하는 것입니다. 


여기서 기존의 프로그래밍과 다른 부분이 보입니다. 

결과를 가공하는 코드가 기존의 for, if, while 와 같은 제어문이 아닙니다. 

제어문은 명령형 프로그래밍(imperative programming)의 구성 요소입니다. 


메소드 체이닝을 통해서 operators를 연속적으로 붙일 수 있습니다. 

그것을 조합(compose) 한다고 합니다. 


반응형 프로그래밍에는 기본으로 제공되는 operators의 갯수가 정말 많습니다. 

자세한 내용은 

http://rxmarbles.com/  (여기는 그림으로 설명해놓아서 이해하기가 좋습니다) 

http://reactivex.io/documentation/operators.html (모든 목록) 


중요한 것은 operators를 잘 아는 것이 아닙니다. 

중요한 것은 그것을 왜? 어디에? 써야 하는지를 아는 것입니다. 

혹은 쓰지 말아야 하는지? 입니다. 

 

보너스. 람다 표현식에 관하여 


위의 코드에서 람다 표현식이 쓰였습니다. 


TextView tv = (TextView) findViewById(R.id.hello_text);
Observable.just(tv.getText().toString())      
        .map(s -> s + " Rx!")                
        .subscribe(text -> tv.setText(text));  


여기에서 쓰인 람다 표현식은 크게 2 가지입니다. 


1) s-> s+ " Rx!" 

2) text -> tv.setText(text); 


람다 표현식은 Java8에 추가되었으며 익명 클래스를 축약식으로 표현해놓다고 보시면 됩니다. 

원래대로 쓴다면 각각은 아래와 같습니다. 



인간적으로는 이렇게 코딩을 해야 한다면 저는 반응형 프로그래밍을 하지 않을 것입니다. 

람다 표현식은 반응형 프로그래밍의 필수적이고 가장 기초적인 도구입니다. 


Java8에 와서야 도입되었다는 것은 정말 자바 개발자에게 슬픈일이라고 생각합니다. 

진작에 도입되었더라면 좋았을텐데요. 


3화를 기대해주세요 


오늘은 람다표현식과 세상에서 가장 간단한 Rx를 해봤습니다. 

이제 그 세부 내용을 조금씩 파보도록 하겠습니다. 


우리의 관심사는 오직 이것을 어디에 쓰지? 

이것이 안드로이드 실무에 어디에 좋지? 입니다. 


2016.9.15 @Home 

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari