본문 바로가기

Better SW Development

[dW Review] MongoDB + Morphia Project

MongoDB는 도큐먼트(document)라 불리는 JSON like 데이터 구조를 기반으로 동작한다. JSON이 아니라 like라 부르는 이유는 JSON과 동일하지 않고 좀 더 확장된 몇 가지 키워드와 문법을 자체적으로 지원하기 때문이다. (참고: 데이터 교환 표준형식 정하기 YAML & JSON)

JSON 구조자체가 심플하기때문에 MongoDB의 데이터 구조도 (물론 상대적이지만)가독성 높은 형태로 유지된다. 그런데 사실 살짝 아쉬운 부분이 하나 있는데 바로 자바 기반개발시에는 보통 데이터구조의 기반으로 JavaBeans스러운 엔티티(Entity)를 흔히 쓴다는 점이다. 데이터 스토어와 연결시키는 방식으로 ORM(객체관계맵퍼)툴이 스포트라이트를 받았던 것도 마찬가지 이유였다.

뜬금없는 여기서 잠깐!

Entity는 엔터티라 읽어야 하는것 아닌가? 라고 그 와중에 문맥을 끊어서 불편함을 느낄수 있는 독자를 위한 한 마디.
발음상은 엔터티가 맞는데 외래어 표기상 엔티티라고 해야 한다고 한다. 그래서 우리는 WikiLeaks를 위키리크스..라고 읽어야 하는 딜레마에 빠지는 거다.. (젝일!)

MongoDB를 자바 드라이버를 이용해서 사용한다면, 문서를 만들어서 저장하려면 다음과 같은 식의 코드가 나온다.

{
   "name" : "MongoDB",
   "type" : "database",
   "count" : 1,
"info" : { x : 203, y : 102 }
 }
[위와 같은 문서를 저장하려 한다고 가정했을 때 eofir 아래와 같은 자바코드가 필요해진다.]

class MyEntity {
    String name;
    String type;
    int count;
    Info info;
public MyEntity(String name, String type, int count, Info info){ this.name = name; this.type = type; this.count = count; this.info = info; }
...getters... ...setters... }
== runtimeCode ==
MyEntity entity = new MyEntity(....);
...
BasicDBObject doc = new BasicDBObject(); doc.put("name", myEntity.getName()); doc.put("type", myEntity.getType()); doc.put("count", myEntity.getCount()); BasicDBObject info = new BasicDBObject(); info.put("x", myEntity.getInfo().getX()); info.put("y", myEntity.getInfo().getY()); doc.put("info", info); coll.insert(doc);
[뭔지 몰라도 괜찮다. 그냥 좀 복잡하구나.. 정도로만 이해되어도 OK!]

즉, Entity를 MongoDB를 이용해 영구저장하려면, Helper클래스를 따로 만들거나 아니면 꽤나 번잡스러워진다. 물론 이런 생각을 당.연.히! 다른 개발자들도 생각했다. ORM은 아니만 비스무리 한걸 만들었다. 바로 Morphia라 불리는 라이브러리다. Morphia사이트(code.google.com/p/morphia)에 가보면 바로 한 줄로 Morphia가 뭘 하는건지 설명해 놓았다.

Morphia is a lightweight type-safe library for mapping Java objects to/from MongoDB:
모피아는 자바 객체와 몽고DB를 연결해 주는 경량 타입세이프 라이브러리

Morphia를 이용하면 위쪽의 코드가 대략 아래와 같은 식으로 바뀐다.
@Entity
class MyEntity {    
     ... 위와 동일
    @Embedded
    Info info;
    ... 이하 위와 동일
}
== runtimeCode ==
MyEntity entity = new MyEntity(....);

Morphia morphia = new Morphia();
morphia.map(MyEntity.class).map(Info.class);
Datastore ds = morphia.createDatastore("myDB");

ds.save(myEntity);

이론상(..)으로는 자바 Entity 저장이 훨씬 간단해 진다.

그리고 한가지 여담을 덧붙이자면, 원래 지난 JCO에서 발표하려던 주제의 초기 제목은 MongoDB with Play! by Morphia with Siena 였다. (Siena에 대해서는 추후에 여력되면 다시..)  시간관계상, 그리고 주제관계상 결국 Morphia와 Siena는 발표에서 빠졌었지만, MongoDB와 자바 Entity를 사용한다면 한 번쯤 봐둘만한 프로젝트들이다.

이렇게 이야기 해도 막상 사이트가서 레퍼런스나 튜토리얼을 보는 것이 쉽지 않은데, 마침 최근 dW 기사로 Morphia의 기사가 소개되었다.

Morphia 및 MongoDB를 통한 도메인 모델 지속성
Morphia를 사용하여 MongoDB로 맵핑된 Java 도메인 모델의 지속, 로드, 삭제 및 쿼리
http://www.ibm.com/developerworks/kr/library/j-morphia/index.html?ca=drs-

한글우리말로 친절히 번역된 기사가 나왔으니 뭘 더 바라겠는가!

아직은 Morphia자체가 Experimental에 더 가까운 관계로 국내에서 업무적으로 사용한 실사례를 들어보진 못했다. 즉, 쓰지 말고 기다려 보자는 아니고, 아직까진 사례를 만들어서 교훈이 필요한 상황이라고 생각하면 좋겠다. 사실 이쯤되면 늘상 떠오르는 아쉬운 점 하나가 있다.

"만들기는 커녕 가져다 쓰는것도 이리 어려우니 우리는 언제쯤 그들을 앞서나갈 것인가?"

뭐.. 차차 나아지겠지.. 라며 혼잣말로 위안을 삼아본다.

Ps.
MongoDB가 편리성으로 주목을 많이 받았지만, 반면에 성능적/기능적 한계로 인해 요즘엔 오히려 Redis(redis.io)가 급 부상하고 있는것 같다. 오히려 더 간결하기도 하고 말이다. 다음 관심은 Redis로 확정이다! :D