Home

[Ramda] 한 달간 함수형 프로그래밍을 구경하고 적용하면서

한 달간 함수형 프로그래밍을 구경하고 적용하면서

새로 이직해온 회사의 주요 스택은 Vue.js + Vuex + Ramda.js + Rx.js 이다.

여기서 가장 핵심은 함수형 프로그래밍을 베이스로하는 Ramda.js와 Rx.js이다.

이직 준비를 하면서 봤던 함수형 프로그래밍에 관한 내용은 대부분 철학에 관한 이야기였다.

예를 들어,

  • Immutable data, first class citizen으로서 함수를 적극 활용한다.

함수형 프로그래밍에 관한 글을 많이 읽어봤지만 기억에 남는건 위의 한 줄이었다.

새로 이직해온 곳이 함수형 프로그래밍 기반으로 코드가 작성되어있다고 했을때는 드디어 저 실체를 볼 수 있구나 하는 기대감을 갖게 했었다.

하지만 역시 새로운 건 쉽지 않다는 것이다.

내 눈앞에 있는건 이런 코드였다.

makeList: R.compose(
  R.filter(R.__, ['A', 'B', 'C']),
  R.flip(R.contains),
  R.map(R.prop('name')),
  R.filter(R.prop('value')),
  R.pathOr([], ['a', 'b', 'c'])
 ),

filteredValue: R.compose(
  R.map(([value] = []) => value),
  R.filter(R.prop(1)),
  Object.entries,
  R.dissoc(STATUS_ALL),
  R.prop('dataFilter')
 ),

이게 도대체 무엇인가..?

자동으로 긁적긁적 모션을 취하게 되었다.

이러한 코드들이 연속되는 레포지토리는 일종의 절망감을 안겨주었다.

하지만 역시 스타트업이기 때문에 나의 업무는 바로 시작되었다.

즉 Ramda.js와 함께하는 함수형 프로그래밍에 대한 입문이 시작되었다.

조그만 기능부터 하나씩 함수형 프로그래밍을 적용했다.

예를 들어,

computed에 단순히 깊은 뎁스를 조회하는 함수부터 시작해서

query: R.path(['$route', 'query']),

data의 상태를 바꿔주는 간단한 로직들까지

R.compose(
  R.forEach(el => (this.dataFilter[el] = false)),
  R.without(R.__, STATUS_LIST_EXCEPT_ALL)
)(filters);

조건문이나 그 외 복잡한 로직들에는 아직 적용하기는 힘들었지만 하나씩 적용해가면서 소소한 즐거움을 느낄 수 있었다.

좋았던 점은 확실히 for문을 여러번 돌거나 눈으로 볼때 지저분한 코드들을 한 두줄로 정리할 수 있었다는 점이다.

힘들었던 점은 Ramda.js의 세세한 스펙을 알지 못하면 쉽게 그리고 자주 에러를 만날 수 있다는 점이었다.

아직 동작 원리를 자세히 알지는 못하기 때문에 성능에 대해서는 평가를 할 수 없다.

하지만 분명 코드를 줄여주는데는 엄청난 기여를 하는 프로그래밍 방식이라는건 확실한 것 같다.

앞으로도 어려운 점이 많겠지만 하나하나씩 함수형으로 만들어가는 소소한(?) 재미 속에 회사 적응기는 더 스펙타클할 것 같다.

Published 2 Sep 2019

BK
BK

I'm front-end web developer, former brand marketer, interested in business-oriented and scalable development. Also, passionate marathoner.