본문 바로가기

Backend/함수형 자바스크립트

(19)
더 많은 함수형 자바스크립트 사용.. (2) 이전 포스팅 참고 - 비동기 상황 Node.js 로 서버 프로그래밍을 하다보면, 비동기 상황을 자주 만나게 됩니다. DB 혹은 Redis 를 사용하던지 다른 서버 api 를 호출해야 하는 코드에선 비동기 상황을 피할 수 없으며 예전의 경우엔 자연스레 콜백 지옥으로 이어지게 되었습니다. 이 콜백 지옥을 벗어나기 위해 Promise 를 사용하면서 Promise chaining 와 Promise.all 까지 활용해왔습니다. 이번에 볼 예시들은 이러한 비동기 상황에서의 문제 해결 방법으로 partial.js 를 활용해보는 함수형적인 접근입니다. (굳이 partial.js 가 아니어도 됩니다) const lazyResponse = (result) => { return new Promise(resolve => { ..
더 많은 함수형 자바스크립트 사용.. (1) - _.each 일반적으로 코드 작업을 할 때, 우리는 분기 처리를 하기 위해 if 문을 굉장히 자주 사용합니다. 간단한 예시를 보겠습니다. const test1 = (list) => { if (Array.isArray(list)) { list.forEach(item => { console.info(item); }); } }; test1([1, 2, 3]); // 1 // 2 // 3 test1('123'); 배열 전용 메서드인 forEach 를 타입 에러 없이 사용하기 위해 if 문을 넣은 test1 함수입니다. 만약 위와 같은 if 문이 없었다면 test1('123'); 실행은 TypeError: list.forEach is not a function 와 같은 에러를 냈을 것 입니다. 이런 함수를 작..
기본 객체 다루기 이전 포스팅 참고 이전 포스팅에서 잠깐 본 것 처럼 Immutable.js 는 좋은 라이브러리입니다. Immutable.js 를 결국 사용하는 이유는 중첩 구조의 값을 변경한 새로운 객체를 만들어 낼 수 있다는 것 때문이고, 이렇게 불변적으로 값을 다룸으로써 부수 효과를 줄일 수 있습니다. 근래엔 여러 단계 중첩 된 데이터를 많이 사용하므로 이러한 깊은 값의 변화는 꽤 중요한 포인트긴 합니다. Immutable.js 의 단점이라 한다면 그 내부가 바로 JSON 이 될 수 없는 커스텀 객체라는 부분입니다. 비단 Immutable.js 만의 단점이라기보단, Sequelize 나 TypeORM 등의 Node.js 에서 사용되는 ORM 의 모델들에도 해당됩니다. - 커스텀 객체 JSON 은 데이터를 주고 받는데..
값 다루기 함수로 협업하는 가장 좋은 방법은 자바스크립트의 기본 객체 혹은 보편적으로 약속된 객체만 값으로 사용해 인자와 리턴값으로만 소통하는 것입니다. 기본 객체란 Array, Object, String 등의 자바스크립트 기본 객체를 말하며 보편적으로 약속된 객체들은 Node.js 에서 가장 많이 쓰이는 웹 프레임워크인 Express.js 의 req, res 등 어떤 프로퍼티와 메서드를 가지고 있는지 충분히 보장된 값입니다. - 순수 함수 메서드가 자신이 가진 내부의 상태에 따라 다른 결과를 만든다면, 순수 함수는 들어온 인자와 상수만 사용하여 외부 상태를 변경하지 않고 항상 동일한 결과를 반환합니다. 함수가 외부 상태를 변경한다면 부수 효과가 생길 수 있습니다. 부수 효과 문제는 동시성이 생길 때나, 오랫동안 ..
지연 평가 (3) 이전 포스팅 참고 - Lodash 의 지연 평가와 비교 지연 평가는 Partial.js 만 지원하는게 아닙니다. 마찬가지로 지연 평가를 지원하는 Lodash 와 비교를 해보도록 하겠습니다. const _ = require('lodash'); const list = _.range(10000); const limit = 100; const square = v => v * v; const odd = v => !!(v % 2); console.time(); for (let i = 0 ; i < 10000 ; i++) { _(list).map(square).filter(odd).take(limit).value(); } console.timeEnd(); Lodash 의 지연 평가는 값을 wrapping 한 후 함수..
지연 평가 (2) 이전 포스팅 참고 - 컬렉션 중심 프로그래밍 컬렉션 중심 프로그래밍의 목표는 컬렉션을 다루는 함수 세트들을 잘 만들어 재사용성을 극대화시키는 데 있으며, 컬렉션을 다루는 것은 함수형 프로그래밍과 잘 어울립니다. 컬렉션을 다루는 것이 지연 평가와 무슨 관련이 있을지 알기 위해서 Partial.js 의 고차 함수들을 유형별로 묶어서 살펴보도록 하겠습니다. 수집 : map, pluck, values, keeys, pairs... 필터링 : filter, reject, difference, compact... 축소 : reduce, group_by, index_by, count_by, max, min... 찾기 : find, some, every, take, indexOf, findIndex... 각 유형의 제..
지연 평가 (1) 자바스크립트는 지연 평가(lazy evaluation) 와 그에 따른 최적화를 지원하지 않지만, 그렇다고 지연 평가가 없지는 않습니다. 지연 평가는 말 그대로 평가를 지연하는 것이며, 연산자들과 로직을 담은 순수 함수를 통해 평가하는 일을 늦춥니다. 지연 평가를 올바르게 동작시키려면 그 평가의 단위가 반드시 순수 함수여야 합니다. 함수형 프로그래밍에서는 추상화를 함수 단위로 하고, 식과 값을 함수 단위로 다루면서 평가 시점을 정확히 다루는 식으로 로직을 설계합니다. 기본이 느긋한 계산법으로 동작하는 언어에서는 모나드를 통해 엄격한 평가를 구현하고, 기본이 엄격한 계산법으로 동작하는 언어에서는 함수를 만들어 지연 평가를 구현합니다. 결국 함수형 프로그래밍이란, 아무데서나 함수를 선언할 수 있고, 어디에서 ..
Partial.js (3) 이전 포스팅 참고 이번엔 Partial.js 의 약간은 잡기능(?) 에 대해 알아보도록 하겠습니다. - 고차 함수의 보조 함수에서 더 많은 인자 사용 Partial.js 의 주요 고차 함수들에게는 지난 포스팅에 적은 비동기 제어 외에도 Underscore.js, Lodash 의 고차 함수와는 다르게 동작하는 부분이 있습니다. 그 중 하나인 보조 함수에서 더 많은 인자를 사용하는 부분을 예시 코드로 보도록 하겠습니다. const _ = require('underscore'); function test1() { const a = 1; const b = 1; return _.map([1, 2, 3], val => val * a - b); } console.info(test1()); // [-1, 0, 1] 먼..