[javascript] Ramda를 활용한 비동기 처리

비동기 처리는 웹 개발에서 핵심적인 부분 중 하나입니다. JavaScript에서는 Promise, async/await 등을 통해 비동기 처리를 쉽게 할 수 있지만, 여전히 복잡한 로직을 작성하기에는 번거로울 수 있습니다. 이런 경우 Ramda라는 함수형 프로그래밍 라이브러리를 사용하면 비동기 처리를 보다 간결하고 가독성 좋게 할 수 있습니다.

Ramda란?

Ramda는 JavaScript의 함수형 프로그래밍 라이브러리로, 함수형 프로그래밍의 개념을 적용하여 다양한 작업을 할 수 있습니다. Ramda는 일급 함수(first-class function), 순수 함수(pure function), 커링(currying) 등의 개념을 지원하여 함수를 조합하여 사용할 수 있는 강력한 도구입니다.

비동기 처리를 위한 Ramda 함수

1. R.pipeP()

R.pipeP() 함수는 여러 개의 비동기 함수를 연속적으로 호출하여 결과를 전달하는 과정을 쉽게 해줍니다.

예를 들어, 아래와 같은 비동기 함수들이 있다고 가정해봅시다.

const getUser = async (userId) => {
  const response = await fetch(`https://api.example.com/user/${userId}`);
  return response.json();
};

const getPosts = async (user) => {
  const response = await fetch(`https://api.example.com/user/${user.id}/posts`);
  return response.json();
};

이 함수들을 R.pipeP()를 사용해 연결하면 다음과 같이 사용할 수 있습니다.

const getPostsByUsername = R.pipeP(
  getUser,
  getPosts
);

getPostsByUsername('john')
  .then(console.log)
  .catch(console.error);

2. R.traverseP()

R.traverseP() 함수는 리스트나 배열과 같은 컬렉션을 동시에 비동기적으로 처리할 때 유용합니다. 예를 들어, 여러 개의 URL에서 데이터를 가져오고 이를 합쳐서 결과를 반환해야 하는 경우에 사용할 수 있습니다.

const fetchData = async (url) => {
  const response = await fetch(url);
  return response.json();
};

const urls = [
  'https://api.example.com/data/1',
  'https://api.example.com/data/2',
  'https://api.example.com/data/3'
];

R.traverseP(fetchData, urls)
  .then(console.log)
  .catch(console.error);

위와 같이 R.traverseP() 함수를 사용하면 각각의 URL에서 데이터를 비동기적으로 가져와서 배열로 결과를 반환합니다.

마무리

Ramda는 비동기 처리를 포함한 다양한 작업을 함수형 프로그래밍의 개념에 따라 쉽게 처리할 수 있도록 도와주는 라이브러리입니다. 위에서 소개한 R.pipeP()R.traverseP() 함수를 사용하면 간결하고 강력한 비동기 처리를 구현할 수 있습니다. 다양한 Ramda 함수를 익히고 사용해보면서 JavaScript 개발을 더욱 효율적으로 할 수 있습니다.

참고 자료