[javascript] Ramda를 활용한 모나드(Monad) 개념 및 활용

모나드(Monad)는 함수형 프로그래밍에서 많이 사용되는 개념 중 하나입니다. 모나드는 순수 함수형 프로그래밍에서 부작용(side effect)을 제어하며, 코드의 안정성과 가독성을 높여줍니다.

여기서는 JavaScript 라이브러리인 Ramda를 활용하여 모나드의 개념과 활용에 대해 살펴보겠습니다.

모나드란?

모나드는 값 랩퍼(wrapper) 또는 컨테이너(container)라고 볼 수 있습니다. 값을 감싸고 있으며, 그 값을 안전하게 조작하고 사용할 수 있는 방법을 제공합니다. 모나드는 크게 세 가지 중요한 함수를 제공합니다.

  1. unit 함수 (also known as “return” or “pure”): 값을 모나드로 감싸는 함수입니다. 예를 들어, 숫자 5를 모나드로 감싸는 방법은 unit(5) 혹은 return(5)입니다.
  2. bind 함수 (also known as “flatMap” or “chain”): 값을 모나드로 감싸고 있는 상태에서 값을 조작하고 새로운 모나드로 반환하는 함수입니다. 예를 들어, 숫자를 제곱하는 함수 squarebind 함수를 통해 적용하면, unit(5).bind(square) 또는 return(5).flatMap(square)와 같이 사용할 수 있습니다.
  3. join 함수: 중첩된 모나드를 풀어서 안에 있는 값을 반환하는 함수입니다. 예를 들어, 모나드가 중첩되어 있는 경우 join 함수를 사용하여 중첩된 모나드 안의 값을 가져올 수 있습니다.

Ramda를 활용한 모나드 활용

Ramda는 자바스크립트 함수형 프로그래밍 라이브러리로, 모나드를 다루기에 매우 편리한 기능을 제공합니다.

Maybe 모나드를 활용한 null 값 처리

Maybe는 null 또는 undefined 값을 안전하게 다룰 수 있는 모나드입니다.

const R = require('ramda');
const { Maybe, Just, Nothing } = require('ramda-fantasy');

const getUsername = (user) => Maybe(user).map(R.prop('name')).getOrElse('Unknown');

const user = { name: 'John' };
console.log(getUsername(user)); // Just('John')

const nullUser = null;
console.log(getUsername(nullUser)); // Unknown

Either 모나드를 활용한 에러 처리

Either는 여러 종류의 값 또는 에러를 다룰 수 있는 모나드입니다.

const R = require('ramda');
const { Either, Left, Right } = require('ramda-fantasy');

const divide = (a, b) => b === 0 ? Left('Division by zero') : Right(a / b);

const result = divide(10, 2)
  .map(R.multiply(2))
  .getOrElse('Cannot divide')
  
console.log(result); // Right(10)

const error = divide(10, 0)
  .map(R.multiply(2))
  .getOrElse('Cannot divide')
  
console.log(error); // Left('Division by zero')

결론

Ramda는 함수형 프로그래밍에서 모나드 개념의 활용을 편리하게 해주는 유용한 도구입니다. 위에서 소개한 Maybe와 Either 모나드는 일상적으로 많이 사용되는 값의 처리와 에러 처리를 간단하게 해결할 수 있도록 도와줍니다. Ramda를 사용하여 코드를 더 안전하고 가독성 있게 작성해보세요.

참고 자료