JDO란?
JDO(Java Data Objects)는 자바 객체를 데이터베이스(또는 여러 파일 형식)으로 저장할 수 있게 하는 표준 API 입니다. JDO 표준은 객체 모델을 직접 데이터 모델로 사용할 수 있게 해줍니다. 즉 객체를 핸들링하는 방식을 통해 직접 데이터베이스의 데이터를 다룰 수 있습니다. JDO는 표준 API이며 이를 구현한 여러 구현체가 있습니다. 현재 Apache JDO 홈페이지에 따르면 다음과 같은 JDO 구현체가 있습니다.
Name | License | JDO Spec | Datastore(s) |
DataNucleus Access Platform | NonCommercial | 1.0, 2.0, 2.1, 2.2, 3.0, 3.1 | RDBMS, db4o, NeoDatis, LDAP, Excel XLS, Excel OOXML, ODF, XML, JSON, Google BigTable, HBase, Amazon S3, MongoDB, GoogleStorage, Cassandra, OrientDB, Salesforce.com, Neo4j |
JDOInstruments | NonCommercial | 1.0 | JDOInstruments |
JPOX | NonCommercial | 1.0, 2.0, 2.1 | RDBMS, db4o |
Kodo | Commercial | 1.0, 2.0 | RDBMS, XML |
ObjectDB for Java/JDO | Commercial | 1.0, 2.0 | ObjectDB |
Objectivity | Commercial | 1.0 | ObjectivityDB |
Orient | Commercial | 1.0 | Orient |
hywy's PE:J | Commercial | 1.0 | RDBMS |
SignSoft intelliBO | Commercial | 1.0 | intelliBO |
Speedo | NonCommercial | 1.0 | RDBMS |
TJDO | NonCommercial | 1.0 | RDBMS |
Versant | Commercial | 1.0, 2.0 | Versant Object Database |
Xcalia | Commercial | 1.0, 2.0 | RDBMS, XML, Versant ODBMS, Jalisto, Web services, mainframe transactions and screens (CICS, IMS...), packaged applications (ERP, CRM,SFA...), components (EJB...). |
여기서는 비상용제품이며 가장 많은 데이터베이스를 지원하고 널리 사용되고 있는 Datanucleus에 대해 살펴보도록 하겠습니다.
Datanucleus 소개
Datanucleus(www.datanucleus.org)는 오픈소스로 공개돼 있으며, 현재 회신 버전은 4.2입니다. Datanucleus의 사용 예로 Hive 프로젝트에서는 metastore의 데이터 저장을 위해 Datanucleus를 사용하고 있습니다. 따라서 설정 만 변경하면 metastore의 storage로 MySQL, PostgreSQL, Oracle 등 다양한 데이터베이스를 사용자의 환경에 맞게 사용할 수 있습니다.
다음은 Datanucleus의 아키텍쳐입니다. JDO API 뿐만 아니라 JPA, REST API 등도 지원하고 있습니다. 그리고 스토리지로는 RDBMS뿐만 아니라 여러 NoSQL 데이터베이스, 그리고 Excel, JSON 등의 파일 저장소도 지원합니다. 그리고 특이하게도 그래프 데이터베이스인 Neo4J도 지원하는 것을 알 수 있습니다.
Datanucleus는 자바의 프로젝트 관리 도구인 Maven과의 연동을 지원합니다. Datanucleus를 사용해 객체를 저장하기 위해서는 Datanucleus에게 여러 가지 방법으로 어떤 객체를 저장할지 알려줄 수 있습니다. 여기에는 XML 파일을 사용할 수도 있고, Java의 annotation 기능을 사용할 수도 있습니다. 만일 Annotation을 사용한다면 다음과 같이 클래스를 정의하는 부분에 annotation을 사용합니다.
package org.datanucleus.samples.jdo.tutorial;
@PersistenceCapable
public class Product
{
@PrimaryKey
@Persistent(valueStrategy=IdGeneratorStrategy.INCREMENT)
long id;
...
}
위 예제는 Product라는 객체를 저장할 것이라는 것을 PersistenceCapable이라는 annotation을 사용해 알려주고, 이에 대한 primary key 필드가 id 필드라는 것을 알려줍니다. 또한 이 id 필드의 값은 datanucleus가 자동으로 생성하는 값임을 정의한 것입니다.
이렇게 PersistenceCapable anntation을 사용하면 Datanucleus가 자동으로 이 객체를 데이터베이스에 저장합니다. 또한 이와 같이 데이터베이스에 저장하기 위한 인터페이스를 구현하기 위해 클래스 코드를 컴파일 한 후 바이트 코드 레벨에서 코드를 추가하는 Class enhance 과정을 거칩니다. 이 과정은 컴파일을 한 후 반드시 거쳐야 하는 과정으로 enhance되지 않은 클래스를 저장하려고 하면 runtime에 Persistence할 수 없다는 exception이 발생합니다.
Class enhance 과정은 Maven을 사용할 경우 다름과 같은 plug-in을 정의함으로써 자동화 할 수 있습니다.
<build>
...
<plugins>
<plugin>
<groupId>org.datanucleus</groupId>
<artifactId>datanucleus-maven-plugin</artifactId>
<version>4.0.0-release</version>
<configuration>
<log4jConfiguration>${basedir}/log4j.properties</log4jConfiguration>
<verbose>true</verbose>
</configuration>
<executions>
<execution>
<phase>process-classes</phase>
<goals>
<goal>enhance</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
...
</build>
위에서 Maven의 lifecycle 중 process-classes 단계에서 위의 enhance plug-in을 수행하라고 정의하였음을 알 수 있습니다. 플러그인의 버전은 현재 사용 중인 datanucleus의 버전에 맞게 수정해야 합니다.
Posted by Bitnine(비트나인)
'ARCHIVES' 카테고리의 다른 글
Proxy (0) | 2015.09.22 |
---|---|
pg_statsinfo 소개 (0) | 2015.09.22 |
Hive의 권한 시스템 (0) | 2015.09.22 |
오픈소스 라이선스(Open Source License)의 개괄 (0) | 2015.09.22 |
PostgreSQL에서 사용하는 암호화 방식 (0) | 2015.09.22 |