[javascript] Ramda를 활용한 리팩터링 방법

리팩터링은 코드를 더 이해하기 쉽고 유지보수하기 쉽도록 변경하는 과정입니다. Ramda는 함수형 프로그래밍을 위한 자바스크립트 라이브러리로, 이를 활용하여 코드를 리팩터링하는 방법을 살펴보겠습니다.

1. 코드 중복 제거하기

먼저, 코드 중복을 제거하는 것은 리팩터링의 한 가지 주요 목표입니다. Ramda를 사용하면 함수 조합을 통해 중복을 제거할 수 있습니다.

예를 들어, 다음과 같은 코드가 있다고 가정해봅시다.

const sumPositiveNumbers = numbers => {
  let sum = 0;
  for (let i = 0; i < numbers.length; i++) {
    if (numbers[i] > 0) {
      sum += numbers[i];
    }
  }
  return sum;
};

const sumNegativeNumbers = numbers => {
  let sum = 0;
  for (let i = 0; i < numbers.length; i++) {
    if (numbers[i] < 0) {
      sum += numbers[i];
    }
  }
  return sum;
};

위 코드에서 sumPositiveNumberssumNegativeNumbers 함수는 거의 동일한 로직을 가지고 있습니다. 이 경우, R.filter 함수를 사용하여 중복을 제거할 수 있습니다.

const sumNumbers = (numbers, predicate) => {
  return R.pipe(
    R.filter(predicate),
    R.sum
  )(numbers);
};

const sumPositiveNumbers = numbers => sumNumbers(numbers, R.gt(R.__, 0));
const sumNegativeNumbers = numbers => sumNumbers(numbers, R.lt(R.__, 0));

위와 같이 sumNumbers 함수를 만들고, 필터링 조건을 함수로 전달하는 방식으로 코드를 변경하였습니다. 이렇게 하면 중복된 로직을 한 곳에서 관리할 수 있습니다.

2. 선언적으로 코드 작성하기

Ramda는 함수형 프로그래밍을 위해 많은 유틸리티 함수를 제공합니다. 이러한 함수를 활용하면 코드를 더 선언적으로 작성할 수 있습니다.

예를 들어, 다음과 같은 코드가 있다고 가정해봅시다.

const names = ["Alice", "Bob", "Charlie"];
const uppercasedNames = [];

for (let i = 0; i < names.length; i++) {
  uppercasedNames.push(names[i].toUpperCase());
}

위 코드에서 배열의 각 요소를 대문자로 변환하는 작업을 수행합니다. 이를 Ramda의 R.map 함수를 활용하여 더 선언적으로 작성할 수 있습니다.

const names = ["Alice", "Bob", "Charlie"];
const uppercasedNames = R.map(R.toUpper, names);

위와 같이 R.map 함수를 사용하여 배열의 모든 요소에 대해 R.toUpper 함수를 적용하도록 코드를 변경하였습니다. 이렇게 함으로써 코드의 의도가 더 명확해지고 가독성이 향상됩니다.

3. 커링을 활용한 코드 간결화

Ramda는 커링(currying)을 지원하므로, 커링을 활용하면 코드를 더 간결하게 작성할 수 있습니다.

예를 들어, 두 숫자를 더하는 함수를 만들어보겠습니다.

const add = (a, b) => a + b;

위 함수는 두 개의 인자를 받아서 더한 값을 반환합니다. 이를 Ramda의 R.curry 함수를 사용하여 커링된 함수로 변경할 수 있습니다.

const add = R.curry((a, b) => a + b);

위와 같이 R.curry 함수를 사용하여 함수를 커링하게 되면, 함수를 부분적으로 호출할 수 있습니다. 예를 들어, add(1)(2)와 같이 사용할 수 있습니다. 이렇게 하면 코드의 가독성이 향상되며, 재사용성도 높아집니다.

결론

Ramda를 사용하여 코드를 리팩터링하는 방법에 대해 알아보았습니다. Ramda의 유틸리티 함수들을 활용하면 코드 중복을 제거하고, 선언적으로 작성하며, 커링을 활용하여 코드를 간결하게 작성할 수 있습니다. 이러한 패턴들을 활용하여 코드를 개선하면, 가독성과 유지보수성을 향상시킬 수 있습니다.

참고 자료