타입스크립트와 함수형 프로그래밍

서두

제목을 참 정하기 어려웠다. 프로그래밍 패러다임과 자바스크립트 계열 언어와의 궁합을 다루다보니...

최근 관심이 가는 함수형 프로그래밍에 대해 훑어보던 중 이런 질문이 하나 떠올랐다.

함수형 프로그래밍에서는 디자인 패턴이란게 적용되나?

이글은 이런 질문에서 시작되어

자바스크립트와 타입스크립트, 객체 지향 프로그래밍와 함수형 프로그래밍의 대략적인 정리

정도로 마무리된다.

이를 위해 함수형 자바스크립트, 타입스크립트의 디자인 패턴을 다루는 책들을 대여해서 속독해보았다. 이 글은 이들에 대한 단상을 적는다.

편의를 위해 아래부터는 자바스크립트는 JS, 타입스크립트는 TS, 객체 지향 프로그래밍은 OOP, 함수형 프로그래밍은 FP, 디자인 패턴은 DP로 부르겠다.

함수형 자바스크립트

관련한 책들이 몇권 있는데, 최근 나온 파란책이 꽤 볼만했다. Funtor, Applicative, Monad 등 이해하기 매우 난해한 부분들을 이론적으로 설명하기보다는 JS 상에서 구현해가며 이해시켜주는 방식이었다.

덕분에 모나드에 대해서 꽤 많이 알게 되었다. 자주 사용하는 Promise도 일종의 모나드라니...

어쨌든 JS가 유연한 언어인 만큼, 약간의 라이브러리만 있으면 FP도 가능하다고 볼 수 있다.

2018년 현재에는 프로젝트 전체를 FP로 하기는 어렵겠지만, 많은 부분에서 FP를 도입할 수는 있겠다. 내가 FP 찬양론자는 아니지만, 최근 경향을 보건대 FP가 많은 곳에 쓰이게 될 것임은 짐작할 수 있다. FP의 장단점을 여기 논하지는 않겠다.

객체 지향 타입스크립트

TS를 배워보기 전에는 JS에 정적 타이핑이 가미된 수준의 테크닉 정도로 예상했었다. 그러나 막상 TS를 배워보면 타입 체크에 관한 부분보다는 Class나 Interface등 구조와 설계에 관한 부분이 더 중요한 부분임을 알게 된다. Java와 매우 닮아있다는 느낌을 지울 수 없다.

개인적으로는 TS가 목표하는 바가 바로 진정한 "Java"script가 아닐까 생각한다. 마치 Java를 JS로 컴파일하는 느낌이다. 애초에 TS가 객체 지향 프로그래밍(이하 OOP)를 목적으로 만들어졌다는 글도 본 기억이 난다.

실제로 얼마전 웹 프론트엔드 프로젝트에 참여한 적이 있다. 그때 투입된 Java만 알던 동료가 JS에 큰 거부감이 있어서 TS를 보여줬더니 그나마 쉽게 받아들였다. (물론 비동기 메카니즘은 제외하고...)

즉, 타입스크립트는 자바스크립트에 객체 지향 패러다임을 권장하는 언어라고 볼 수 있다.

객체 지향 자바스크립트?

JS는 매우 유연하기에 OOP도 가능하고 FP도 가능하다. 하지만 자유도가 너무 높은 나머지 특정 스타일로 강제하기 위해서는 라이브러리 적용이나 메타프로그래밍이 필요하다.

OOP를 적극적으로 적용하기 위해서는 차라리 TS를 선택하는것이 제일 간단한 방법일 것이다. 그렇지 않으면 코딩 컨벤션을 수립하고 ESLint등을 도입해야 할 것이다. 하지만 린팅툴은 설계 수준까지 검증해주진 못하므로 만족스럽지 못할것 같다.

함수형 타입스크립트?

각설하고, 함수형 프로그래밍과 타입스크립트는 좋지 않은 궁합으로 보인다.

아래 글에서는 (원문과 번역문 링크다)

[번역] 두려움, 믿음, 그리고 자바스크립트 - 언제 타입 시스템과 함수형 프로그래밍이 먹히지 않는가 | Rinae's devlog

Fear, trust and JavaScript: When types and functional programming fail | Reaktor

아래 셋 중 모두를 취할 수는 없고 1개는 포기해야 한다고 말하고 있다.

  • 함수형 프로그래밍
  • 타입
  • 자바스크립트

디자인 패턴과 함수형 프로그래밍

역시 간단히 말하자만, 크게 어울리지 않는다. 위키에서 DP를 찾아봐도 그렇고, 잘 생각해보면 GoF의 DP라는게 OOP가 막 발달하던 90년대에 정립된 개념이고 OOP를 위한 패턴들을 주로 담고 있다.

FP는 행위가 아니라 상태에 대한 선언적 프로그래밍이기 때문에 문제를 해결하는 방식 자체가 다르고 DP를 직접적으로 적용할 수 있는 부분이 많지 않다.

구조와 관련된 디자인 패턴들의 추상적 개념들은 FP에 다른 형태로 녹아들 수 있겠으나, 역시 직접적인 적용은 불가하다. 구조 자체가 다르니... 예를 들어 Adapter 패턴 같은 경우는 FP에서 자주 쓰이는 map 함수자와 비슷한 역할이 될 수 있겠다. 데이타를 다른 형태로 변환한다는 개념이 비슷한거지 구조나 동작 방식은 완전히 다르다.

결론

내 생각이 복잡한 만큼 매우 난잡합 글이었다. 하지만 얻는 것은 많았다.

내가 만약 프로젝트 개발 방향에 대한 결정권이 있다면 아래처럼 판단하게 될 것이다. 현 시점에서는...

언어적 관점 (JS vs TS)

  • 빠른 PoC가 필요하다면 JS, 유지보수가 중요하다면 TS.
  • 개인 프로젝트엔 JS, 팀 규모가 크다면 TS.

패러다임 관점 (OOP vs FP)

  • OOP에 익숙한 팀원들이라면 TS.
  • 팀원들이 FP를 잘 모른다면 배워가며 사용하기는 리스크가 크다.
  • 모듈에 따라서 일부 FP를 적용할 수는 있겠다.
최종 수정: 2018-12-27 04:12:54