doortts / blog

0 stars 0 forks source link

[dW Review] Java development 2.0: MongoDB #176

Open doortts opened 13 years ago

doortts commented 13 years ago

@doortts (doortts) 님이 작성한 게시글입니다. ---

doortts | 2011-03-31 목요일 오전 12:18 | Better SW Development | 원본

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"));
}

}

(function(){ var corecss = document.createElement('link'); var themecss = document.createElement('link'); var corecssurl = "http://whiteship.me/wp-content/plugins/syntaxhighlighter/syntaxhighlighter3/styles/shCore.css?ver=3.0.83b"; if ( corecss.setAttribute ) { corecss.setAttribute( "rel", "stylesheet" ); corecss.setAttribute( "type", "text/css" ); corecss.setAttribute( "href", corecssurl ); } else { corecss.rel = "stylesheet"; corecss.href = corecssurl; } document.getElementsByTagName("head")[0].insertBefore( corecss, document.getElementById("syntaxhighlighteranchor") ); var themecssurl = "http://whiteship.me/wp-content/plugins/syntaxhighlighter/syntaxhighlighter3/styles/shThemeRDark.css?ver=3.0.83b"; if ( themecss.setAttribute ) { themecss.setAttribute( "rel", "stylesheet" ); themecss.setAttribute( "type", "text/css" ); themecss.setAttribute( "href", themecssurl ); } else { themecss.rel = "stylesheet"; themecss.href = themecssurl; } //document.getElementById("syntaxhighlighteranchor").appendChild(themecss); document.getElementsByTagName("head")[0].insertBefore( themecss, document.getElementById("syntaxhighlighteranchor") ); })(); SyntaxHighlighter.config.strings.expandSource = '+ expand source'; SyntaxHighlighter.config.strings.help = '?'; SyntaxHighlighter.config.strings.alert = 'SyntaxHighlighter\n\n'; SyntaxHighlighter.config.strings.noBrush = 'Can\'t find brush for: '; SyntaxHighlighter.config.strings.brushNotHtmlScript = 'Brush wasn\'t configured for html-script option: '; SyntaxHighlighter.defaults['pad-line-numbers'] = true; SyntaxHighlighter.all();