본문 바로가기
개발/안드로이드

RxJava, RxAndroid 의 활용 - 1. Retrolambda

by darksilber 2017. 5. 30.
반응형

출처 - http://m.blog.naver.com/gracefulife/220822594190

 

이번에 공모전용 앱을 개발하면서 Rx를 처음 사용해보았다.
처음 사용했던 것임에도 불구하고 생산성 향상에 도움이 많이 되었는데,

이번에 프로젝트에 사용했던 코드를 중심으로 RxAndroid 와 기타 등등 
생산성 향상을 위한 라이브러리의 사용방법에 대해서 정리해볼 예정이다.

Rx 개념은 많은 포스팅에서 이미 다루고 있는 내용이라 생각되어 생략하고 ..
실제 프로젝트에 적용한 코드를 다뤄볼 것이다.

첫 글은 Retrolambda와 함께 비대한 자바 코드들에게 다이어트를 해주는 것, 
2부는 Rx를 활용한 레트로핏 사용
3부는 Rx를 활용한 파이어베이스 스토리지, 데이터베이스, Auth를 이용하여 
소셜 로그인 기능을 구현하는 것까지 다루려고 한다.

먼저 Rx(리액티브 프로그래밍)라는 개념이 생소하다면 아래의 글부터 정독하는 것이 좋다.

RxJava ? :
1.  https://realm.io/kr/news/rxandroid/



///////////////////////////////////////////////////////////////////////////////////////////////////////

자바에서 Rx를 사용하기 전에 람다식을 먼저 알아야한다고 생각한다.
람다가 빠진 Rx는 앙꼬없는 찐빵.. 그 이상

1.5 .. 1.6 ....대의 자바 프로젝트가 많은 우리나라에서는 
자바 프로그래머들에게 람다라는 것이 새롭게 느껴질 수도 있을 것이다.

또한 람다라는 개념을 익혀보려 해도 알 수 없는 수학기호 등과 함께 ..
언어적 의미에 대해서 구구절절 설명되어있는 많은 글들을 보면서
람다란 어려운 것이구나 .. 함수형 프로그래밍이란 어렵구나.라는 생각을 쉽게 할 수 있다.

하지만 람다란 사용하기 그렇게 어려운 개념은 아니다.
안드로이드 코드를 먼저 보고 얘기하자.

textView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(LaunchActivity.this, JoinActivity.class); startActivity(intent); } });

위의 코드는 특정 뷰의 클릭 이벤트를 받아서, 액티비티를 이동시키는 간단한 코드이다.
우리는 안드로이드 개발을 하면서
온갖 이벤트 리스너는 위의 방식으로 모두 구현하여야 하여야 했기 때문에 (클래스가 직접 구현할 수도 있으나 제외한다.)
이런 이벤트 처리 방식에 매우 익숙해져있다.

하지만 ..  내가 원하는 것은 단순한 액티비티 이동 기능뿐인데..
저런 쓸모없는 코드를 많이 써야 하는 것이 마음에 들지 않는다.

위에서 말한 쓸모없는 코드를 정의하자면, 실행하여야 하는 함수 하나를 넘기기 위해서
익명 클래스의 인스턴스를 생성해서, 메서드를 구현하여야 하는 행위이다.
우리가 필요한 것은 메서드를 구현하여, 클릭 이벤트가 일어났을 때 해당 메서드를 호출할 수만 있으면 되는 건데
왜 저렇게 번거롭게 하여야 하는가?

여태까지 우리는 왜 저렇게 해야 했냐면, 자바에서는 함수를 파라미터로 넘길 수 없는 문제 때문이다.
함수는 일급 객체로 어쩌고저쩌고 .. 시작하면 지루해지니 결론만 말하자.
이런 단순한 콜백 함수를 넘기는 과정을 자바 1.8부터는 람다식을 통해서 축약할 수 있게 되었다.

위의 코드를 람다식으로 축약해보면 아래와 같다.

textView.setOnClickListener(v -> { Intent intent = new Intent(LaunchActivity.this, JoinActivity.class); startActivity(intent); });

자세히 보면 .. 우리가 생성했던 익명 클래스에 대한 정보는 존재하지 않는다,
또한 메서드에 대한 정보도 매우 축약된 형태로 제공된다.

메서드 명 파라미터 타입도 존재하지 않고, 인자의 변수명만 정의를 하고 
-> 구문을 통해서 중괄호로 묶인 함수를 구현하면 된다.

