[Node.js] mongoose-sequence 로 숫자가 자동으로 증가하는 필드 만들기

개요

2021년 현재까지도 아주 활발하고 많이 이용되는 NoSQL 계열인 MongoDB, 그리고 Node.js 에서 MongoDB 관련 작업을 담당해주는 mongoose. 좋습니다. 저도 앞으로도 계속 사용할 것 같습니다. 그에 따라 편리성을 더해주는 라이브러리도 굉장히 많은데요, 특히나 항목이 추가할 때마다 자동으로 증가하는 필드를 제공해주는 라이브러리도 물론 있습니다. mongoose 도 이제 나온지 꽤 된 녀석이라서, 종종 오래된 라이브러리가 보이는데, 영어로 자동 증가와 관련해서 검색하면 흔히 나오는 라이브러리 중에 하나가 mongoose-auto-increment 인데, 이 놈은 업데이트 된지 5년이 훌쩍 지났습니다. (2021년 2월 기준) 그래서 mongoose-sequence 라는 다른 라이브러리로 진행해보고자 합니다!

자동으로 증가하는 필드가 왜 필요할까요? 뭐 다양한 이유가 있겠지만 필자같은 경우는 Rest API 를 구상할 때, 문서의 _id 값 (실제 MongoDB 에서 사용하는 길다란 문자열 값)을 그대로 이용하기는 뭔가 깔끔해보이지도 않고 보안적인 부분에서 한 단계를 더 추가해보고자 따로 id를 만들어서 사용합니다. (_id 를 실제로 막 사용한다고 해서 보안에 좋은지 안좋은지는 자세히 모르겠습니다.)

mongoose-sequence 모듈은 대략적으로 다음의 과정을 자동으로 해준다고 보면 됩니다.

  1. 콜렉션(테이블, 스키마 혹은 모델)마다, 다음번에 생성했을 때 부여할 숫자를 저장하기 위해, 별도의 콜렉션을 만들고 관리함.
  2. 특정 콜렉션에서 새로운 항목이 만들어질 때, 앞서 얘기한 숫자를 이용하고, 다음번에 다시 사용하기 위해 숫자를 1 더해줌.

실제 사용

자, 이제 그렇다면 실제로 이용해보도록 합시다! 저는 별도의 함수를 만들어서 조금 더 간소화시켰습니다.

// auto-id-setter.js

const { Schema, Mongoose } = require('mongoose');
const AutoIncrementFactory = require('mongoose-sequence');

/**
 * 해당 스키마에 자동 증가 필드를 추가시켜줍니다.
 * @param {Schema} schema
 * @param {Mongoose} mongoose
 * @param {string} name
 * @param {string} inc_field
 */
module.exports = (schema, mongoose, name, inc_field) => {
  const AutoIncrement = AutoIncrementFactory(mongoose);
  const option = { id: `${name}_${inc_field}`, inc_field };
  schema.plugin(AutoIncrement, option);
};
// application.schema.js

const autoIdSetter = require('./auto-id-setter');
const mongoose = require('mongoose');
const schema = new mongoose.Schema({
  // 중략
});
autoIdSetter(schema, mongoose, 'application', 'id');
module.exports = schema;

inc_field 는 우리가 사용할 콜렉션에서 자동으로 증감하는 필드를 지정합니다. 이 필드는 스키마 정의시 미리 정의할 필요가 없습니다!! name은 mongoose-sequence 에서 관리하기 위한 내부적인 id를 지정해주기 위해 사용합니다. 그래서, 대소문자도 특별히 상관없고 다른 콜렉션과 겹치지만 않으면 됩니다. 이렇게 진행하고 나면 실제 콜렉션에 id 필드가 제대로 생성되고 있음을 확인할 수 있습니다. 다른 다양한 옵션이 있는데, 이는 공식 문서를 참조해주시기 바랍니다~

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다

Scroll to top