토이 프로젝트 진행하면서 OpenAPI를 사용하는데, 요청 수 제한이 있어, 클라이언트에서 많은 요청들을 계속하여 호출하는데 무리가 있었다. (429 Too Many Requests)
백엔드 서버에서 스케줄링을 통해 데이터베이스에 API 정보를 저장한다면, 문제를 해결할 수 있을 것 같았다.
OpenAPI를 사용하다보니 RDBMS로는 데이터 정보 구조를 정의하고 관리하기에는 무리가 있을 것 같아, 비정형화 데이터를 저장할 수 있는 NoSQL을 사용하기로 했다.
오래전에 Firebase(Only 클라우드 서비스, 비용 발생 가능성)를 통해 NoSQL을 접해본 적은 있지만, 가장 많이 사용하는 NoSQL인MongoDB를 접해보고 싶었고, 환경을 직접 구축(On-premise)해보는 경험을 해보기로 했다.
NoSQL 이란?
- non SQL, non relational SQL, not only SQL 와 같은 의미로 해석된다. SQL을 사용하지 않는다는 의미보다 SQL만을 사용하지 않는 데이터베이스 관리 시스템(DBMS)이다.
- NoSQL에 대한 구체적인 정의는 없지만, 공통적인 성향이 있다.
- 대부분 클러스터(하나의 클러스터에서 여러개의 서버를 이용하도록 설계)에서 실행할 목적으로 만들어졌기 때문에 관계형 모델을 사용하지 않는다.
- 분산 환경에서 노드(서버)들이 잘 작동할 때, 하나의 노드 시스템에 장애가 났을 때, 문제를 해결하기 좋다.
- Schema-less, 스키마(구조에 대한 정의) 없이 동작한다. 따라서 데이터 구조를 미리 정의할 필요가 없으며, 시간이 지나더라도 언제든지 바꿀 수 있기 때문에 비형식적인 데이터를 저장하는 데 용이하다.
- 비일관성(Inconsistency), 게임의 로그 같은 데이터들은 매 초마다 엄청난 양이 생성되지만 한번 저장되고 난 뒤에는 수정될 일이 거의 없다. 이런 데이터의 일관성을 보장하기 위해 ACID 트랜잭션을 지원할 필요는 없다.
- 다수가 동시에 읽고 쓰는 (Read and Write) 상황에 좋다.
- 대부분 클러스터(하나의 클러스터에서 여러개의 서버를 이용하도록 설계)에서 실행할 목적으로 만들어졌기 때문에 관계형 모델을 사용하지 않는다.
- 데이터와 트래픽이 증가함에 따라 RDBMS에서는 원활한 데이터 처리가 어려워졌다. 이를 해결하기 위해 장비의 성능을 키우는 수직적 확장(Scale-up)은 비용적인 문제가 발생한다. NoSQL에서는 수평적 확장(Scale-out)을 통해 성능을 올리기 쉽다.
MongoDB 란?
- NoSQL DBMS의 한 종류이고, Document 모델을 사용한다.
- mongo는 humongous를 줄인 표현이다. '겁나 큰 DB' 라는 뜻.
장점
- Schema-less 구조로 다양한 형태의 데이터 저장이 가능하고, 데이터 모델의 유연한 변화가 가능하다.
- Read/Write 성능이 뛰어나다.
- 수평적 확장(Scale-out) 구조로 많은 데이터 저장이 가능하고 장비 확장이 간단하다.
- JSON 구조로 데이터를 직관적으로 이해 가능하다.
단점
- 데이터 업데이트 중 장애 발생 시, 데이터 손실이 가능하다.
- 많은 인덱스 사용 시, 충분한 메모리가 필요하다.
- 데이터 공간 소모가 RDBMS에 비해 많다. (중복 key, 데이터 발생 가능)
- ACID 트랜잭션 지원이 RDBMS 대비 미약하다.
1. 몽고디비 설치 명령어
brew tap mongodb/brew
brew install mongodb-community
2. 서비스 명령어
# start
brew services start mongodb/brew/mongodb-community
mongod # deamon 프로세스로 실행. 백그라운드에서 실행
# stop
brew services stop mongodb/brew/mongodb-community
# 위 명령어로 실행하면서 오류가 계속 발생하였음
sudo su # 관리자 모드로 접속하여 아래 명령어를 통해 실행함
brew services # 서비스 확인
brew services start mongodb-community
brew services stop mongodb-community
이후 mongo shell 접속하기 위해, mongo 명령어를 통해 접속하려 했지만 실패하였다.
MongoDB 문서를 참고하여, mongosh 명령어로 접속할 수 있었음
mongosh
3. MongoDB-Compass 설치
brew install cask
brew install mongodb-compass
4. Mongo Shell 명령어
db # 현재 사용중인 DB 확인
show dbs # DB 리스트 확인. 처음 db 명령어를 통해 확인한 DB를 확인할 수 없는데, 최소 1개의 Document 를 추가해야함
use <database name> # DB 접속
db.foo.insertOne({name:"foo"}) # 데이터 추가하기. collection은 foo로 추가, 명령어 맨 앞의 db의 현재 DB를 뜻함
db.foo.find() # 데이터 확인
show collections # collection 확인
# 1개의 데이터 추가
db.collection.insertOne({document}
# 여러 데이터 추가
db.collection.insertMany([{document1},{document2}...])
4. 데이터베이스, 계정 생성
# root 권한 계정 생성
use admin # admin DB 접속
db.createUser({ user:"sejin", pwd:"******", roles: ["root"] })
# root 계정으로 shell 진입
mongosh admin -u sejin -p ******
use project # 데이터베이스 생성(create), 전환(switched)
db.createUser({user:"user", pwd:"******", roles:["dbOwner"]}) # 일반 계정 생성
# 생성한 일반 계정 확인
db.getUsers()
'데이터베이스 > MongoDB' 카테고리의 다른 글
[CentOS7] MongoDB 환경 구성 (네트워크, 보안 설정) (1) | 2024.04.19 |
---|---|
[NoSQL] NodeJS + MongoDB(mongoose) (0) | 2022.09.12 |