이번시간에는 데이터를 저장하는 데이터베이스 역할을 해주는 mongoDB에 대해 알아보겠습니다. 웹서비스의 역할을 제대로 수행하기 위한 데이터를 저장하고 필요할때 열람해주는 것이 있어야하는데 이번 시간에 배울
mongoDB를 node.js에서 사용하게 해주는 mongoose라는 노드의 확장모듈을 배워보겠습니다.
mongoose란, mongoDB라는 NoSQL, 데이터 베이스를 지원하는 노드의 확장 모듈입니다. mongoose는 mongoDB의
ODM입니다. ODM은 Object Document Mapping의 약자로, 문서를 DB에서 조회할 때 자바스크립트 객체로
바꿔주는 역할을 해줍니다. mongoDB의 ODM에서는 mongodb-native등 여러가지가 있지만 그중 mongoose가
가장 많이 사용됩니다.
mongoose가 mongoDB를 사용하는 일종의 npm(node package manager)이기 때문에,mongose를 배우기전
mongoDB에 대해서 알아보도록 하겠습니다.
1.NoSQL
NoSQL(원래 의미: non SQL 또는 non relational) 데이터베이스는 전통적인 관계형 데이터 베이스 보다
덜 제한적인 일관성 모델을 이용하는 데이터의 저장 및 검색을 위한 매커니즘을 제공한다.
NoSQL 데이터베이스는 빅데이터와 실시간 웹 애플리케이션의 상업적 이용에 널리 쓰인다.SQL 계열 쿼리 언어를
사용할 수 있다는 사실을 강조한다는 면에서 "Not only SQL"로 불리기도 한다.
NoSQL의 분류는 다음과 같다.
- Wide Columnar Store : 카산드라
- Document Store : MongoDB
- Key-Value Store : 다이나모, 레디스
- Graph Store: Neo4j
그 중에서 유명한 것은 카산드라, MongoDB, Aws의 DynamoDB, Redis 정도로 볼 수 있다.
SQL과 NoSQL 비교
MySQL 용어 | mongoDB 용어/개념 |
database | database |
table | collection |
index | index |
row | JSON document |
column | JSON field |
join | embedding and linking |
primary key | _id field |
group by | aggregation |
mongoDB에서는 질의문이 모두 JSON(BSON) 객체로 표현된다. 그리고 데이터베이스에 접근하고
조정하는 구문은 자연어에 가까운 SQL에 비해 자바스크립트 문법에 가까운 모습을 보인다.
SQL 구문 | mongoDB 구문 |
CREATE TABLE USERS(a Number, b Number) | db.createCollection("mycoll") |
INSERT INTO USERS VALUES(3,5) | db.users.insert({a:3, b:5}) |
SELECT * FROM users | db.users.find() |
SELECT a,b FROM users WHERE age=20 | db.users.find({age:20}, {a:1, b:1}) |
SELECT *FROM users WHERE age=20 ORDER BY name | db.users.find({age:20}).sort({name:1}) |
성능면과 확장성 면에서 NoSQL이 SQL보다 우수한 편이다. 또한 유연하고 복잡성이 낮은 것이 특징이다.
하지만 마냥 좋은점만 있는 것이 아니다. ACID 트랜젝션(원자성/일관성/고립성/영구성)을 보장받기 위해
RDBMS를 쓰는 편이 좋다. 가령 은행업무나 회사업무같은 중요한 DB는 RDBMS를 쓰는 것을 권장하고 있다.
MongoDB 란?
MongoDB는 C++로 작성된 오픈소스 문서지향(Document-Oriented) 크로스 플랫폼 데이터베이스이다.
1. Document
Document는 RDBMS에서의 Row(혹은 Tuple)과 동일한 개념, 예를 들어서 아래와 같은 JSON 형태의
key-value가 쌍으로 이루어진 데이터 구조를 하나의 Document라고 보면 된다.
{
"_id": "5d2sd23fd415135e53151355b",
"username": "홍길동,
"hashedPassword": "비밀번호",
}
각 Document는 _id를 갖고 있는데 이 값은 유일하다. Primary Key랑 동일한 개념이다.
특이하게도 RDBMS처럼 스키마로 정해진 뭔가가 없다. 따라서 username, hashedPassword 밑에다가
email을 추가한 Document를 새로 생성해도 문제 없이 동작한다.
2. Collection
Collection은 Document의 그룹이다. RDBMS로 따지자면 Table과 비슷한 개념, 다만 위에서 말했듯이
스키마를 가지고 있지 않다.
3.Database
Database는 Collection들의 물리적인 컨테이너이자 가장 상위 개념이다. RDBMS에서의 Database와 동일하다.
Q. MongoDB에서 Join은?
RDBMS에서는 항상 Join이 일반적으로 많이 사용한다. 그렇다면 MongoDB도 Join이란 개념이 있을까?
불가능하지는 않지만 일반적으로 그렇게 쓰지는 않는다.
post와 comment가 있다고 가정해보자. post하나에 comment가 여러개 있으니 1대다 관계이다.
따라서 RDBMS를 썻다면 2개의 테이블로 분리시켯을 것이다. 하지만 MongoDB는 분리시키지 않는
대신 post 내부에 comment를 너흔다. 이를 서브다큐먼트라고 한다.
따라서 아래와 같은 형태가 나오게 된다.
{
_id: POST_ID,
title: POST_TITLE,
content: POST_CONTENT,
username: POST_WRITER,
tags: [ TAG1, TAG2, TAG3 ],
comments: [
{
username: COMMENT_WRITER,
mesage: COMMENT_MESSAGE,
time: COMMENT_TIME
},
]
}
출처 : https://velopert.com/436
참고 자료
'백엔드 > MongoDB' 카테고리의 다른 글
[Ubuntu] MongoDB 설치하기 (ubuntu 20.04) (0) | 2022.04.01 |
---|