[Node.js] MongoDB 연동 (feat. mongoose)

🌊·2021년 12월 30일
0

Node.js

목록 보기
3/3

기존에는 MySQL, OracleDB, PostgreSQL 같은 RDBMS를 자주 사용했다.

RDBMS(관계형 데이터베이스)의 한계점
1. 데이터 스키마가 고정적이다.

스키마는 데이터베이스에 어떤 형식의 데이터를 넣을지에 대한 정보
데이터양이 많을때는 데이터베이스의 스키마를 변경하는 작업이 매우 번거로워질 수 있다.

  1. 확장성

저장하고 처리해야 할 데이터양이 늘어나면 분산시키는 것이 아니라 해당 데이터베이스 서버의 성능을 업그레이드하는 방식으로 확장해주어야 한다.

MongoDB

문서 지향적 NoSQL 데이터베이스

  • 문서의 데이터구조는 한 개 이상의 키-값 쌍으로 되어 있다.
  • 문서는 BSON(바이너리 형태의 JSON) 형태로 저장된다.

유동적인 스키마를 지닐 수 있다. 새로 등록해야 할 데이터 형식이 바뀐다고 하더라도 기존 데이터까지 수정할 필요는 없다. 또한 서버의 데이터양이 늘어나도 여러 컴퓨터로 분산하여 처리할 수 있도록 확장하기 쉽게 설계되어 있다.

무조건 RDBMS보다 좋은 것은 아니다.
데이터의 구조가 자주 바뀐다면 MongoDB가 유리할 수 있지만, 까다로운 조건으로 데이터를 필터링 해야하거나 ACID 특성을 지켜야 한다면 RDBMS가 유리할 수 있다.

ACID: 원자성(Atomicity), 일관성(Consistency), 고립성(Isolation), 지속성(Durability) (데이터베이스 트랜지션이 안전하게 처리되는 것을 보장하기 위한 성질)

컬렉션

여러 문서가 들어 있는 곳 (기존 RDBMS에서 테이블 개념으로 사용한다)
다른 스키마를 가지고 있는 문서들이 한 컬렉션에서 존재할 수 있다.

MongoDB 구조

서버 하나에 데이터베이스를 여러 개 가지고 있을 수 있다.
각 데이터베이스에는 여러 개의 컬렉션이 있으며, 컬렉션 내부에는 문서들이 들어 있다.

스키마 디자인

RDBMS는 스키마를 설계한다면 블로그 테이블, 댓글 테이블 만들어 JOIN해서 사용하는 것이 일반적이다.

MongoDB 스키마 디자인

{
  _id: ObjectId,
  title: String, 
  body: String,
  createdDate: Date,
  comments: [
    {
      _id: ObjectId,
      text: String,
      createdDate: Date,
    }
  ]
}

문서 내부에 또 다른 문서가 위치할 수 있는데 이를 서브 다큐먼트(Subdocument)라고 한다.
문서하나에는 최대 16MB만큼 데이터를 넣을 수 있다.

MongoDB 서버 준비

설치

$ brew tap mongodb/brew
$ brew install mongodb-community@5.0

m1 mac os의 경우에는 경로 문제가 발생할 수 있다.
$ arch -arm64 brew install mongodb-community@5.0로 진행했다.

MongoDB 실행

$ brew services start mongodb-community@5.0

$ mongo

Mongoose 설치 및 적용

  • MongoDB 기반 ODM(Object Data Mondelling) 라이브러리
  • 데이터베이스 문서들을 자바스크립트 객체처럼 사용할 수 있게 한다.

.env 환경변수 파일 생성

yarn add mongoose dotenv

dotenv는 환경변수들을 파일에 넣고 사용할 수 있게 하는 개발 도구
환경변수가 들어있는 파일들은 .gitignore를 작성하여 제외시켜 주어야 한다.

mongoose로 서버와 데이터베이스 연결

mongoose
  .connect(MONGO_URI, {
    useNewUrlParser: true,
    // useFindAndModify: false,
  })
  .then(() => {
    console.log('Conntected to MongoDB');
  })
  .catch((e) => {
    console.error(e);
  });

0개의 댓글