MongoDB 모델링 (1)

박노정·2021년 7월 16일
0

블로그 개발기

목록 보기
3/3

오늘은 서버에서 필요한 기초작업 중 하나인 모델링을 해보았다.
MongoDB로 하는것은 처음이었지만 하다보니까 모델링이 머리로 그려져서 빠르게 적응했던것같다.

모델 파일 생성

django를 이용해서 모델링을 했던경우에는 앱마다 models.py를 만들어서 사용했던 것 같은데 이 방법은 models 폴더에 필요한 모델들을 생성한다.

server 폴더 하위에 models파일을 생성해주고 필요한 모델을 생성한다.

user.js : User에 관한 모델을 만드는것

post.js : 글 쓰는것에 관한 모델을 만드는것

comment.js : 댓글 쓰는것에 관한 모델을 만드는것

category.js : 카테고리 설정에 관한 모델을 만드는것

모델 스키마 작성

모델 파일을 생성했으니 해당 모델의 스키마를 작성해줄 시간이다.

스키마란 해당 모델의 특성이나 모델이 가지고있어야하는 구조를 잡아주고 관계를 정의하는 작업이다.

User 모델 스키마

import mongoose from 'mongoose';
import moment from 'moment';

const UserSchema = new mongoose.Schema({
  name: {
    type: String,
    required: true,
  },
  email: {
    type: String,
    required: true,
    unique: true,
  },
  password: {
    type: String,
    required: true,
  },
  role: {
    type: String,
    enum: ['MainJuin','SubJuin','User'],
    default: 'User',
  },
  register_date: {
    type: Date,
    default: moment().format("YYYY-MM-DD hh:mm:ss")
  },
  comments: [
    {
      post_id: {
        type: mongoose.Schema.Types.ObjectId,
        ref : "posts"
      },
      comment_id: {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'comments'
      },
    },
  ],
  posts: [
    {
      type: mongoose.Schema.Types.ObjectId,
      ref : "posts"
    }
  ],
})

const User = mongoose.model('user', UserSchema);

export default User;

특성별 설명

기본틀

  email: {
    type: String,
    required: true,
    unique: true,
  },

type: 이 개체에는 어떤 타입의 data가 들어올지 정의해준다.

required: 필수적인 개체인가를 표시해준다.

unique: 중복되는지에 관한 여부이다. email의 unique가 true이면 이메일로 중복체크를 할 수 있다.

요소에 배열이 들어간 경우

role: {
    type: String,
    enum: ['MainJuin','SubJuin','User'],
    default: 'User',
  },

여기선 배열을 넣어놨는데 이럴때는 default값이 필요하다. 또한 요소를 배열로 넣은 이유는 user의 유형별로 권한을 다르게 하기 위함이다.

시간저장방법

register_date: {
    type: Date,
    default: moment().format("YYYY-MM-DD hh:mm:ss")
  },

등록일자이다.
default의 값에 Date.now()와 같이 쓸 수 있지만 그렇게 쓸 경우 한국의 시간이 나오지 않는다. 그래서 moment().format("YYYY-MM-DD hh:mm:ss")와 같이 써서 한국의 시간으로 맞춰줬다.

moment는 이 전편에서 이렇게 사용하기위해 패키지를 다운받았었다.

댓글 (삭제하는 경우를 고려한 DB작업)

comments: [
    {
      post_id: {
        type: mongoose.Schema.Types.ObjectId,
        ref : "posts"
      },
      comment_id: {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'comments'
      },
    },

이것은 user가 쓴 댓글에 관한 스키마이다.
댓글의 경우 댓글의 id만 가지는 것이 아니라 댓글을 단 게시글도 데이터에 같이 가지고 있는 것이 특징이다.

그 이유는 게시글을 DB에서 지우면 그에 관한 댓글들도 지우는것이 보통이다. 그래서 같이 게시글의 id값도 같이 저장해놓고있다.

profile
성장스택 쌓고있는 개발자🏋

0개의 댓글