본문 바로가기

Better SW Development

[dW Review] Java development 2.0: MongoDB

IBM DeveloperWorks에 올라온 기사 Java development 2.0: MongoDB를 좀 더 잘 이해하기 위한 보충설명입니다. :)

Java development 2.0: MongoDB:
(적절한) RDBMS 이동 기능을 제공하는 NoSQL 데이터 저장소

http://www.ibm.com/developerworks/kr/library/j-javadev2-12/index.html

 

<기본 용어설명>
스케일 업(Scale Up) : 서버 성능을 올리는 것. CPU 증설, 램 Up~
스케일 아웃(Scale Out): 서버 대수를 늘리는 것.
 

샤딩(Sharding): 데이터 베이스의 수평확장(horizontal partitioning)의 일종. 일반적으로 한 테이블의 Row를 분산시키는 것. 요금테이블 -> 1월요금테이블, 2월요금테이블.. 등등으로 나눈다고 생각하면 간단합니다. 샤딩에 대해서는 조만간 따로 글을 올리도록 하겠습니다.

<내용부연 설명>
기사 내용자체가 원체 쉽게 잘 쓰여 있습니다만, 그래도 아래 내용을 먼저 보시고 읽어보시면 더 더욱 쉽게 이해되실 겁니다. :)

"MongoDB의 API는 JSON 오브젝트와 JavaScript 함수의 혼합체이다."
네. 그렇습니다. 따라서 콘솔상에서 자바스크립트 문법을 실행하는 것이 가능합니다.
 

doortts:~/Development/mongodb-osx-x86_64-1.8.0> ./bin/mongo
MongoDB shell version: 1.8.0
connecting to: test

> var a=1, b=2;
> a+b;
3

> print ('hello mongo');
hello mongo
>


dW 기사의 mongodb 실행 명령어는 오타인듯 합니다. 아래와 같이 해야 정상실행됩니다.
./bin/mongod --dbpath ./data/db --vvvvvvv

기사에도 나오지만 mongodb는 document 기반 NoSql중 하나로 기본 데이터로 json 형식을 지원합니다.
ticket =  { officer: "Kristen Ree" , location: "Walmart parking lot", vehicle_plate: "Virginia 5566",  offense: "Parked in no parking zone", date: "2010/08/15"}

> db.tickets.save(ticket);
> ticket
 

{
    "officer" : "Kristen Ree",
    "location" : "Walmart parking lot",
    "vehicle_plate" : "Virginia 5566",
    "offense" : "Parked in no parking zone",
    "date" : "2010/08/15",
    "_id" : ObjectId("4d92e8f3a9770dc9e1e6a027")
}
tickets라는 컬렉션은 미리 지정해 놓지 않아도 위와 같이 명령을 쓰는 순간 만들어 집니다.

> db.tickets.find();

{ "_id" : ObjectId("4d92e8f3a9770dc9e1e6a027"), "officer" : "Kristen Ree", "location" : "Walmart parking lot", "vehicle_plate" : "Virginia 5566", "offense" : "Parked in no parking zone", "date" : "2010/08/15" }

> db.tickets.find({location:/walmart/})

{ "_id" : ObjectId("4d92e8f3a9770dc9e1e6a027"), "officer" : "Kristen Ree", "location" : "Walmart parking lot", "vehicle_plate" : "Virginia 5566", "offense" : "Parked in no parking zone", "date" : "2010/08/15" }

find를 이용해서 컬렉션 안의 데이터를 검색합니다. 삭제는 remove를 이용합니다. find때와 마찬가지로 정규식을 지원합니다. i 는 대소문자 무구분!

db.tickets.remove({vehicle_plate:/virginia/i});

다음은 Mongodb Java Driver를 이용해 만들어 본 데이터 입력에 대한 단위테스트 케이스 입니다.
import static org.junit.Assert.*;

import org.junit.*;

import com.mongodb.*;


public class MongodbTest {

	private DB db;
	private Mongo m;

	@Before
	public void setUp() throws Exception {
		m = new Mongo();
	}
	
	@After
	public void tearDown() throws Exception {
		db = m.getDB("test");
		DBCollection coll = db.getCollection("tickets");
		coll.drop();
	}

	@Test
	public void testMongodbInsert() throws Exception {
		//Given
		BasicDBObject doc = new BasicDBObject();
		doc.put("officer", "Andrew Smith");
		doc.put("location", "Target Shopping Center parking lot");
		doc.put("vehicle_plate", "Virginia 2345");
		doc.put("offense", "Double parked");
		doc.put("date", "2010/08/13");

		//When
		db = m.getDB("test");
		DBCollection coll = db.getCollection("tickets");
		coll.insert(doc);

		//Then
		DBObject dbObject = coll.find(doc).next();

		assertEquals(doc.keySet(), dbObject.keySet());
		assertEquals("Andrew Smith", dbObject.get("officer"));
		assertEquals("Target Shopping Center parking lot", dbObject.get("location"));
		assertEquals("Virginia 2345", dbObject.get("vehicle_plate"));
		assertEquals("Double parked", dbObject.get("offense"));
		assertEquals("2010/08/13", dbObject.get("date"));
	}
}