직장에서 담당한 안드로이드 프로젝트에 함수형 프로그래밍 (이하 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으로 바꾸는 것이 불가피할 것이라는 생각이 든다… 이는 당장은 실현하기 어렵다.
지금 보기에 당장 현실적인 결론은 이렇다.
- 지금 프로젝트에서 Target SDK level 24 이상으로 맞추고 안드로이드가 지원하는 Java 8 만큼만 사용. 아마도 Lambda expression과 Method reference 정도겠지만 점진적으로 바꿔나간다는 생각으로.
- 나 스스로는 Kotlin을 좀 더 들여다본다. 당장 쓰지 못한다 해도 나의 다음 프로젝트를 위해 실력을 쌓아둔다.
엄청나게 야심찬 계획 : 일단 FP를 모르니까 Java 8과 Kotlin을 공부하고, 시간 되는 대로 RX에 대한 개념을 블로그 눈팅으로 쌓아가자.
- 당장은 도구의 부재를 탓하지 말고 기존에 있는 것을 가지고 FP와 RX가 지향하는 스타일로 코드를 작성하려 한다. 내가 읽은 intro-to-rx 블로그 글들은 모두 RX를 Push의 개념으로 설명하던데, 이러한 개념을 구현하는데에 반드시 RX에 특화된 도구들이 필요한 것은 아니다. Dependency에 도구를 추가하지 않으면서 필요시 간단하게 customize할 수 있으려면 (그걸로도 충분할지 어림짐작 할 수 있으려면) 내가 개념을 잘 알면 된다. 예: 목록화면과 상세화면 등 각 화면에서 업데이트 된 정보조회를 위해 API를 호출하는 것이 아니라 (pull) VS. 관련된 정보가 업데이트 되면 웹으로부터 푸쉬를 받아 처리할 수 있도록 푸쉬 인터페이스와 각 화면의 이벤트 발생 처리 동작을 규명해 놓는 것 (push).