SQL

Sql(Structured Query Language)라는 단어는 자주 접하는 단어이지만
생각해보면 업무용어로는 생각보다 자주 써본 기억은 없는것 같습니다.
MSSQL, MySQL등 특정 RDBMS의 이름을 부를때 외에는 말이죠.
의미상으로 ‘RDBMS에서 사용하는 언어’이므로
쿼리를 작성할때에 변수의 이름으로 자주 사용하기도 합니다.

NoSQL?

그렇다면 NoSQL이라는건 뭘까요?
용어의 가장 강조되는 의미는 ‘SQL이 아닌것(Not only SQL)‘이라고 합니다.
다시말해 RDBMS가 아닌것은 모두 NoSQL입니다.
그래서 NoSQL이라고 통칭하는 DBMS들은 그들 내에서도 상이한 모습을 하고 있는데요
공통적인 특징으로는 유연한 설계 / 높은 수평 확장성이 있습니다.
이번에는 MongoDB를 훑어보면서 NoSQL이 어떻게 활용 될 수 있을지 알아보겠습니다.

MongoDB

NoSQL 데이터베이스는 크게 네가지로 나눌수 있습니다.

Key-value
Document
Column-family
Graph

각 유형의 상세설명은 참고자료에서 확인 가능합니다.
MongoDB는 Document형식의 데이터베이스입니다.
보통 Document는 JSON과 유사한 형태로 저장되며 해당 데이터 형태를 활용한 쿼리를 작성할 수 있습니다.

Setting

Docker로 DB를 세팅해보신 분들은 이미 알고 계시겠지만 Official Image와 docker-compose를 활용하면 아주 간단하게 로컬에 DB를 세팅할수 있습니다.

docker-compose.yml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
version: "3.9"

services:  
  db:  
    image: mongo    
    restart: always    
    container_name: mongo    
    ports:
      - "27017:27017"    
    environment:       
      MONGO_INITDB_ROOT_USERNAME: var_root
      MONGO_INITDB_ROOT_PASSWORD: password
      MONGO_INITDB_DATABASE: var_db
    volumes:
      - ./data/mongodb:/data/db

이제 로컬에 mongoDB가 생성되었습니다.

python에서 MongoDB 사용해보기

python으로 간단하게 MongoDB를 사용해보겠습니다.

먼저 pymongo를 설치해야 합니다.

1
pip install pymongo

1. 접속해보기

1
2
3
4
5
from pymongo import MongoClient

client = MongoClient(host='localhost', port=27017,username='var_root',password='password')

print(client.list_database_names())

결과

[‘admin’, ‘config’, ’local’]

2. 데이터 입력 / 조회 / 삭제

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
from pymongo import MongoClient

client = MongoClient(host='localhost', port=27017,username='var_root',password='password')

test_db = client['test_db']
collection = test_db['test_collection']

# 단일 Documents 추가
result = collection.insert_one({
    "name" : "peter parker",
    "age" : 16
})

print('insert_one id 출력')
print(result.inserted_id)

print('Collection 리스트 조회')
print(test_db.list_collection_names())

print('Collection 내 단일 Document 조회')
print(collection.find_one({"name":"peter parker"}))

# 여러 Documents 추가
result = collection.insert_many(
    [
        {
            "name" : "Mary Jane",
            "age" : 16
        },
        {
            "name" : "Octavius",
            "age" : 42
        }
    ]
)

print('insert_many ids 출력')
print(result.inserted_ids)

print('컬렉션 내 도큐먼트 수 조회')
print(collection.count_documents({}))

print('Collection 내 모든 Documents 조회')
for Character in collection.find():
    print(Character)

collection.delete_one({"name":"Octavius"})
print('단일 Documents 삭제')
print(collection.count_documents({}), "documents count")

x = collection.delete_many({})
print('전체 Documents 삭제')
print(x.deleted_count, "documents deleted")
print(collection.count_documents({}), "documents count")

