MongoDB
안녕하세요~ 오늘은 Nosql DB 의 대표적으로 많이 활용되는 MongoDB 에 대해 알아볼게요
MongoDB 는 많은 분들이 아시다 싶이 json 기반으로 데이터를 저장합니다.
json 이라는 데이터 형식 특성상, 필드 추가/삭제가 용이하기 때문에 그만큼 데이터를 저장하는데에 있어서 조금 더 유연한 측면을 제공하죠.
만일 여러분들이 맡은 프로젝트에서 서비스가 점점 발전하고, 요구사항이 지속적으로 추가/변경 된다면 대처에 용이하게 하기 위해 mongoDB 를 솔루션으로 채택해볼 수 있습니다.
만일 이러한 상황에서 RDB 를 채택하면, RDB 는 힘들게 정한 데이터 모델링으로 Table 을 설계하고, 설계한 틀을 벗어나기에는 어려운 단점들이 있습니다.
그래서 요구사항이 계속 바뀌고 빠르게 대응할 때는 schema 가 없는 DB 를 선택하는 것이죠.
mongoDB 에서 collection 은 RDB 의 Table 과 같이 어떤 규칙을 기반으로 엄격하게 관리하는 느낌보다는
단순하게 데이터를 관리하는 단위 정도로 정의하는 느낌 정도로 관리하고 있습니다.
장점
MongoDB 는 document 기반의 데이터베이스를 제공하고 있기 때문에, 그만큼 제공해주는 여러가지 장점들이 있는데요
- 데이터 복제에 쉬운 편이기 때문에 고가용성을 제공합니다
- 데이터 복제에 용이하기 때문에 sharding 기반으로 좋은 성능을 제공할 수 있습니다
- schema 가 정해진 형태가 아니기 때문에 유연성, 확장성이 좋습니다
쉬운 데이터 복제라는 강점이 되게 많은 것을 제공하죠?
RDB 는 데이터를 복제하려면 연관관계에 있는 테이블을 또 만들고, 데이터를 옮기고 이러한 과정들이 필요했는데
document 는 그 자체만으로 모든 데이터가 포함되어 있어 그만큼 신경쓸게 덜 하다는 것이죠
복제가 쉽다는 것은 scale 조정 및 traffic 분산이 쉽다는 것을 의미하니 좋은 performance 로 이어지게 됩니다.
단점
완벽해보이는 MongoDB 이지만 아쉽게도 은근히 단점들이 많습니다. 세상에 완벽한 솔루션이라는 것은 존재하지 않으니까요
- MongoDB 는 Transaction 을 완벽하게 보장하지 않습니다. sharding 에 쉬운 솔루션을 채택했지만, Transaction 관리는 느슨한 방향을 선택하게 되었습니다.
- json 기반의 데이터라서, 서로 collection 간 join 을 지원할 수 없습니다. 억지로 할 수는 있지만 성능이 안좋아 사용하기 어렵습니다.
- json 기반의 데이터라서, 중복이 많이 발생할 수 있고 중복되는 데이터만큼 메모리 사용율이 높습니다.
쉽게 말씀드리면 json 기반의 데이터이기 때문에 갖는 한계성들이 드러나게 되는 것이죠.
더군다나 json 을 압축한 형태인 bson 으로 저장한다 하더라도 하나의 document 가 갖는 최대 size 는 16MB 로 제한되어 있습니다.
따라서 mongoDB 를 잘 쓰기 위해서는 document 를 적절하게 설계할 줄 알어야 하고, 고도의 transaction 이 요구되지 않는 상황에서 사용하기에 적합한 솔루션이라는 것을 알게 되었죠
설치하기
위에서 배운 장단점을 바탕으로 mongo db 를 간단하게 개발해볼 수 있게 container 기반으로 설치해보려고 합니다.
물론 mongo db 의 sharding 을 활용하기 위해서는 sharded cluster 로 운영해야 진가를 발휘할 수 있지만, 그만큼 VM 에 돈내면서 까지는 할 수 없으니 ㅎㅎ...
다행히도 mongoDB 를 container 로 설치하는 과정은 아주 쉽습니다.
먼저 mongoDB 의 image 를 가져옵니다.
docker pull mongo
그 다음 mongoDB 를 실행시키기 위해 local 에 있는 volume 과 매핑하여 데이터를 저장할 수 있도록 해봅시다.
docker run --name mongodb-container -v ~/data:/data/db -d -p 27017:27017 mongo
이제 container 에 들어가서 한번 접속해볼게요
docker exec -it mongodb-container /bin/bash
mongosh
그러면 위와 같이 접속하고, mongoDB version 과 shell version 이 나오면서 정상적으로 접근할 수 있게 됩니다.
이제 기본적인 접근자체는 성공한 것이고, application 에서 접근하기 위한 사용자를 한번 만들어볼게요.
use admin
db.createUser(
{
user: "root",
pwd: passwordPrompt(), // or cleartext password
roles: [
{ role: "userAdminAnyDatabase", db: "admin" },
{ role: "readWriteAnyDatabase", db: "admin" }
]
}
)
위와 같이 admin 으로 접근하고, user 에게 admin 권한을 부여했습니다.
물론 일반적으로 admin 권한을 막 부여하지는 않지만, 테스트의 편리성을 위해서네요 ㅎㅎ
Intellij 로 연결하기
드디어 마지막 단계입니다 ㅎㅎ
27017 port 로 open 을 해두었으니 연결해주고, 아까 지정한 User Password 를 세팅하여 설정하면 됩니다.
그래서 Test Connection 에 성공하면~
크게 어려운 과정 없이 성공했습니다~!
정리하며
전체적으로 mongoDB 의 특성을 기반으로 장단점을 알아보고, 간단하게 container 로 설치해보았는데요
항상 DB solution 이 그러하듯이 어떤 장단점을 기반으로 어떤 상황에서 사용할까? 에 대한 고민이 많이 들어가네요
따라서 게시글을 보는 여러분들도 내가 과연 적합한 상황에서 mongoDB 를 채택했는가? 에 대한 question 을 항상 하면서
판단하면 좋겠네요
참고자료
Introduction to MongoDB
Understanding the Pros and Cons of MongoDB
docker mongo
'Developer > Database' 카테고리의 다른 글
Database - Mysql 기반으로 Index 에 대해 Deep Dive 해보자 (0) | 2022.06.26 |
---|---|
Mysql Query Plan - Intellij 를 활용하여 Plan query 를 해보자 (0) | 2021.10.10 |
MySql - Master Slave Replication 구조 만들어보기 (0) | 2021.07.17 |
DataBase - 정규화 (0) | 2019.04.21 |
DataBase - Table, Object (0) | 2019.04.21 |