함수형 프로그래밍 (+ RX) 해보고 싶은데

직장에서 담당한 안드로이드 프로젝트에 함수형 프로그래밍 (이하 FP) 스타일을 적용하면 어떨까 생각하고 있다. 짧은 식견이지만 함수형 프로그래밍 스타일 + RX Android는 유행을 넘어 안드로이드 개발 표준으로 자리잡은 듯 하다. 장점으로는 코드를 간결하게 작성할 수 있고 이벤트 발생시 처리를 쉽고 효율적으로 구현할 수 있다고 하던데, 역시 구체적으로 어떻게 도움이 될지는 사용해 봐야지 알 것 같다.

그래서 첫 걸음으로 Java 8에 새로 추가된 함수형 프로그래밍을 지원하는 API들을 들여다 보고 있었는데… 알고보니 안드로이드가 아직 이 모든 API를 지원하지는 않더라고 (더 정확하게는 제한적으로 – 참조). 이런 안드로이드 개발환경에서 FP스럽게 코드를 작성할 수 있도록 도와주는 도구들을 찾아보고 프로젝트에 적용해 보려고 시도했었다. 닷새동안 하루 2시간 씩 투자한 것 같은데 아직도 까리하다 (참고로 나는 RX는 커녕 FP도 잘 모르는 왕초보이다 – 그래서일지도).

  • Retrolambda: Java8에서 제공하는 모든 API가 지원되지 않는다고 해서 시도조차 하지 않았다. Java8 조차도 제한적인 FP를 지원한다고 하던데, Retrolambda만 가지고 충분히 FP의 장점을 살리며 프로그래밍할 수 있을까? (찾아보니 이왕 FP를 제대로 할거면 Kotlin을 추천하더라.)
  • Kotlin: 한 프로젝트 내에서 Java 코드와 공존할 수 있고, IntelliJ가 개발하는 언어이고, 배우기도 비교적 쉬운 함수형 프로그래밍 언어라고 한다. 자바에서는 개발자가 작성한 Lambda Expression이 클래스로 전환되지만 Kotlin은 그렇지 않은 듯 하다. 언어가 production code 제작에 사용될 수 있을 많큼 성숙하다던데, 지금의 프로젝트에 적용을 해보려 하니 왜그리도 에러가 발목을 잡던지 ㅠㅠ.
    내가 한 시도는 옛날 옛적에 구현되어 공통으로 사용되는 “공통 부분”은 Java 코드 그대로 남기고, 공통을 바탕으로 개발자들이 각 메뉴에 맞게 customize 하는 부분 들을 Kotlin으로 변환하려 한 것이었다. 다시 생각해 보면 Kotlin은 Java에 비해 Null Check, 변수 상수 구분, 등 더 까다로운 Syntax를 요구하기 때문에 공통을 Kotlin으로 바꾸는 것이 불가피할 것이라는 생각이 든다… 이는 당장은 실현하기 어렵다.

지금 보기에 당장 현실적인 결론은 이렇다.

  1. 지금 프로젝트에서 Target SDK level 24 이상으로 맞추고 안드로이드가 지원하는 Java 8 만큼만 사용. 아마도 Lambda expression과 Method reference 정도겠지만 점진적으로 바꿔나간다는 생각으로.
  2. 나 스스로는 Kotlin을 좀 더 들여다본다. 당장 쓰지 못한다 해도 나의 다음 프로젝트를 위해 실력을 쌓아둔다.

엄청나게 야심찬 계획 : 일단 FP를 모르니까 Java 8과 Kotlin을 공부하고, 시간 되는 대로 RX에 대한 개념을 블로그 눈팅으로 쌓아가자.

  • 당장은 도구의 부재를 탓하지 말고 기존에 있는 것을 가지고 FP와 RX가 지향하는 스타일로 코드를 작성하려 한다. 내가 읽은 intro-to-rx 블로그 글들은 모두 RX를 Push의 개념으로 설명하던데, 이러한 개념을 구현하는데에 반드시 RX에 특화된 도구들이 필요한 것은 아니다. Dependency에 도구를 추가하지 않으면서 필요시 간단하게 customize할 수 있으려면 (그걸로도 충분할지 어림짐작 할 수 있으려면) 내가 개념을 잘 알면 된다. 예: 목록화면과 상세화면 등 각 화면에서 업데이트 된 정보조회를 위해 API를 호출하는 것이 아니라 (pull) VS. 관련된 정보가 업데이트 되면 웹으로부터 푸쉬를 받아 처리할 수 있도록 푸쉬 인터페이스와 각 화면의 이벤트 발생 처리 동작을 규명해 놓는 것 (push).