결과

insert_one id 출력
62565e33eee36ebd6b7fd21e

Collection 리스트 조회
[’test_collection’]

Collection 내 단일 Document 조회
{’_id’: ObjectId(‘62565e33eee36ebd6b7fd21e’), ’name’: ‘peter parker’, ‘age’: >16}

insert_many ids 출력
[ObjectId(‘62565e33eee36ebd6b7fd21f’), ObjectId(‘62565e33eee36ebd6b7fd220’)]

컬렉션 내 도큐먼트 수 조회
3

Collection 내 모든 Documents 조회
{’_id’: ObjectId(‘62565e33eee36ebd6b7fd21e’), ’name’: ‘peter parker’, ‘age’: >16}
{’_id’: ObjectId(‘62565e33eee36ebd6b7fd21f’), ’name’: ‘Mary Jane’, ‘age’: 16}
{’_id’: ObjectId(‘62565e33eee36ebd6b7fd220’), ’name’: ‘Octavius’, ‘age’: 42}

단일 Documents 삭제
2 documents count

전체 Documents 삭제
2 documents deleted
0 documents count

간단한 테스트 코드 입니다만 주요 기능들은 다 테스트 되었습니다.
재미있는 점은 코드실행전 저는 데이터베이스를 생성하지도 collection을 정의하지도 않았다는 것입니다.
다시말해 RDBMS에서의 DDL(Data Definition Language)가 위 테스트 코드에서는 전혀 필요 하지 않았다는 것이지요.

용법도 아주 단순하고 심플합니다.

활용

MongoDB를 서비스에서 어떻게 활용가능 할까요?
확장성이 용이하기 때문에 주로 로그등 대량의 데이터를 저장하는데 사용하고 있습니다.
또한 정적인 스키마를 사용하지 않으므로 프로젝트 초기 프로토타입 작성시 활용해볼만 한것 같습니다.
저희 토이 프로젝트에서는 스크래핑한 데이터의 원본 저장을 위해 사용하고 있습니다.

단점

RBMS와 NoSQL(정확하게는 MongoDB)의 차이는 객체지향 언어와 비객체지향 언어의 차이와 유사한 느낌이었습니다.
정적인것과 유연한것 어느쪽으로 가든 장단점이 있죠
실제로 서비스에서 MongoDB를 사용한다면 그 유연함 때문에 비용상승을 초래 할수 있을것 같습니다.

DBMS Rank

DBMS RANK를 보여주는 사이트가 있다는걸 알고 계신가요??
DBMS 랭킹 보러가기
해당 사이트에 가보면 오늘 2022년 4월 13일 기준 TOP 10 DBMS는 다음과 같습니다.

RankDBMSDatabase Model
1.OracleRelational, Multi-model
2.MySQLRelational, Multi-model
3.Microsoft SQL ServerRelational, Multi-model
4.PostgreSQLRelational, Multi-model
5.MongoDBDocument, Multi-model
6.RedisKey-value, Multi-model
7.ElasticsearchSearch engine, Multi-model
8.IBM Db2Relational, Multi-model
9.Microsoft AccessRelational
10.SQLiteRelational

전통적으로 많이 사용하는 RDBMS가 강세인 가운데 NoSQL은 3개정도로 보이는데요
오늘 알아본 MongoDB는 4위네요
오라클은 그렇게도 비싼데 왜 1위지

어떤 DBMS가 있는지 어떤걸 많이 쓰는지 궁금하신분들은 들어가서 확인해보시면 되겠습니다.

마무리

MongoDB는 그나마 NoSQL에서도 잘 살아남았다고 평가되는 DBMS인데요
사용해보니 유연함 뿐만아니라 성능튜닝도 가능한 점 등등 꽤 매력적인 DBMS인것 같습니다.
잘 활용하면 더 좋은 시스템을 만들수 있을것 같습니다.

참고자료