본문 바로가기
코딩과 알고리즘

몽고 DB ?! 기본 개념 & 연습 약간

몽고DB?
json DB!

오?!!

15여년 넘게 mysql, mssql, msaccess, dbaseIII+ 등의 관계형 DB만 접하다가 ( 최근에 오라클 약간.. )
몽고 DB 라는걸 만나게 되었습니다.

mysql 이나 mssql, 오라클은 모든 자료가 표의 형태이지요.
그리고 조인을 걸고 인덱스를 걸어 속도를 극대화 시킬 수 있는 특징이 있습니다.
이런 식으로 DB 튜닝을 하면 기존 서비스보다 5~20배 가량 속도가 향상되는 것을 자주 보아왔거든요.

하지만 몽고 DB를 얼마간 살펴보고 책자를 본 결과 확인된 것은 몽고 DB 는 트리형 구조라는 것입니다,
나무에 가지가 달려 있고, 또 그 가지에 여러 가지가 딸릴수 있는,
그것도 2진 트리가 아닌 다차원 트리가 지원되는 것입니다.

이런 트리(나무) 구조를 보면 항상 크레이는 이런 성경 말씀이 생각이 나지요 :)

나는 포도나무요 너희는 가지니
저가 내 안에, 내가 저 안에 있으면 이 사람은 과실을 많이 맺나니
나를 떠나서는 너희가 아무 것도 할 수 없음이라.

- 요한복음 15장 5절 말씀 -

사실은 윈도우 탐색기를 보아도 같은 생각이 납니다. 폴더 구조가 나무 구조거든요 ㅎㅎ
사용법을 보니 매우 흥미롭습니다.
MYSQL 과 비교하면 데이터베이스 - 테이블 - 행까지는 비슷합니다.

MYSQL 도 사실 따지고 보면,  요소까지는 트리구조라고 볼 수 있는데요.
그 크기가 가변적이기 때문이지요.

하지만 컬럼부터는 완전히 달라집니다.

몽고 DB는 컬럼의 요소를 자유자재로 늘려서 보관할 수도 있고, 컬럼 하위에 컬럼이 여러개 올 수도 있고 또 그 하위에 또 다시 여러 컬럼이 올 수 있습니다.
그러니 트리구조일 수 밖에요.

그리고 그 명칭은 관계형 데이터 베이스의 통상적인 명칭과는 좀 다릅니다.

우선 최상위 주제별로 묶어주는 데이터의 형태를 데이터베이스라고 하며 이 개념은 관계형 데이터베이스와 같습니다.
그 다음은 컬렉션(Collection)입니다. 관계형 데이터 베이스에서는 테이블(Table)에 대응되는 구조이며 하나의 데이터 베이스 내에 여러 개의 컬렉션이 올 수 있습니다.
그 다음을 도큐먼트(Document)라고 하는데, 하나의 컬랙션 내에 여러개의 도큐먼트가 올 수 있습니다.
그리고 이 도큐먼트는 또 다시 여러 도큐먼트를 포함할 수 있습니다.
다시 계속해서 그 여러 도큐먼트는 또 다른 여러 도큐먼트를 포함할 수 있습니다.
이론적으로 보자면 하위 계층 구조가 끝없이 나아 갈 수 있지만 아마도 물리적인 자원상 그 한계는 있겠지요.

하여간 이런식으로 자료를 무한정 입력할 수 있는 것입니다.

최근에 설치한 AWS 리눅스에서 몽고DB를 설치하고 약간의 경험을 해보았는데요.
리눅스에서의 맛보기 내용을 일부 공유합니다.

몽고DB 서비스가 서버에서 작동중이라는 가정하에.
몽고DB 에 진입하는 명령은 아래와 같습니다.

mongo

몽고 DB 콘솔 창에 들어왔는데요.
아래 명령을 내리면 현재 데이터 베이스 목록을 확인할 수 있습니다.

show dbs

admin, config, local 은 모두 몽고DB가 내부적으로 사용하는 것들입니다.

이제 데이터 베이스를 생성하고, 컬렉션을 만들어 봅시다.
그런데 몽고 DB는 기본적으로 데이터베이스를 만들 필요가 없습니다.
컬렉션도 만들 필요가 없습니다.
그냥 다큐먼트를 입력하는 순간 바로 데이터베이스, 컬렉션이 생겨나는 것이지요.

먼저 데이터 베이스를 선택합니다( 만들지도 않은 데이터베이스를..)
성적처리를 한다고 생각하고 score 데이터 베이스를 선택합니다.

use score

학생 컬렉션에 학생 '철수' 한명을 추가해주는데, 국어, 영어, 수학 점수까지 한꺼번에 추가해 줍니다,
참고로 db 는 현재 선택된 데이터베이스를 의미합니다. 현재는 score DB이지요.

db.student.insert( { name:'ChulSu', kor:80, eng:79, mat:40 } )

한명을 더 추가해 줍시다. '영수'라는 학생인데요. 철수와는 다르게 보너스 점수까지 추가하도록 합시다.
보너스 점수라니, 반칙 아닌가요? 특혜의혹?!

db.student.insert( { name:'YungSu', kor:70, eng:77, mat:60, bonus:10 } )

이제 입력된 데이터를 조회하는 명령어는 아래와 같습니다.

db.student.find()

그러면 아래와 같이 결과가 나오지요.
참고로 여기서 _id 값은 몽고DB가 자동으로 붙여주는 중복되지 않는 고유 일련번호입니다.

관계형 데이터베이스와 비교해볼때 말도 안되게 편리한 방법으로 자료를 입력할 수 있는 것이 몽고DB 의 특징입니다.
- 데이터베이스나 테이블, 컬럼의 자료형 등을 미리 정의할 필요가 없습니다.
- 각각의 도큐먼트는 그 항목들을 가변적으로 입력할 수도 있고 하지 않을 수도 있습니다.
- 자동증가 필드(auto increment) 필드 선언 필요 없이 기본적으로 필드가 붙습니다.

자료를 검색할 때는 아래와 같습니다.

철수를 찾으려면 name 이 ChulSu 인 사람을 찾습니다.

db.student.find({"name":"ChulSu"})

국어 점수가 70점인 학생을 찾는다면,
아래와 같이 검색합니다.

db.student.find({ kor: 70 })

범위형 검색도 가능합니다. 국어 점수가 60 점 이상 80점 이하인 경우만 $gte 와 $lte 를 사용해줍니다.
$gte 는 지정 숫자보다는 크거나 같은 자료를 검색하고 ( gte = greater than & equal )
$lte 는 지정 숫자보다는 작거나 같은 자료를 검색합니다. ( lte = lower than & equal )

db.student.find( { kor: { $gte:60, $lte:80 } } )

화면이 은근히 복잡해 보이는데 예쁘게 보려면 뒷 부분에 .pretty()를 추가해주면 됩니다.

db.student.find( { kor: { $gte:60, $lte:80 } } ).pretty()

결과 화면이 완전 깔끔하게 나왔습니다.
몽고DB의 기본 개념에 대해 다뤄보았는데 필요하신 분에게 도움이 되셨으려나요? :)

오늘도 여기까지 읽어주셔서 감사합니다.

 

반응형