Mongoose


Mongoose 또는 Mongoose.js는 MongoDB와 Node.js간 오브젝트 매핑을 위한 ODM(Object Data Modelling) 라이브러리 입니다.

ODM?

MongoDB는 document를 사용하고 Node는 객체(Object)를 사용합니다. 따라서 Node에서 MongoDB를 사용하려면 Node의 객체를 MongoDB의 document로 개발자가 직접 바꿔서 사용해야 합니다. 그리고 이 과정을 좀 더 편하게 하기 위해 나온 것이 Mongoose입니다. MongoDB 기본 드라이버를 사용할 수 있기 때문에 ODM을 사용하는 것이 필수는 아니지만 스키마의 존재 및 생산성 등 여러 이유로 노드 커뮤니티에서 많이 사용되고 있습니다.

설치

Mongoose를 사용하기 위해선 당연하게도 MongoDB와 Node.js가 설치되어 있어야 합니다. 각각의 설치 방법은 여기여기에서 찾을 수 있습니다.

아래 명령어를 실행해 Mongoose를 설치해줍니다.

npm install --save mongoose

이제 mongoose.connect()함수로 MongoDB와 연결할 수 있습니다.

const mongoose = require('mongoose');

mongoose.connect('mongodb://localhost/myCollection', {
    useNewUrlParser: true,
    useUnifiedTopology: true
});

연결이 성공했을 때와 실패 했을 때의 이벤트를 만들어줍니다.

// Check database connection
db.once('open', () => {
    console.log('Successfully connected to mongodb!');
});

// Bind connection to error event (to get notification of connection errors)
db.on('error', console.error.bind(console, 'MongoDB connection error:'));

Schema와 Model

기본적으로 Schema가 없는 MongoDB와 달리 Schema가 있는것이 Mongoose의 큰 특징 중 하나입니다. 스키마를 정의한 후 스키마를 컴파일해 모델을 생성합니다. 그리고 모델의 개체(Instance)가 MongoDB의 document에 대응해 MongoDB의 CRUD 연산을 수행할 수 있습니다.

Schema

스키마 정의는 아래 처럼 할 수 있습니다.

const mongoose = require('mongoose');

const postSchema = new mongoose.Schema({
    title: String,
    body: String
});

각각의 필드를 객체로 설정에 추가적인 정보를 넣을 수 있습니다.

const postSchema = new mongoose.Schema({
    title: {
        type: String,
        required: true,
        unique: true
    },
    body: {
        type: String,
        required: true
    },
    date: {
        type: Date,
        default: DateTime.now()
    }
});

Model

이제 위에서 정의한 스키마로 모델을 만들어 줍니다. mongoose.model()함수의 첫번째 매개변수는 모델의 이름을 받는데 단수(Singular)로 설정하면 Mongoose 자체적으로 복수(Plural)명사로 MongoDB 컬렉션을 생성합니다.

// postSchema 스키마로 posts collection을 생성합니다.

const Post = mongoose.model('Post', postSchema);

// 인수로 넘겨준 객체로 document를 생성한 뒤 posts 컬렉션에 저장합니다.
const post = new Post({
    title: 'Mongoose.js',
    body: 'Mongoose is ODM for MongoooDB and Node.js'
});

await post.save();

이제 Post 모델로 MongoDB쿼리를 사용할 수 있습니다. 주의할 점은 모델은 커넥션에 종속적이기 때문에 만약 새로운 커넥션을 만들었다면 해당 커넥션에 대해 새로 모델을 만들어줘야 합니다.

const conn = mongoose.createConnection('mongodb://localhost');
const post = conn.model('Post', postSchema);

이렇게 하면 새 커넥션에 대해 Post 모델을 생성할 수 있습니다.