[Node.js] 몽고DB 주요 개념(도큐먼트, 컬렉션, 스키마), 스키마 생성
- 도큐먼트(Document) : MongoDB에서 데이터를 저장하는 기본단위(JSON 형태), 관계형 데이터베이스에서 행(Row)에 해당함
- 컬렉션(Collection) : 도큐먼트 들이 모여있는 그룹, 관계형 데이터베이스에서 테이블에 해당함
- 스키마(Schema) : 애플리케이션에서 데이터가 어떠한 자료형으로 되어 있는지 정하는 명세서 같은 것, 몽고디비는 스키마가 자유로운(Schema-less) NoSQL DB이지만, Mongoose 같은 ODM(Object Document Mapping) 라이브러리를 사용하면, 관계형 데이터베이스처럼 데이터 구조를 정할 수 있음
컬렉션 이름을 users 라 하자.
{
"id": "user1",
"name": "KIM",
"email" : "kim@google.com"
},
{
"id": "user2",
"name": "LEE",
"email" : "lee@google.com"
}
users 컬렉션 안에는 위와 같은 형태의 여러개의 도큐먼트(JSON 데이터) 가 저장된다.
Mongoose 라이브러리로 데이터 구조(스키마)를 정의할 수도 있다.
const mongoose = require('mongoose');
const usersSchema = new mongoose.Schema({
id : String,
name : String,
email : String
});
const Users = mongoose.model('Users', usersSchema);
id, name, email 을 전부 문자열로 정의 하였다.
정리하자면, 몽고디비는 스키마가 자유로운 NoSQL DB 이지만,
Mongoose 같은 라이브러리를 사용하여 데이터 구조를 엄격하게 관리할 수 있다.
데이터에 필요한 스키마를 정의해놓고, 스키마에 맞게끔 구성된 자료가 도큐먼트이다.
그리고 여러개의 도큐먼트들이 모아져 있는 것이 컬렉션이다.
스키마와 모델
- 스키마 : 애플리케이션에서 데이터가 어떠한 자료형으로 되어있는지 정하는 명세서 같은 것
- 스키마 파일은 애플리케이션 코드와 별도의 파일로 작성한다 (코드의 재사용성을 높이기 위함. 앞전에 라우터 파일을 따로 관리한 것과 같은 맥락으로, 파일을 따로 두어 관리한다.)
스키마를 바탕으로 하여, 데이터 베이스 안에 어떠한 형태를 만들어 가는 것을 "모델링" 이라 한다.
스키마 파일 정의하기
myContacts 폴더 아래 models 폴더를 생성하고, contactModel.js 파일을 생성했다.
contactModel.js
const mongoose = require('mongoose');
const contactSchema = new mongoose.Schema({
name : {
type : String,
required : true
},
email : {
type : String,
},
phone : {
type : String,
required: [true, "전화번호는 꼭 기입해 주세요."]
}
},
{
timestamps : true
})
//스키마를 모델로 변환 : mongoose.model(모델명, 스키마명)
const Contact = mongoose.model("Contact", contactSchema);
module.exports = Contact;
몽구스를 이용하여 위와 같이 스키마를 작성한다.
new mongoose.Schema() 를 하여 contactSchema 객체를 만든다.
mongoose.Schema({ 스키마 정의 }, { timestamps : true }) 로 작성하였는데,
{timestamps : true} 인자를 주면, 데이터가 수정될 때마다 시간이 자동으로 기록된다.
mongoose.model("Contact", contactSchema); 하여
contactSchema 를 기반으로 한 "Contact" 모델로 변환했다.
그리고 이 모델을 모듈로 사용하기 위하여, Contact 변수에 할당 후 내보냈다.
* contactModel.js 파일이 가지는 의미를 거시적으로 이야기해보면
이 스키마를 준수하는 (이 규칙에 맞는) 도큐먼트를 만들고, 그 도큐먼트들을 Contact라는 모델로 바꿔줘 라는 뜻이다.
https://youtu.be/32-ObOZkRe4?feature=shared