본문 바로가기

MongoDB

MongoDB란?-1편

MongoDB란?

humongous에서 유래한 이름으로 '~거대한'이란 뜻인데, 뜻 그대로 거대한 DB라는 의미를 담고 있다.

이름에도 나타나듯 거대한 데이터를 다루고 사용하는데 매우 큰 이점을 가진다.

MySQL이나 oracleDB와 같은 관계형 DB들은 데이터가 거대해지면, 꺼내오는 시간이 길어지고 확장성이 매우 비싸진다는 단점이 있다.

하지만 MongoDB는 수평적인 확장성이 매우 좋고(관계형 DB들은 수직적 확장을 많이하는데 가격이 비쌈, MongoDB는 수평적인 확장으로 가격이 쌈) 큰 데이터를 다루는데 매우 최적화 되어 있다.

그래서 국내 대기업들도 MongoDB를 사용하기 시작했다.

 

몽고DB, 네이버·카카오·NHN 등 국내 140여 기업 채택

출처:https://m.etnews.com/20190906000214

 

MongoDB특징

몽고디비는 RDBMS와 차이점이 크다.

관계형 DB와 다르게 SQL문을 사용하지않고 키와 벨류 두가지로 꺼내오고 넣는다.

RDBMS vs MongoDB 명칭 차이점

 

RDBMS와 다르게 테이블이나 Row, Column을 부르는 명칭도 다르다. 이 특징을 숙지 해놓자.

클라이언트 접속

  • MongoDB에 접속하는 가장 간단한 방법은 로컬 또는 원격 쉘에서 mongo 명령어를 실행하는 것이다. Windows 10에서 MongoDB Shell을 설치하고 실행하는 방법은 아래와 같다.
# MongoDB Shell 설치
$ choco install mongodb-shell -y

# mongosh로 원격지 데이터베이스 연결
$ mongosh "{uri}" --username "{username}" --password '{password}'
  • 평소에는 UI 기반 클라이언트가 확실히 쉘보다 편리하다. MongoDB Compass 또는 NoSQLBooster를 추천한다. [설치 링크]

데이터베이스

  • 데이터베이스는 MongoDB에서 가장 큰 데이터 단위이다. 하나의 MongoDB 노드(또는 클러스터)는 복수개의 데이터베이스로 구성된다.
### 현재 존재하는 데이터베이스 목록을 출력한다.
> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB

### 현재 사용 중인 데이터베이스를 출력한다.
> db

### 사용할 데이터베이스를 선택한다.
### 존재하지 않는 데이터베이스일 경우 새로 생성한다.
> use dbName

> use config
  • use 데이터베이스명 명령으로 사용할(접근할) 데이터베이스를 선택할 수 있다. 재미있는 점은, 현재 존재하지 않는 데이터베이스를 선택할 수 있다는 것이다.(즉, 별도의 데이터베이스 생성 명령 없이 암묵적으로 새 데이터베이스를 생성하는 것이다.) 해당 데이터베이스는 show dbs 명령으로 나타나지 않다가, 도큐먼트를 최초 생성하면 나타나게 된다.
### 현재 데이터베이스의 사용 현황을 bytes 단위로 조회한다.

> db.stats()
  • db.stats() 명령을 실행하면 현재 데이터베이스 사용 현황을 상세하게 확인할 수 있다.

컬렉션

Collection 예시 RDBMS의 Table과 똑같은 의미이다.

### 현재 데이터베이스에 저장된 컬렉션 목록을 출력한다.> show tables
> show collections
system.sessions

  • 데이터베이스는 복수개의 컬렉션의 집합으로 구성된다. show tables 또는 show collections 명령으로 현재 데이터베이스 저장된 컬렉션 목록을 확인할 수 있다.

도큐먼트

Document는 RDBMS의 ROW와 같은 뜻이다. 어렵지 않죠? 😊

 

### system.sessions 컬렉션의 도큐먼트 목록을 출력한다.> db.system.sessions.count()
> db.system.sessions.find()
{ "_id" : { "id" : UUID("8197a34f-310d-4132-b31e-3acf61058e3f"), "uid" : BinData(0,"47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=") }, "lastUse" : ISODate("2019-08-20T15:49:29.589Z") }

### system.sessions 컬렉션의 도큐먼트 목록을 보기 예쁘게 출력한다.> db.system.sessions.find().pretty()
{
        "_id" : {
                "id" : UUID("8197a34f-310d-4132-b31e-3acf61058e3f"),
                "uid" : BinData(0,"47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=")
        },
        "lastUse" : ISODate("2019-08-20T15:49:29.589Z")
}

인덱스

  • 전통적인 RDBMS와 마찬가지로 MongoDB 또한 퍼포먼스를 위해 자주 조회되는 필드에 대한 적절한 인덱스 생성이 필수적이다. MongoDB는 기본적으로 PK 역할을 수행하는 _id 필드에 대해 자동으로 인덱스를 생성한다.
### someCollection 컬렉션에 생성되어 있는 인덱스 목록을 조회한다.> db.someCollection.getIndexes()

### someCollection 컬렉션의 someField 필드에 대해 인덱스를 블록킹 방식으로 생성한다.### 명령 실행 후 인덱스 생성이 완료될 때까지 해당 컬렉션에 대한 모든 CRUD는 블록킹 된다.> db.someCollection.createIndex({someField:1})

### someCollection 필드에 대해 인덱스를 논블록킹 방식으로 생성한다.### 명령 실행 후 인덱스 생성이 진행 중이더라도 해당 컬렉션에 대한 모든 CRUD가 가능하다.> db.someCollection.createIndex({someField:1}, {background:1})

 

다음편에는 몽고디비의 구조와 쓰임에 대해서 알아보겠습니다!