doortts / blog

0 stars 0 forks source link

[dW Review] MongoDB + Morphia Project #182

Open doortts opened 13 years ago

doortts commented 13 years ago

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

doortts | 2011-06-30 목요일 오전 12:12 | Better SW Development | 원본

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

Comments

외래어 표기등에 신경을 쓰시는 것 같아서 한가지 더 첨언을 하자면.. '한글로 친절히 번역된 기사' -> '한국어(혹은 우리말)로 친절히 번역된 기사'가 옳습니다.

B | 2011-06-30 목요일 오전 9:36

--

아! 감사합니다. :D 이야기 주신대로 우리말이라는 표현이 더 좋을 것 같다는 생각이 들었습니다.

doortts | 2011-06-30 목요일 오후 2:47

--

까칠한 B님이시군요..!! ㅋ

is윤군 | 2011-07-02 토요일 오후 6:10

--

아.. 글 제목을 보는 순간, 역시.. 라는 단어가 떠올랐습니다. ^^ 조금전까지 gae + play 실습을 해보고, MongoDB 관련모듈인 morphia 정보를 찾아보려던 중이였습니다. 이미 올려주셨군요. 잘 읽었습니다. ^^ 한가지 질문드리고 싶은 부분이 있는데요. 구글 데이터스토어인 BigTable과 MongoDB 의 사용상 편리함이나 성능이나.. 간단 비교를 부탁드려도 될까요? 한가지를 정해서 쭉 공부해보고 싶은데, 고수님의 조언을 듣고 싶습니다.

sajagogumi | 2011-07-01 금요일 오전 12:45

--

안녕하세요? 댓글이 있는걸 미처몰랐습니다. 죄송합니다.

아. 우선 이야기주신 부분은 저도 뭐라 이야기 드릴 수 있는 분야가 아니라서 뭐라 드릴 말씀이 없네요.

다만 play와 mongodb를 사용하는 것은 '가능하다'수준이지 효율적인지 여부는 아직 나와있는 자료가 없습니다.

저의 경우도 mongodb를 선택한 것은 데이터를 저장하고 유지 관리하는데 있어서의 사용상 편리함이 주된 이유였고요.

mongodb의 경우 관련 정보를 접하게 되면 공유하도록 하겠습니다.

현재 관련해서는 '다음'에서 발표한 자료가 있으니 참고하시면 좋을 것 같습니다.

My아고라 MongoDB 적용사례 http://www.platformday.com/2011/pages/introduce#l11

그럼 좋은 하루 되세요. 감사합니다.

doortts | 2011-07-31 일요일 오후 7:48

--