개인프로젝트에서 데이터베이스 관련 내용을 정리했다.
MongoDB는 NoSQL 데이터베이스로 유연한 스키마와 수평 확장성이 특징이다.
MongoDB는 데이터를 테이블이 아닌 문서 형태로 저장하는데,
유연한 스키마라 함은 각 문서는 다른 문서와 필드 구조가 달라도 상관없다. 때문에 필요한 데이터를 자유롭게 수정 및 추가할 수 있다.
또한, 샤딩을 지원하여 데이터베이스를 여러 서버에 분산하여 저장할 수 있다. 이러한 수평 확장성으로 데이터가 여러 서버에 분산되기 때문에 과부하에 대응하기 좋다.
Mongoose는 MongoDB를 위한 Object Data Modeling (ODM) 라이브러리로, MongoDB의 데이터베이스 작업을 더 쉽게 하고, 스키마 기반의 모델링을 제공한다.
Mongoose를 사용한 이유는 복잡한 쿼리 작업을 간단한 메서드로 작성할 수 있게 해준다고 공부했기에 사용했다.
하지만 현 프로젝트는 복잡한 쿼리가 없기 때문에 안써도 무방했을 것 같다.
초반에 설계했던 테이블을 공부한 MongoDB에 맞게 문서로 재구성했다.
_id는 모든 문서에 대해 자동으로 고유한 식별자를 생성하는데 이것이 그것이다.
테이블에서의 기본 키라고 보면 되겠다.
- User테이블
_id
name
password
salt
createdAt
loginCnt
lockYn
- Board테이블
_id
writer
title
content
imgPath
createdAt
비밀번호 암호화 관련 필드인 salt, 로그인 실패 횟수를 카운팅하여 계정을 잠그는 역할을 하는 필드인 loginCnt, lockYn는 아직 미구현단계이다.
const mongoose = require("mongoose");
const { Schema } = mongoose;
const userSchema = new Schema({
email: {
type: String,
required: true,
unique: true
},
name: {
type: String,
required: true
},
password: {
type: String,
required: true
},
salt: {
type: String,
required: true
},
createdAt: {
type: Date,
default: Date.now
},
loginCnt: {
type: Number,
default: 0
},
lockYn: {
type: Boolean,
default: false
}
});
module.exports = mongoose.model("User", userSchema);
데이터 관계를 정의하고
const express = require("express");
const router = express.Router();
const User = require("../schema/user");
router.post("/update", async (req, res) => {
try {
await User.update({
_id: req.body._id,
name: req.body.name
});
res.json({ message: true });
} catch (err) {
console.log(err);
res.json({ message: false });
}
});
와 같은 메서드를 사용하여 조회가 가능하다.