[javascript] Ramda를 활용한 데이터베이스 연동

소개

이번 포스트에서는 자바스크립트 함수형 라이브러리인 Ramda를 활용하여 데이터베이스와 연동하는 방법을 알아보겠습니다. Ramda는 함수형 프로그래밍의 원칙을 따르며, 코드를 간결하고 확장 가능하게 작성할 수 있도록 도와줍니다.

Ramda란?

Ramda는 자바스크립트의 함수형 프로그래밍 라이브러리로, Lodash나 Underscore와 유사한 역할을 합니다. 하지만 Ramda는 순수한 함수형 프로그래밍을 위해 설계되어 있으며, 불필요한 부작용(side effect)를 최소화하는 것을 목표로 합니다. 따라서 Ramda를 사용하면 코드의 가독성을 높이고 유지보수를 쉽게 할 수 있습니다.

데이터베이스 연동하기

데이터베이스 연동을 위해 가장 먼저 해야 할 일은 데이터베이스와의 연결을 설정하는 것입니다. 많은 데이터베이스 시스템은 자바스크립트를 위한 공식 드라이버를 제공하며, 이 드라이버를 활용하여 연결을 설정할 수 있습니다.

아래는 MongoDB와의 연결을 설정하는 예시입니다.

const MongoClient = require('mongodb').MongoClient;
const dbUrl = 'mongodb://localhost:27017/mydb';

const connectToDatabase = () => {
  return MongoClient.connect(dbUrl)
    .then(client => client.db())
    .catch(console.error);
};

위 예시에서는 MongoClient를 사용하여 데이터베이스에 연결하고, 연결이 성공하면 db() 메서드를 호출하여 실제 데이터베이스 객체를 얻는 것을 보여줍니다.

이제 Ramda를 활용하여 데이터베이스 연동을 더욱 간결하게 작성해보겠습니다.

const R = require('ramda');
const { promisify } = require('util');
const mongodb = require('mongodb');
const { MongoClient } = mongodb;

const dbUrl = 'mongodb://localhost:27017/mydb';

const connectToDatabase = async () => {
  const client = await MongoClient.connect(dbUrl);
  return client.db();
};

위 예시에서는 async/await 구문을 활용하여 비동기 코드를 더욱 간결하게 작성하였습니다. 또한 promisify 함수를 사용하여 콜백 기반의 함수를 프라미스 기반으로 변환하였습니다.

데이터베이스 쿼리

데이터베이스에 쿼리를 전송하여 데이터를 가져오는 경우, Ramda의 함수 조합 기능을 활용하여 코드를 간결하게 작성할 수 있습니다.

아래는 MongoDB에서 users 컬렉션에서 모든 문서를 가져오는 예시입니다.

const R = require('ramda');
const { promisify } = require('util');
const mongodb = require('mongodb');
const { MongoClient } = mongodb;

const dbUrl = 'mongodb://localhost:27017/mydb';

const connectToDatabase = async () => {
  const client = await MongoClient.connect(dbUrl);
  return client.db();
};

const getAllUsers = async () => {
  const db = await connectToDatabase();
  const collection = db.collection('users');
  const find = promisify(collection.find.bind(collection));
  const toArray = promisify(collection.toArray.bind(collection));

  const query = {};

  const result = await R.pipe(
    find(query),
    toArray
  )(collection);

  return result;
};

위 예시에서는 pipe 함수를 사용하여 find 함수와 toArray 함수를 조합하여 쿼리를 실행한 후 결과를 가져옵니다.

결론

Ramda를 활용하여 데이터베이스와의 연동을 보다 간결하고 유지보수하기 쉽게 작성할 수 있습니다. Ramda의 함수 조합 기능을 사용하면 효율적이고 읽기 쉬운 코드를 작성할 수 있습니다. 데이터베이스 연동을 위한 라이브러리와 Ramda를 함께 사용하여 더욱 생산적이고 효율적인 개발을 할 수 있습니다.

참고 자료