Notice
Recent Posts
Recent Comments
Link
개발스토리
Mongoose 본문
Mongoose
노드와 몽고디비를 연동해줄 뿐만 아니라 쿼리를 만들어주는 라이브러리이다.
- 몽구스는 시퀄라이즈와 달리 ODM(Object Document Mapping)이라고 불린다. 몽고디비는 relation이 아니라 document를 사용하기 때문이다.
- 몽고디비 자체가 이미 자바스크립트인데도 굳이 자바스크립트 객체와 매핑하는 이유는 몽고디비에 없어서 불편한 기능들을 몽구스가 보완해주기 때문이다.
- 먼저 스키마라는 것이 생긴다. 몽고디비는 테이블이 없어서 자유롭게 데이터를 넣을 수 있지만, 때로는 자유로움이 불편함을 초래한다. 실수로 잘못된 자료형의 데이터를 넣을 수도 있고, 다른 다큐먼트에는 없는 필드의 데이터를 넣을 수도 있다.
몽구스는 몽고디비에 데이터를 넣기 전에 노드 서버 단에서 데이터를 한 번 필터링하는 역할을 한다.
- MySQL에 있는 JOIN 기능을 populate메서드로 어느 정도 보완한다. 따라서, 관계가 있는 데이터를 쉽게 가져올 수 있다.
스키마 정의
schemas 폴더에 user.js와 comment.js를 만든다. (예시)
// schemas/user.js
// Schema 생성자를 사용해 스키마를 만든다. 필드를 각각 정의
const monoose = require('mongoose');
const {Schema} = monoose;
const userSchema = new Schema({
name : {
type : String,
required : true,
unique : true,
},
age : {
type : Number,
required : true,
},
married : {
type : Boolean,
required : true,
},
comment : {
type : String,
},
createdAt : {
type : Date,
default : Date.now,
},
});
// 마지막에는 몽구스의 model 메서드로 스키마와 몽고디비 컬렉션을 연결하는 모델을 만든다.
module.exports = monoose.model('User', userSchema);
- 몽구스는 알아서 _id를 기본 키로 생성하므로 적어줄 필요가 없다.
// schemas/comment.js
const mongoose = require('mongoose');
const {Schema} = mongoose;
const {Types:{objectId}} = Schema;
const commentSchema = new Schema({
commenter : {
type : objectId,
required : true,
ref : 'User',
},
comment : {
type : String,
required : true,
},
createdAt : {
type : Date,
default : Date.now,
},
});
module.exports = mongoose.model('Comment', commentSchema);
- commenter 속성만 봐보자.
- 자료형이 ObjectId이다. 옵션으로 ref 속성의 값이 User로 주어져 있다. commenter 필드에 User 스키마의 사용자 ObjectId가 들어간다는 뜻이다.
- 나중에 몽구스가 JOIN과 비슷한 기능을 할 때 사용된다.
컬렉션 이름 바꾸기
몽구스는 model 메서드의 첫 번째 인수로 컬렉션 이름을 만든다. 첫 번째 인수가 User라면 첫 글자를 소문자로 만든 뒤 복수형으로 바꿔서 users 컬렉션을 생성한다. 이러한 강제 개명이 싫다면 세 번째 인수로 컬렉션 이름을 주자
mongoose.model('User', userSchema, 'user_table')
'node.js' 카테고리의 다른 글
CORS (0) | 2021.01.02 |
---|---|
JWT(JSON Web Token) (0) | 2021.01.01 |
Sequelize (0) | 2020.12.28 |
cluster (0) | 2020.12.10 |
https와 http2 (0) | 2020.12.10 |
Comments