on1ystar 머릿속을 정리, 기록하는 곳

Node.js/Express MongoDB(몽고디비)/Mongoose(몽구스)



의문점이나 지적 등의 관심 및 조언을 위한 댓글이나 메일은 언제나 환영이고 감사합니다.


☄ What is MongoDB



mongodb

최신 애플리케이션 개발자와 클라우드 시대를 위해 구축된 범용(general purpose), 문서 기반(document-based), 분산 데이터베이스(distributed database)

MongoDB의 가장 큰 특징은 NoSQL로, JSON과 유사한 문서에 데이터를 저장하는 문서 데이터베이스라는 점이다. 특히 Node.js에서 데이터를 주로 객체 형태로 사용하고, 클라이언트와의 데이터 통신에서도 주로 JSON 타입이 사용되기 때문에 일관성을 느껴 편리하다.


SQL(일반적인 RDB) vs NoSQL(MongoDB)

  • 스키마에 맞게 데이터 저장 vs 스키마 없이 자유로운 데이터 저장

NoSQL에는 고정된 테이블 스키마가 없다. 그에 상응하는 collection(RDB에서의 table)이란 개념은 있지만 column을 따로 정의하지 않는 대신 어떠한형태의 데이터도 document(RDB에서의 row)에 들어갈 수 있다.

  • JOIN 지원 vs 미 지원

MongoDB는 JOIN 기능이 없다. 사실 RDB에서의 불필요한 JOIN으로 인한 성능 저하를 줄이기 위해 이를 최소하하기 위함이다. 하지만 그에 따른 불편한도 분명 따른다.

  • 안정성, 일관성 vs 확장성, 가용성

다양한 종류의 데이터를 제약 없이 문서로 저장할 수 있기 때문에 일관성이 약한 대신 대량의 데이터를 빠르게 넣고 분산시킬 수 있기 때문에 확장성이나 가용성 면에서 강점이 있다.

  • 데이터베이스 구조

https://phoenixnap.com/kb/wp-content/uploads/2021/04/mongodb-vs-mysql-database-structure.png

https://phoenixnap.com/kb/mongodb-vs-mysql


더 자세한 비교는 https://www.mongodb.com/compare/mongodb-mysql를 참고하면 좋을 것 같다.


☄ MongoDB 설치 및 실행



로컬에서 무료로 사용하려면 On-premises의 Community Server를 선택해 설치하면 된다.

설치가 완료 되었으면 C:\data\db 폴더를 만들어야 한다.

그 다음 MongoDB가 설치된 경로(보통 C:\Program Files\MongoDB\Server\4.4\bin)로 가서 mongod를 실행한다. 에러 메세지 없이 텍스트가 쭉 입력되면 잘 실행된 것이다.

mongod를 실행시켜 놓은 상태에서 mongo.exe를 실행하거나 같은 폴더에서 mongo를 입력해야 mongodb 콘솔에 접속할 수 있다. (따라서 환경 변수로 설정해 놓는 것이 편함)

그리고 위에 보이는 mongodb://127.0.0.1:27017/가 나중에 node에서 입력해야할 mongodb 접속 경로다.

  • show dbs를 입력하면 데이터베이스 목록을 확인할 수 있다.

위 3개의 데이터베이스는 default로 생성되어 있는 db다.


☄ Mongoose



몽구스(Mongoose)는 비동기 환경에서 작동하도록 설계된 몽고DB 객체 모델링 도구

mongoose는 쉽게 말해 mongodb를 node 환경에서 편리하게 사용할 수 있도록 여러 기능을 제공해 주는 관리 도구다.

예를 들어 js코드로 mongodb를 접속하고 CRUD를 수행하게 해 주거나, ODM(Object Document Mapping)으로써 mongodb의 document를 조회할 때 JavaScript의 객체에 맞게 바꿔주는 역할을 해 준다.

mongoose 설치

  • npm install mongoose

링크 참조: https://www.npmjs.com/package/mongoose

그 다음 현재 작업 디렉토리에 아래와 같은 파일을 작성한다.

// db.js
import mongoose from "mongoose";

mongoose.connect("mongodb://127.0.0.1:27017/wetube", {
  useNewUrlParser: true,
  useUnifiedTopology: true,
});

const db = mongoose.connection;

db.once("open", () => console.log("✅ Connected to DB"));
db.on("error", (error) => console.log("❌ Connection error. "));
db.on("disconnected", () => console.log("❗ Lost connection to DB server"));

mongoose.connect은 node에서 mongodb와 연결하는 함수로 mongodb://127.0.0.1:27017/[database]를 첫 번째 인자로 준다. 아직 database를 생성하지 않았어도 실행된다. 두 번째 인자인 useNewUrlParser: true, useUnifiedTopology: true는 사실 당장은 의미 없지만 WARN 에러가 뜨기 떄문에 입력해 준다.

mongoose.connection로 db에 연결된 객체를 생성할 수 있다.

db.once는 몽구스 커넥션 객체에 이벤트 리스너를 달 수 있는데, 처음 연결됬을 때 한 번 호출한 뒤 다시 리스닝 하지 않는다.

db.on은 지속적으로 리스닝하는 함수로 에러가 발생했을 때나 연결이 끊어졌을 때 메세지를 출력하도록 했다.

서버와 같이 실행하기 위해서는 서버가 실행되는 파일에 단지 위 파일 경로만 import 해 주면 같이 실행된다.

// server.js
import "./db";

// ... 생략


Reference

https://nomadcoders.co/wetube

Node.js 교과서(2판) - 조현영

https://www.mongodb.com/

https://mongoosejs.com/docs/index.html