오늘은 서버에서 필요한 기초작업 중 하나인 모델링을 해보았다.
MongoDB로 하는것은 처음이었지만 하다보니까 모델링이 머리로 그려져서 빠르게 적응했던것같다.
django를 이용해서 모델링을 했던경우에는 앱마다 models.py를 만들어서 사용했던 것 같은데 이 방법은 models 폴더에 필요한 모델들을 생성한다.
server 폴더 하위에 models파일을 생성해주고 필요한 모델을 생성한다.
user.js : User에 관한 모델을 만드는것
post.js : 글 쓰는것에 관한 모델을 만드는것
comment.js : 댓글 쓰는것에 관한 모델을 만드는것
category.js : 카테고리 설정에 관한 모델을 만드는것
모델 파일을 생성했으니 해당 모델의 스키마를 작성해줄 시간이다.
스키마란 해당 모델의 특성이나 모델이 가지고있어야하는 구조를 잡아주고 관계를 정의하는 작업이다.
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
는 이 전편에서 이렇게 사용하기위해 패키지를 다운받았었다.
comments: [
{
post_id: {
type: mongoose.Schema.Types.ObjectId,
ref : "posts"
},
comment_id: {
type: mongoose.Schema.Types.ObjectId,
ref: 'comments'
},
},
이것은 user가 쓴 댓글에 관한 스키마이다.
댓글의 경우 댓글의 id만 가지는 것이 아니라 댓글을 단 게시글도 데이터에 같이 가지고 있는 것이 특징이다.
그 이유는 게시글을 DB에서 지우면 그에 관한 댓글들도 지우는것이 보통이다. 그래서 같이 게시글의 id값도 같이 저장해놓고있다.