기존에는 MySQL, OracleDB, PostgreSQL 같은 RDBMS를 자주 사용했다.
RDBMS(관계형 데이터베이스)의 한계점
1. 데이터 스키마가 고정적이다.
스키마는 데이터베이스에 어떤 형식의 데이터를 넣을지에 대한 정보
데이터양이 많을때는 데이터베이스의 스키마를 변경하는 작업이 매우 번거로워질 수 있다.
저장하고 처리해야 할 데이터양이 늘어나면 분산시키는 것이 아니라 해당 데이터베이스 서버의 성능을 업그레이드하는 방식으로 확장해주어야 한다.
문서 지향적 NoSQL 데이터베이스
유동적인 스키마를 지닐 수 있다. 새로 등록해야 할 데이터 형식이 바뀐다고 하더라도 기존 데이터까지 수정할 필요는 없다. 또한 서버의 데이터양이 늘어나도 여러 컴퓨터로 분산하여 처리할 수 있도록 확장하기 쉽게 설계되어 있다.
무조건 RDBMS보다 좋은 것은 아니다.
데이터의 구조가 자주 바뀐다면 MongoDB가 유리할 수 있지만, 까다로운 조건으로 데이터를 필터링 해야하거나 ACID 특성을 지켜야 한다면 RDBMS가 유리할 수 있다.
ACID: 원자성(Atomicity), 일관성(Consistency), 고립성(Isolation), 지속성(Durability) (데이터베이스 트랜지션이 안전하게 처리되는 것을 보장하기 위한 성질)
여러 문서가 들어 있는 곳 (기존 RDBMS에서 테이블 개념으로 사용한다)
다른 스키마를 가지고 있는 문서들이 한 컬렉션에서 존재할 수 있다.
서버 하나에 데이터베이스를 여러 개 가지고 있을 수 있다.
각 데이터베이스에는 여러 개의 컬렉션이 있으며, 컬렉션 내부에는 문서들이 들어 있다.
RDBMS는 스키마를 설계한다면 블로그 테이블, 댓글 테이블 만들어 JOIN해서 사용하는 것이 일반적이다.
MongoDB 스키마 디자인
{
_id: ObjectId,
title: String,
body: String,
createdDate: Date,
comments: [
{
_id: ObjectId,
text: String,
createdDate: Date,
}
]
}
문서 내부에 또 다른 문서가 위치할 수 있는데 이를 서브 다큐먼트(Subdocument)라고 한다.
문서하나에는 최대 16MB만큼 데이터를 넣을 수 있다.
$ brew tap mongodb/brew
$ brew install mongodb-community@5.0
m1 mac os의 경우에는 경로 문제가 발생할 수 있다.
$ arch -arm64 brew install mongodb-community@5.0
로 진행했다.
$ brew services start mongodb-community@5.0
$ mongo
yarn add mongoose dotenv
dotenv는 환경변수들을 파일에 넣고 사용할 수 있게 하는 개발 도구
환경변수가 들어있는 파일들은 .gitignore를 작성하여 제외시켜 주어야 한다.
mongoose
.connect(MONGO_URI, {
useNewUrlParser: true,
// useFindAndModify: false,
})
.then(() => {
console.log('Conntected to MongoDB');
})
.catch((e) => {
console.error(e);
});