mongo db 시작하기
DESCRIPTION
TRANSCRIPT
![Page 1: Mongo db 시작하기](https://reader035.vdocuments.net/reader035/viewer/2022081720/54044cd48d7f729b768b4691/html5/thumbnails/1.jpg)
MongoDB 시작하기
온라읶서버제작자모임 – 이욱진(노비스)
minjin00 at gmail.com
@novice81
![Page 2: Mongo db 시작하기](https://reader035.vdocuments.net/reader035/viewer/2022081720/54044cd48d7f729b768b4691/html5/thumbnails/2.jpg)
NOSQL?
![Page 3: Mongo db 시작하기](https://reader035.vdocuments.net/reader035/viewer/2022081720/54044cd48d7f729b768b4691/html5/thumbnails/3.jpg)
NoSQL?
• In computing, NoSQL (sometimes expanded to "not only SQL") is a broad class of database management systems that differ from the classic model of the relational database management system (RDBMS) in some significant ways. These data stores may not require fixedtable schemas, usually avoid join operations, and typically scale horizontally. Academic researchers typically refer to these databases as structured storage,[1][2][3][4] a term that includes classic relational databases as a subset.
– Not only SQL
– 고젂적 RDBMS과 의미있는 차별을 둔 DBMS의 넓은 한 영역
– 고정형 Table Schema 불필요
– 보통 join 동작을 지원하지 않음
– 보편적으로 수평 확장 가능
![Page 4: Mongo db 시작하기](https://reader035.vdocuments.net/reader035/viewer/2022081720/54044cd48d7f729b768b4691/html5/thumbnails/4.jpg)
CAP Theorem
• Consistency – 각 클라이언트는 항상 같은 결과를 제공
• Availability – 모든 클라이언트는 항상 인기 / 쓰기가 가능
• Partition tolerance – 시스템이 물리적 네트워크로 분할된 상태에서 정상 동작
• 모든 분산 시스템은 이 중 2가지 속성만 지원 가능
![Page 5: Mongo db 시작하기](https://reader035.vdocuments.net/reader035/viewer/2022081720/54044cd48d7f729b768b4691/html5/thumbnails/5.jpg)
CAP Theorem
• CA (Consistent, Available) System – 분할 문제를 가지고 있고 보편적으로 replication으로 처리
• CP (Consistent, Partition - Tolerant) System – 분할된 노드갂 읷관성 있는 데이터를 확보하는 동안 사용 불가
• AP (Available, Partition – Tolerant) System – replication과 검증을 통해 시갂이 지나면 결국 무결성을 보장
![Page 6: Mongo db 시작하기](https://reader035.vdocuments.net/reader035/viewer/2022081720/54044cd48d7f729b768b4691/html5/thumbnails/6.jpg)
![Page 7: Mongo db 시작하기](https://reader035.vdocuments.net/reader035/viewer/2022081720/54044cd48d7f729b768b4691/html5/thumbnails/7.jpg)
MONGO Mongodb 에 대해 알아보아요
![Page 8: Mongo db 시작하기](https://reader035.vdocuments.net/reader035/viewer/2022081720/54044cd48d7f729b768b4691/html5/thumbnails/8.jpg)
Development of MongoDB began in October 2007 by 10gen. The first public release was in February 2009.[2]
- 2007.10. 개발 시작
- 2009. 2. 공식버젂 릴리즈
![Page 9: Mongo db 시작하기](https://reader035.vdocuments.net/reader035/viewer/2022081720/54044cd48d7f729b768b4691/html5/thumbnails/9.jpg)
http://www.mongodb.org/ says :
MongoDB (from "humongous") is a scalable, high-performance, open source, document-oriented database. Written in C++.
![Page 10: Mongo db 시작하기](https://reader035.vdocuments.net/reader035/viewer/2022081720/54044cd48d7f729b768b4691/html5/thumbnails/10.jpg)
![Page 11: Mongo db 시작하기](https://reader035.vdocuments.net/reader035/viewer/2022081720/54044cd48d7f729b768b4691/html5/thumbnails/11.jpg)
SQL vs MongoDB
MySQL MongoDB
database database
table collection
index index
row BSON document
column BSON field
join embedding and linking
primary key _id field
![Page 12: Mongo db 시작하기](https://reader035.vdocuments.net/reader035/viewer/2022081720/54044cd48d7f729b768b4691/html5/thumbnails/12.jpg)
SQL vs MongoDB
MySQL MongoDB
database database
table collection
index index
row BSON document
column BSON field
join embedding and linking
primary key _id field
![Page 13: Mongo db 시작하기](https://reader035.vdocuments.net/reader035/viewer/2022081720/54044cd48d7f729b768b4691/html5/thumbnails/13.jpg)
문서 기반의 저장 Document-oriented storage
![Page 14: Mongo db 시작하기](https://reader035.vdocuments.net/reader035/viewer/2022081720/54044cd48d7f729b768b4691/html5/thumbnails/14.jpg)
![Page 15: Mongo db 시작하기](https://reader035.vdocuments.net/reader035/viewer/2022081720/54044cd48d7f729b768b4691/html5/thumbnails/15.jpg)
document를 넣어보자
![Page 16: Mongo db 시작하기](https://reader035.vdocuments.net/reader035/viewer/2022081720/54044cd48d7f729b768b4691/html5/thumbnails/16.jpg)
Browser Shell?
![Page 17: Mongo db 시작하기](https://reader035.vdocuments.net/reader035/viewer/2022081720/54044cd48d7f729b768b4691/html5/thumbnails/17.jpg)
document를 넣어보자
> db.foo.insert( {
Time : new Date(), Charname : "mongo", LogType : { T1 : "Item", T2 : "Pick" }, ItemName : "아테네의 영혼이 깃든 검", ItemCount : 1
} ) >"ok"
![Page 18: Mongo db 시작하기](https://reader035.vdocuments.net/reader035/viewer/2022081720/54044cd48d7f729b768b4691/html5/thumbnails/18.jpg)
document를 넣어보자
> db.foo.find() [
{ "_id" : { "$oid" : "4ecf0a02cc93741aef0755df" },
"LogType" : { "T1" : "Item", "T2" : "Pick" }, "Time" : "Fri Nov 25 2011 12:22:40 GMT+0900 (대한민국 표준시)", "ItemCount" : 1, "Charname" : "mongo", "ItemName" : "아테네의 영혼이 깃든 검", }, { "_id" : { "$oid" : "4ecf0a7acc93741aef0755e4" },
"LogType" : { "T1" : "Item", "T2" : "Pick" }, "Time" : "Fri Nov 25 2011 12:24:40 GMT+0900 (대한민국 표준시)", "ItemCount" : 1, "Charname" : "mongo2", "ItemName" : "아테네의 영혼이 깃든 검", }
]
![Page 19: Mongo db 시작하기](https://reader035.vdocuments.net/reader035/viewer/2022081720/54044cd48d7f729b768b4691/html5/thumbnails/19.jpg)
document를 넣어보자
> db.foo.findOne() { "_id" : { "$oid" : "4ecf3028cc93741aef0756bf" }, "Time" : "Fri Nov 25 2011 15:05:28 GMT+0900 (대한민국 표준시)", "ItemCount" : 1, "Charname" : "mongo", "LogType" : { "T1" : "Item", "T2" : "Pick" }, "ItemName" : "아테네의 영혼이 깃든 검" }
![Page 20: Mongo db 시작하기](https://reader035.vdocuments.net/reader035/viewer/2022081720/54044cd48d7f729b768b4691/html5/thumbnails/20.jpg)
Document-oriented storage
• 장점
– 하나의 Collection(Table)에 서로 다른 구조의 Document(Row) 입력 가능
– 형태가 다른 데이터를 별도의 작업 없이 보관 가능
![Page 21: Mongo db 시작하기](https://reader035.vdocuments.net/reader035/viewer/2022081720/54044cd48d7f729b768b4691/html5/thumbnails/21.jpg)
Document-oriented storage
• 단점
– 정형화된 구조가 아니기 때문에 구조를 나타내는 식별자 필요
– Application Code 유지보수 복잡도 증가 가능성 존재
![Page 22: Mongo db 시작하기](https://reader035.vdocuments.net/reader035/viewer/2022081720/54044cd48d7f729b768b4691/html5/thumbnails/22.jpg)
설치 그런데 계속 Browser Shell 에서 작업하나요? -_-;
![Page 23: Mongo db 시작하기](https://reader035.vdocuments.net/reader035/viewer/2022081720/54044cd48d7f729b768b4691/html5/thumbnails/23.jpg)
MongoDB 실행
• 적젃한 버젂을 다욲로드 – http://www.mongodb.org/downloads
• 압축 해제
• 기본 폴더 생성 – md c:\data\db (윈도우 기준)
• mongod 실행 – 압축해제폴더\bin\mongod.exe
![Page 24: Mongo db 시작하기](https://reader035.vdocuments.net/reader035/viewer/2022081720/54044cd48d7f729b768b4691/html5/thumbnails/24.jpg)
MongoDB 실행 옵션
• --dbpath – 데이터 파읷 위치 조정
• -- port – open 되는 포트 조정
– port 로 입력한 값 + 1000번 위치에 Web Interface 열림
– 이미 열려있는 포트가 있으면 실패
• 실행
cmd> mongod.exe --dbpath “D:\Data\DB” --port “9000”
![Page 25: Mongo db 시작하기](https://reader035.vdocuments.net/reader035/viewer/2022081720/54044cd48d7f729b768b4691/html5/thumbnails/25.jpg)
윈도우 서비스로 설치
• mongodb 실행파읷들을 원하는 폴더에 위치시킴
• 명령 프롬프트 실행 – 사용자 계정 컨트롤이 반영된 윈도우에서는 관리자로 실행
• Data – D:\mongodb\data 위치로 가정
• 완료 후 "net start mongodb" 명령으로 서비스 시작
cmd> mongod --install --logpath ".\log.txt" --dbpath "d:\mongodb\data“ --port 9000
![Page 26: Mongo db 시작하기](https://reader035.vdocuments.net/reader035/viewer/2022081720/54044cd48d7f729b768b4691/html5/thumbnails/26.jpg)
윈도우 서비스로 설치 옵션
• --install : 서비스 설치시 반드시 필요
• --logpath : 서비스 설치시 반드시 필요 (작성될 로그 파읷명)
• --dbpath : 서비스에 의한 데이터 폴더 위치 (젃대경로) – (미입력시 기본값 C:\data\db)
• --port : mongodb 서비스 port
![Page 27: Mongo db 시작하기](https://reader035.vdocuments.net/reader035/viewer/2022081720/54044cd48d7f729b768b4691/html5/thumbnails/27.jpg)
윈도우 서비스로 설치 결과
cmd> type log.txt
Creating service MongoDB.
Service creation successful.
Service can be started from the command line via 'net start "MongoDB"'.
Mon Nov 28 14:21:05 dbexit:
Mon Nov 28 14:21:05 shutdown: going to close listening sockets...
Mon Nov 28 14:21:05 shutdown: going to flush diaglog...
Mon Nov 28 14:21:05 shutdown: going to close sockets...
Mon Nov 28 14:21:05 shutdown: waiting for fs preallocator...
Mon Nov 28 14:21:05 shutdown: lock for final commit...
Mon Nov 28 14:21:05 shutdown: final commit...
Mon Nov 28 14:21:05 shutdown: closing all files...
Mon Nov 28 14:21:05 closeAllFiles() finished
Mon Nov 28 14:21:05 dbexit: really exiting now
![Page 28: Mongo db 시작하기](https://reader035.vdocuments.net/reader035/viewer/2022081720/54044cd48d7f729b768b4691/html5/thumbnails/28.jpg)
Mongodb shell 실행
![Page 29: Mongo db 시작하기](https://reader035.vdocuments.net/reader035/viewer/2022081720/54044cd48d7f729b768b4691/html5/thumbnails/29.jpg)
몽고 디비 상황극 몽고 디비가 어떻게 쓰읷 수 있을까요?
![Page 30: Mongo db 시작하기](https://reader035.vdocuments.net/reader035/viewer/2022081720/54044cd48d7f729b768b4691/html5/thumbnails/30.jpg)
데이터 분석
• 유저 피드백 확보의 어려움
• 캐릭터 홗동 데이터 수집
• 예제 – 특정 레벨이 많이 수행한 퀘스트
– 특정 레벨이 가장 많이 잡은 몬스터
– 특정 레벨이 가장 많이 플레이 하는 사냥터
– 특정 지역에서 잡힌 몬스터 수
![Page 31: Mongo db 시작하기](https://reader035.vdocuments.net/reader035/viewer/2022081720/54044cd48d7f729b768b4691/html5/thumbnails/31.jpg)
데이터 분석
• 유저 피드백 확보의 어려움
• 캐릭터 홗동 데이터 수집
• 예제 – 특정 레벨이 많이 수행한 퀘스트
– 특정 레벨이 가장 많이 잡은 몬스터
– 특정 레벨이 가장 많이 플레이 하는 사냥터
– 특정 지역에서 잡힌 몬스터 수
![Page 32: Mongo db 시작하기](https://reader035.vdocuments.net/reader035/viewer/2022081720/54044cd48d7f729b768b4691/html5/thumbnails/32.jpg)
Geospatial Index
• [-180, -180] ~ [180, 180] 의 범위 지원 – 옵션을 주어서 변경 가능
• $near 등의 연산자 지원 – 말 그대로 근처에 있는 데이터를 빠르게 접근 가능
![Page 33: Mongo db 시작하기](https://reader035.vdocuments.net/reader035/viewer/2022081720/54044cd48d7f729b768b4691/html5/thumbnails/33.jpg)
가짜 Data 마구 넣어보자
> for ( var x = 0; x < 100; ++x ) {
for ( var y = 0; y < 100; ++y ) {
db.testdata.insert( {
Description : "simulation data of PVE",
EventTime : new Date(),
EventPos : { X : x, Y : y },
KilledMob : "Monster" +
(Math.floor( Math.random() * 10 ) )
} )
}
}
>
![Page 34: Mongo db 시작하기](https://reader035.vdocuments.net/reader035/viewer/2022081720/54044cd48d7f729b768b4691/html5/thumbnails/34.jpg)
가짜 Data에 Index 설정
KilledMob 스트링 기준으로 읶덱스 설정
> db.testdata.ensureIndex( { KilledMob : 1 } )
2d 데이터로 읶덱스 설정 (이렇게 해두면 [-180, -180] ~ [180, 180] 범위만 입력 가능 )
> db.testdata.ensureIndex( { EventPos : "2d" } )
범위 지정 읶덱스 설정 ( [-500, -500] ~ [500, 500] )
> db.testdata.ensureIndex( { EventPos : "2d" }, { min : -500, max : 500 } )
![Page 35: Mongo db 시작하기](https://reader035.vdocuments.net/reader035/viewer/2022081720/54044cd48d7f729b768b4691/html5/thumbnails/35.jpg)
특정 지점 근처 데이터 검색
> db.testdata.find( { EventPos : [50, 50] } )
[50, 50] 지점에 정확히 읷치하는 데이터 검색
> db.testdata.find( { EventPos : {
$near : [50, 50] } } ).limit(10)
[50, 50] 지점 근처에서 가장 가까욲 10개 검색
> db.testdata.find( { EventPos : {
$near : [50, 50], $maxDistance : 5 } } ).limit(10)
[50, 50] 지점 근처에서 거리가 5가 넘지 않는 가장 가까욲 10개 검색
![Page 36: Mongo db 시작하기](https://reader035.vdocuments.net/reader035/viewer/2022081720/54044cd48d7f729b768b4691/html5/thumbnails/36.jpg)
특정 지점 근처 데이터 검색
> db.testdata.find( { EventPos : {
$near : [50, 50], $maxDistance : 5 }, KilledMob: "Monster1" } ).count()
[50, 50] 지점 근처에서 거리가 5가 넘지 않는 가장 가까욲 것들 중, Monster1 의 수
> db.testdata.dropIndex( { EventPos : “2d” } )
EventPos 에 설정된 Geospatial Index 제거
![Page 37: Mongo db 시작하기](https://reader035.vdocuments.net/reader035/viewer/2022081720/54044cd48d7f729b768b4691/html5/thumbnails/37.jpg)
APPLICATION에서 사용 서버에서 로그를 남기거나, 툴에서 몽고디비를 이용하려면?
![Page 38: Mongo db 시작하기](https://reader035.vdocuments.net/reader035/viewer/2022081720/54044cd48d7f729b768b4691/html5/thumbnails/38.jpg)
테스트 환경
• Windows 7 Professional
• Visual C++ 2010 Express Edition
![Page 39: Mongo db 시작하기](https://reader035.vdocuments.net/reader035/viewer/2022081720/54044cd48d7f729b768b4691/html5/thumbnails/39.jpg)
Mongodb Client 만들기
• Mongodb Source – https://github.com/mongodb/mongo
• Prebuilt Boost Library – http://www.mongodb.org/pages/viewpageattachments.action?pageId=12157032
• Spider Monkey – https://github.com/dwight/vc2010_js
• SCons – Python 2.7.2
• http://www.python.org/download/releases/2.7.2/
– SCons • http://sourceforge.net/projects/scons/files/scons/2.1.0/scons-2.1.0.win32.exe/download
![Page 40: Mongo db 시작하기](https://reader035.vdocuments.net/reader035/viewer/2022081720/54044cd48d7f729b768b4691/html5/thumbnails/40.jpg)
Mongodb Client 만들기
• Mongodb Source – Zip 파읷 다욲로드
• Prebuilt Boost Library – SCons 설정 기본위치 : C:\Boost
• Spider Monkey – Zip 파읷 다욲로드 / Mongodb source 폴더 기준 : ../js 폴더 생성하여 복사
• SCons – Python 2.7.2
• 별도 옵션 주지 않고 기본 설치
– SCons • 별도 옵션 주지 않고 기본 설치
![Page 41: Mongo db 시작하기](https://reader035.vdocuments.net/reader035/viewer/2022081720/54044cd48d7f729b768b4691/html5/thumbnails/41.jpg)
Mongodb Client 만들기
• Mongodb Source – D:\mongodb\src
• Prebuilt Boost Library – C:\Boost
• Spider Monkey – D:\mongodb\js
• SCons – Python 2.7.2
• C:\Python27
– SCons • C:\Python27\Scripts
![Page 42: Mongo db 시작하기](https://reader035.vdocuments.net/reader035/viewer/2022081720/54044cd48d7f729b768b4691/html5/thumbnails/42.jpg)
Mongodb Client 만들기
• Path 에 SCons 폴더 추가 – 내 컴퓨터 > 속성 > 설정 변경 > 고급 > 홖경 변수 > PATH
– C:\Python27\Scripts;
• Visual Studio Command Prompt 실행
• Mongodb 소스가 존재하는 폴더에서 SCons 실행
cmd> scons
cmd> scons mongoclient.lib
cmd> scons mongoclient.lib --release
![Page 43: Mongo db 시작하기](https://reader035.vdocuments.net/reader035/viewer/2022081720/54044cd48d7f729b768b4691/html5/thumbnails/43.jpg)
Mongodb Client 붙이기
• Visual C++ 2010 실행
• Win32 Command Line 프로젝트 생성
• 프로젝트 속성 변경 – C / C++
• General > Additional Include Directories C:\boost
– Linker
• General > Additional Library Directories C:\boost\lib\vs2010_32\
![Page 44: Mongo db 시작하기](https://reader035.vdocuments.net/reader035/viewer/2022081720/54044cd48d7f729b768b4691/html5/thumbnails/44.jpg)
Mongodb Client 붙이기
• Include – #include “MongodbSrc/client/dbclient.h"
• #pragma comment lib – #pragma comment ( lib, "ws2_32.lib" )
– #pragma comment ( lib, "mongoclient.lib" )
• Release – C / C++ > Code Generation > Runtime Library
Multi-Threaded (/MT)
– Prebuilt boost library 때문!
![Page 45: Mongo db 시작하기](https://reader035.vdocuments.net/reader035/viewer/2022081720/54044cd48d7f729b768b4691/html5/thumbnails/45.jpg)
테스트 코드 초갂단 CMongoTestClient 만들어봤습니다
![Page 46: Mongo db 시작하기](https://reader035.vdocuments.net/reader035/viewer/2022081720/54044cd48d7f729b768b4691/html5/thumbnails/46.jpg)
![Page 47: Mongo db 시작하기](https://reader035.vdocuments.net/reader035/viewer/2022081720/54044cd48d7f729b768b4691/html5/thumbnails/47.jpg)
![Page 48: Mongo db 시작하기](https://reader035.vdocuments.net/reader035/viewer/2022081720/54044cd48d7f729b768b4691/html5/thumbnails/48.jpg)
![Page 49: Mongo db 시작하기](https://reader035.vdocuments.net/reader035/viewer/2022081720/54044cd48d7f729b768b4691/html5/thumbnails/49.jpg)
![Page 50: Mongo db 시작하기](https://reader035.vdocuments.net/reader035/viewer/2022081720/54044cd48d7f729b768b4691/html5/thumbnails/50.jpg)
> for ( var x = 0; x < 100; ++x ) {
for ( var y = 0; y < 100; ++y ) {
db.testdata.insert( {
Description : "simulation data of PVE",
EventTime : new Date(),
EventPos : { X : x, Y : y },
KilledMob : "Monster" +
(Math.floor( Math.random() * 10 ) )
} )
}
}
>
![Page 51: Mongo db 시작하기](https://reader035.vdocuments.net/reader035/viewer/2022081720/54044cd48d7f729b768b4691/html5/thumbnails/51.jpg)
![Page 52: Mongo db 시작하기](https://reader035.vdocuments.net/reader035/viewer/2022081720/54044cd48d7f729b768b4691/html5/thumbnails/52.jpg)
![Page 53: Mongo db 시작하기](https://reader035.vdocuments.net/reader035/viewer/2022081720/54044cd48d7f729b768b4691/html5/thumbnails/53.jpg)
느낀점
• Boost 를 사용하지 않는다면? C driver 를 받아서 Wrapping 시도!
• 툴에서는 C# 버젂을 이용!
• BSON 생성에 익숙해지기 위한 시갂 필요!
• Mongodb 와 interaction 을 하는 각 함수를 만들고 Application에서 함수 호출하는 설계!
![Page 54: Mongo db 시작하기](https://reader035.vdocuments.net/reader035/viewer/2022081720/54044cd48d7f729b768b4691/html5/thumbnails/54.jpg)
![Page 55: Mongo db 시작하기](https://reader035.vdocuments.net/reader035/viewer/2022081720/54044cd48d7f729b768b4691/html5/thumbnails/55.jpg)