MongoDB는 NoSQL데이터베이스이며 문서지향(Document-Oriented)적인 데이터베이스이다.
관계형DB가 아니기 때문에 고정된 Schema나 JOIN이 존재하지 않으며
데이터 구조가 key-value 형식으로 이루어져 있다.
내 프로젝트는 리액트 + Node.js이므로 클라이언트와 서버에서 JSON객체를 주고받기 때문에
Document이 JSON형태로 이루어진 MongoDB를 사용하기에 유리했다.
Mongoose는 MongoDB의 ODM(Object Document Mapping)이다. 즉 MongoDB의 Document를
자바스크립트의 객체로 바꾸어주는 역할을 해준다.
먼저 시작하기에 앞서 MongoDB 호스팅 서비스를 찾아보았다.
무료로 MongoDB를 호스팅해주는 서비스는 여러군데 있지만 나는 mLab을 사용해서 호스팅을 진행하였다.
간단한 회원가입 후에 무료 티어로 DB를 생성하면 금방 서비스를 이용할 수 있다.
Overview 화면에서 connect버튼을 누르면 해당 DB로 연결할 수 있는 URI를 확인할 수 있다.
mongodb+srv://<아이디>:<비밀번호>@bgs.or7rc.mongodb.net/<클러스터명>?retryWrites=true&w=majority
Mongoose 설치는 NPM으로 한다.
npm install mongoose
다음으로 index.js에서 DB를 연결해주면 Mongoose 사용준비는 끝이다.
// src/index.js
const mongoose = require('mongoose');
// ES6 Promise 사용
mongoose.Promise = global.Promise;
// mongodb 연결
mongoose.connect(process.env.MONGO_URI).then(
(response) => {
console.log('Successfully connected to mongodb');
}
).catch(e => {
console.error(e);
});
Mongoose의 Promise를 어떤것을 쓸지 결정할 수 있는데 ES6의 Promise를 사용했다.
다음과 같이 스키마를 만들어서 default값 및 type을 정해줄 수 있다.
// src/models/account.js
const mongoose = require('mongoose');
const { Schema } = mongoose;
// 스키마 생성
const Account = new Schema({
profile: {
username: { type: String },
avatar: { type: String, default: 'sheep' }, // default 아바타
verified: { type: Boolean, default: false } // 인증 여부
},
createdAt: { type: Date, default: Date.now } // 계정이 생성된 시각
});
// 모델로 만들어서 export
module.exports = mongoose.model('Account', Account);
스키마를 통해 만든 인스턴스에서 사용할 메소드를 정의해 줄 수가 있는데 종류에는 statics와 methods가 있다.
statics의 this는 Collection 내의 모든 document들을 가리키고
methods의 this는 Document 하나만 가리킨다.
Account.statics.findByUsername = function (username) {
return this.findOne({ 'profile.username': username }).exec();
};
전체 Document에서 일치하는 유저이름을 가진 Document 하나만 찾아서 반환해주는 메소드이다.
Account.methods.validatePassword = function (password) {
const hashed = hash(password);
return this.password === hashed;
};
함수로 전달받은 password와 해당 Document의 password 값이 일치하는지 비교한 값을 반환하는 메소드이다.