서버/Node.js

mongoose ?

이건욱 2020. 5. 27. 12:26

Mongoose는 MongoDB 기반 ODM(Object Data Mapping) Library입니다.

따라서 Javascript(TypeScript) 와 MongoDB 에 있는 데이터를 Mapping 하여 CRUD을 진행을 할수가 있습니다.

Install

$ npm install mongoose
(typescript 사용시)
$ npm install @types/mongoose

 

Connection

Connection 했을 때 관련된 정보들은 보통 환경변수(dotenv)를 통해서 관리합니다.

import * as mongoose from 'mongoose';
import config from '../env/index';

interface IConnectOptions {
    autoReconnect: boolean;
    reconnectTries: number; // Never stop trying to reconnect
    reconnectInterval: number;
    loggerLevel ? : string;
    useNewUrlParser ? : boolean;
}

/**
 * @constant {IConnectOptions}
 */
const connectOptions: IConnectOptions = {
    autoReconnect: true,
    reconnectTries: Number.MAX_VALUE,
    reconnectInterval: 1000,
    useNewUrlParser : true
};

/**
 * @exports
 * DB 설정 초기화
 */
export function init() {
    mongoose.set('useCreateIndex', true)
	
    const MONGO_URI: string = `${config.database.MONGODB_URI}${config.database.MONGODB_DB_MAIN}`;
    
    // ex) mongodb://localhost/<db-name>
    mongoose.connect(MONGO_URI, connectOptions);

    // handlers
    mongoose.connection.on('connecting', () => {
        console.log('\x1b[32m', 'MongoDB :: connecting');
    });

    mongoose.connection.on('error', (error) => {
        console.log('\x1b[31m', `MongoDB :: connection ${error}`);
        mongoose.disconnect();
    });

    mongoose.connection.on('connected', () => {
        console.log('\x1b[32m', 'MongoDB :: connected');
    });

    mongoose.connection.once('open', () => {
        console.log('\x1b[32m', 'MongoDB :: connection opened');
    });

    mongoose.connection.on('reconnected', () => {
        console.log('\x1b[33m"', 'MongoDB :: reconnected');
    });

    mongoose.connection.on('reconnectFailed', () => {
        console.log('\x1b[31m', 'MongoDB :: reconnectFailed');
    });

    mongoose.connection.on('disconnected', () => {
        console.log('\x1b[31m', 'MongoDB :: disconnected');
    });

    mongoose.connection.on('fullsetup', () => {
        console.log('\x1b[33m"', 'MongoDB :: reconnecting... %d');
    });
}

Schema & Model

MongoDB 자체에서는 원래는 Schema가 존재하지 않습니다.

따라서 장점도 있지만 명시적인 구조가 없기 때문에 어떤 데이터 타입인지 알기 어려운 단점이 존재합니다.

 

Mongoose는 그래서 Schema를 사용을 합니다.

Mongoose에 Schema는 MongoDB에 저장되는 데이터의 구조 , 타입에 관련된 정보를 JSON 형태로 정의할수가 있습니다. (RDBMS 테이블 정보와 비슷합니다.)

import * as mongoose from 'mongoose';
import { Document, Schema } from 'mongoose';

export interface IChatModel extends Document {
    message : string // 채팅 메시지
}

/**
 * @swagger
 * components:
 *  schemas:
 *    ChatSchema:
 *      required:
 *        - message
 *      properties:
 *        message:
 *          type: string
 */
const ChatSchema: Schema = new Schema({
    message : {type : String , required : true}
}, {
    collection: 'chatmodel',
    versionKey: false
})

ChatSchema.set('toObject', {
    transform: (doc : any, ret : any) => {
        delete ret._id;
        return ret;
    },
});

export default mongoose.model<IChatModel>('ChatModel', ChatSchema);

따라서 위와 같이 사용이 가능합니다.

 

Mongoose Schema 타입은 다음과 같이 제공을 합니다.

Data Type

Description

String

표준 자바스크립트와 Node.js의 문자열 type

Number

표준 자바스크립트와 Node.js의 숫자 type

Boolean

표준 자바스크립트와 Node.js의 불리언 type

Buffer

Node.js의 binary type(이미지, PDF, 아카이브 등)

Date

ISODate format data type(2016-08-08T12:52:30:009Z)

Array

표준 자바스크립트와 Node.js의 배열 type

Schema.types.ObjectId

12byte binary 숫자에 대한 MongoDB 24자리 hex 문자열(501d86090d371bab2c0341c5)

Schema.types.Mixed

모든 유형의 데이터

 

Mongoose는 기본적으로 primary-key인 _id을 자동으로 제공을 합니다. 

따라서 저 같은 경우에는 가져올때 _id를 제거 하기 위해서 toObject() 라는 함수를 통해서 _id를 제거를 합니다.

 

그리고 마지막줄 같은 경우에는 model을 생성합니다.

collection에 이름을 명시적으로 지정하지 않을 경우에는 첫번째 인자의 이름으로 생성이 됩니다.

사용법

따라서 위와 같이 만든 Model를 사용을 아래와 같이 할수가 있습니다.

 

SAVE

import ChatModel from './model'

let model : IChatModel = new ChatModel({
    message : ""
})
const saved: IChatModel = await model.save();
 
 
 
 
 
 
 
 

 

GET

import ChatModel from './model'

ChatModel
  .find()
  .skip(offset * limit).limit(limit)
  .where(Parameter.ROOM_ID)
  .equals(roomId))

 

UPDATE

import ChatModel from './model'

ChatModel
  .updateOne({조건} , {$set : {
  	message : "message"
  }})

 

DELETE

import ChatModel from './model'

ChatModel
  .findOneAndRemove({
       id:  Types.ObjectId(id)
  });

 

이렇게 Mongoose 기본 사용법에 대해서 설명하였습니다.

다음에는 더 자세한 내용으로 하나하나씩 살펴보도록 하겠습니다.