v -> {

이 v에 무엇이 들어갈지는 자바가 타입을 추론해서 결정해준다.
이전에 View.OnClickListener ... 따위의 클래스명과 onClick 같은 메서드명을 제외해도 되는 이유다.

그럼 위의 코드를 적용해보자 .. 하고 자신의 프로젝트에 붙여보면 
당연히 동작하지 않는다.

안드로이드는 자바 1.8을 아직 부분적으로 지원하고 있으며.,  
람다식을 위한 백포트 라이브러리인 레트로 람다를 적용한 후에야 람다식을 사용할 수 있다.


라이브러리도 추가해야 하고, 딱히 좋아 보이지도 않는데
왜 람다식을 써야 하는 거야?라는 생각이 든다면, 장고를 해보자. django말고 ..

개인의 개발 방식에 따라 다르겠지만.. 보편적으로 우리는 이벤트를 받아서,
다른 비동기적인 작업을 추가로 진행하고, 또 그 작업이 실패되었는지 성공하였는지 여부에 따라서 다른 작업을 호출한다.

좀 심하게 말해서 이전의 방식으로 구현한다면 ..
첫 코드의 온 클릭 리스너를 생성하는 방법에서 온 클릭 메서드 안에 또 다른 익명 클래스 생성 및 콜백 메서드 구현 ..
등의 작업을 반복하여야 한다는 것이다.

이렇게 구현을 하는 경우 많은 문제가 생기는데 ..가장 큰 문제는 
소스 코드가 매우 보기 흉해진다. 라는 점과 에러 처리하기가 매우 까다로워진다는 점이다.
(레트로핏, Okhttp 등 비동기 호출 + 콜백을 지원하는 라이브러리를 우리가 어떻게 쓰고 있었나를 생각해보자.)
자바스크립트의 콜백 헬 은 약간 애교 느낌으로 보일 정도로.

우리는 기존 안드로이드 코드에서 보일러 플레이트 코드를 줄이는 것은 레트로람다를 통해서 해결하고,
비동기 작업이 복잡한 문제를 해결하기 위해 RxJava를 이용해 볼 것이다.
하여튼 Rx를 하기 전에 코드 먼저 다이어트를 해보자는 느낌으로 레트로람다를 먼저 적용해보자.

//////////////////////////////////////////////////////////////////////////////////////////////////////////

레트로람다의 깃허브 저장소는 아래의 주소로 접근할 수 있다.
https://github.com/orfjackal/retrolambda

우리 프로젝트에 적용하기는 매우 간단한데, 
먼저 모듈 레벨의 build.gradle 파일의 최상단에 아래의 구문을 추가하자.

apply plugin: 'me.tatarka.retrolambda' retrolambda { jvmArgs '-noverify' }

그리고 모듈 레벨의 build.gradle 파일에 원래 있던 android 속성 안에 buildTypes 속성이 끝난 후 (속성 안에 말고.. 끝난 후)
아래의 옵션을 추가한다.

compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 }

그 후 project 레벨의 build.gradle 파일을 열어서 classpath 에 retrolambda 를 추가하는 구문을 작성하면 된다.

buildscript { repositories { mavenCentral() jcenter() } dependencies { classpath 'com.android.tools.build:gradle:2.2.0' classpath 'me.tatarka:gradle-retrolambda:3.2.5' classpath 'com.google.gms:google-services:3.0.0' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } }

각자의 설정에 따라 위와 소스 코드가 다를 수 있는데 ..
핵심은 디펜던시의 클래스패쓰에 레트로람다를 추가하면 된다는 것이다.

위의 작업만 하고 그래들 빌드를 다시 진행해보면 ..
위의 코드처럼 람다식을 사용해도 컴파일 타임에서 에러가 나지 않는 것을 확인할 수 있다.

여기까지 진행됐으면 코드 다이어트의 1/3은 왔다! 
자세한 활용법에 대해서는 다음 글에서 다뤄보자 ..

Rx 2.0이 나왔다며 ? ..
2.0에 익숙해진 후로 연기 ..

반응형

'개발 > 안드로이드' 카테고리의 다른 글

CollapsingToolbarLayout  (0) 2017.05.31
Android ConstraintLayout  (0) 2017.05.31
Retrofit2 + okhttp3 + Rxandroid 사용법  (0) 2017.05.30
오픈 소스 라이브러리 쉽게 배포하기 - JitPack  (0) 2017.03.28
WebView Session 초기화  (0) 2017.02.20

댓글