MongoDB ODM 인 Mongoose 사용하기

Seokwon Han·2020년 12월 16일
0

개발일지

목록 보기
3/7

MongoDB

MongoDBNoSQL데이터베이스이며 문서지향(Document-Oriented)적인 데이터베이스이다.
관계형DB가 아니기 때문에 고정된 Schema나 JOIN이 존재하지 않으며
데이터 구조가 key-value 형식으로 이루어져 있다.

내 프로젝트는 리액트 + Node.js이므로 클라이언트와 서버에서 JSON객체를 주고받기 때문에
DocumentJSON형태로 이루어진 MongoDB를 사용하기에 유리했다.

Mongoose

MongooseMongoDBODM(Object Document Mapping)이다. 즉 MongoDBDocument
자바스크립트의 객체로 바꾸어주는 역할을 해준다.

시작하기

호스팅

먼저 시작하기에 앞서 MongoDB 호스팅 서비스를 찾아보았다.
무료로 MongoDB를 호스팅해주는 서비스는 여러군데 있지만 나는 mLab을 사용해서 호스팅을 진행하였다.
간단한 회원가입 후에 무료 티어로 DB를 생성하면 금방 서비스를 이용할 수 있다.
Overview 화면에서 connect버튼을 누르면 해당 DB로 연결할 수 있는 URI를 확인할 수 있다.

mongodb+srv://<아이디>:<비밀번호>@bgs.or7rc.mongodb.net/<클러스터명>?retryWrites=true&w=majority

Mongoose 설치

Mongoose 설치는 NPM으로 한다.

npm install mongoose

DB 연결

다음으로 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);

사용자 정의 메소드

스키마를 통해 만든 인스턴스에서 사용할 메소드를 정의해 줄 수가 있는데 종류에는 staticsmethods가 있다.
staticsthisCollection 내의 모든 document들을 가리키고
methodsthisDocument 하나만 가리킨다.

statics

Account.statics.findByUsername = function (username) {
    return this.findOne({ 'profile.username': username }).exec();
};

전체 Document에서 일치하는 유저이름을 가진 Document 하나만 찾아서 반환해주는 메소드이다.

methods

Account.methods.validatePassword = function (password) {
    const hashed = hash(password);
    return this.password === hashed;
};

함수로 전달받은 password와 해당 Document의 password 값이 일치하는지 비교한 값을 반환하는 메소드이다.

profile
개발하면서 새로 배우거나 경험한 내용을 정리하고 그 외의 공부한 내용을 기록하는 곳입니다.

0개의 댓글