[javascript] Ramda를 활용한 모나드(Monad) 개념 및 활용
모나드(Monad)는 함수형 프로그래밍에서 많이 사용되는 개념 중 하나입니다. 모나드는 순수 함수형 프로그래밍에서 부작용(side effect)을 제어하며, 코드의 안정성과 가독성을 높여줍니다.
여기서는 JavaScript 라이브러리인 Ramda를 활용하여 모나드의 개념과 활용에 대해 살펴보겠습니다.
모나드란?
모나드는 값 랩퍼(wrapper) 또는 컨테이너(container)라고 볼 수 있습니다. 값을 감싸고 있으며, 그 값을 안전하게 조작하고 사용할 수 있는 방법을 제공합니다. 모나드는 크게 세 가지 중요한 함수를 제공합니다.
- unit 함수 (also known as “return” or “pure”): 값을 모나드로 감싸는 함수입니다. 예를 들어, 숫자 5를 모나드로 감싸는 방법은
unit(5)
혹은return(5)
입니다. - bind 함수 (also known as “flatMap” or “chain”): 값을 모나드로 감싸고 있는 상태에서 값을 조작하고 새로운 모나드로 반환하는 함수입니다. 예를 들어, 숫자를 제곱하는 함수
square
을bind
함수를 통해 적용하면,unit(5).bind(square)
또는return(5).flatMap(square)
와 같이 사용할 수 있습니다. - 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를 사용하여 코드를 더 안전하고 가독성 있게 작성해보세요.