JDO(Java Data Objects) API는 Java 기술에서의 아카이브 객체 지속성에 대한 표준적이고 명확한 방법을 제공한다. JDO는 다른 객체 바인딩 기술에 비해 개발 복잡성과 오버헤드를 줄이기 위해 XML 메타데이터와 바이트코드 확장의 실용적 조합을 사용한다.
JDO의 장점 중 하나는 API가 간단하다는 것이다. 이 기술을 사용하기 위해서는 몇가지 인터페이스만 배우면 된다. JDO API는 표준화되어 있으며 선택할 수 있는 구현 범위가 명확하다. JDO Reference Implementation 와 TCK는 JDO Specification page에서 무료로 이용할 수 있다. Reference Implementation는 관계형 데이터베이스를 지원하지 않으므로 관계형 데이터베이스를 지원하는 JDO 구현은 JDOcentral.com을 참고하기 바란다.
JDO는 Enterprise JavaBeans 기술과 같은 다른 지속성 기술과는 구별되는데, JDO에서는 보통의 기존 JavaBeans와 호환되어, 어떤 특별한 API를 고수할 필요가 없다. 포스트 컴필레이션 바이트코드를 확장하는데 JDO를 조심스럽게 이용함으로써, 개발자와 퍼시스턴스 컨네이너 사이의 추상화 경계를 제공한다. 이는 주위 환경의 복잡성으로부터 개발자를 자유롭게 하여 애플리케이션의 구조와 실행라는 실제 문제에만 집중할 수 있게 한다.
JDO는 도메인 객체 모델(지속적인 데이터를 나타내는 Java 클래스)과 관리 클래스(데이터 베이스 쿼리와 지속적 인스턴스의 라이프 사이클 관리, 트랜잭션 분리를 담당하는 Java 클래스) 사이를 구분한다. 지속 클래스는 지속성에 영향을 받지 않으며, 단순히 모델과 관련된 비즈니스 로직을 구현한다. 관리 클래스는 반드시 지속성에 영향을 받지만 JDO가 특정 데이터베이스 코드 없이 사용자로 하여금 관리 클래스를 구현하게 한다.
다음은 JDO를 활용하여 작업하는 단계이다.
- JDORI jars와 종속 파일들 다운로드
- 간단한 모델 빈 정의 후 JDO XML 파일 안의 메타데이터 생성
- JavaBean 컴파일 및 확장
- 지속적인 저장소와 호환하기 위한 관리 파사드 구축
이 테크팁의 샘플 웹 애플리케이션에는 JDO 를 사용하는 간단한 예가 있다. 여러 책자와 수많은 아티클에도 JDO API를 사용하는 법이 나와있다. 따라서 이번 팁에서는 JDO API를 사용하는 방법 대신 JDO 를 기동하는 데 가장 어려운 부분인 개발 환경을 세팅하고 지속성을 검증하는 첫번째 객체를 얻는 법을 중점적으로 설명하고자 한다. 샘플 웹 애플리케이션에서 이를 어떻게 구현하는 지 설명하고 있다.
JDO JARs 와 종속 파일들 다운로드하기
필수적인 JAR 파일은 WAR file (ttsep2004.war) 예제에 모두 포함되어있다. WEB-INF\lib 디렉토리에서 JAR 파일을 찾아볼 수 있다. 다음은 그 JAR 파일들이다.
jdo-1.0.1.jar(the JDO API JAR)
jdori-1.0.1.jar(Sun JDO 구현 클래스)
jdori-enhancer-1.0.1.jar(바이트코드 확장자 패키지)
btree-1.0.1.jar(디폴트 파일 객체 지속성을 핸들링하기 위한 빈 트리 JAR)
antlr-2.7.1.jar(쿼리 파싱 요구)
속성 구성하고 파일 데이터베이스 셋업하기
JDO 참조 구현은 "FOStore" 로 불리는 파일 기반 데이터 스토리지 매커니즘에 포함되어있다. 웹 애플리케이션은 FOStore 를 이용하며, 이는 데이터 베이스와 통합하는 추가적인 복잡성을 피한다. FOStore를 설치하기 위해서는 사용자 시스템 속성을 구성해야한다. 예제에서는 src/com/alexrupp/ttsep2004디렉토리 안의 jdori.properties 파일에서 이 작업이 수행되었다. 다음은 jdori.properties 파일의 컨텐츠이다.
# jdori.properties file
javax.jdo.PersistenceManagerFactoryClass=
com.sun.jdori.fostore.FOStorePMF
com.sun.jdori.option.ConnectionCreate=true
javax.jdo.option.ConnectionUserName=jdotester
javax.jdo.option.ConnectionPassword=jdopassword
# The following property points to your local filesystem:
javax.jdo.option.ConnectionURL=fostore:C:/fostore
javax.jdo.option.Optimistic=false
javax.jdo.option.RetainValues=false
javax.jdo.option.RestoreValues=false
이 컨피규레이션은 FOStore PersistenceManager를 이용한다. 이는 Windows의 C:/ 디렉토리에 데이터 파일들을 저장한다.
JavaBean 구축, 컴파일, 확장하기
웹 어플리케이션에서는 지속성 유지를 위해 InvoiceBean 객체를 사용한다. 지속성을 위한 준비로 InvoiceBean 클래스는 바이트코드 확장자를 통해 구동되어야한다. 바이트코드 확장자는 인터페이스와 몇 개의 중요 메서드를 클래스에 주입시켜 지속 컨테이너가 이를 활용할 수 있게 한다. 이 기술은 이런 메서드를 수동으로 입력할 때 선호되고 있으며, 다른 지속 기술에 사용되는 스터브 클래스와 인터페이스 생성에도 선호된다. 예제에는 바이트코드를 확장하는 코드의 필수라인을 포함하는 maven.xml라는 이름의 파일이 있다.
<goal name="jdo:enhance">
<ant:java
classname="com.sun.jdori.enhancer.Main"
fork="true">
<ant:arg
line="-v -s target/ttsep2004/WEB-INF/classes
target/ttsep2004/WEB-INF/classes/com/alexrupp/ttsep2004/InvoiceBean.class
-d target/ttsep2004/WEB-INF/classes -v -f"/>
<ant:classpath>
<ant:path
refid="maven.dependency.classpath"/>
<ant:pathelement
location="${basedir}/lib/jdori-enhancer-1.0.1.jar"/>
</ant:classpath>
</ant:java>
</goal>
goal 엘리먼트는 com.sun.jdori.enhancer.Main 클래스를 호출하고 인수 라인으로 이를 전달한다. 그 클래스는 InvoiceBean 클래스의 바이트코드를 식별하고 확장하는 데 인수를 활용한다. 사용자 고유의 클래스를 InvoiceBean에 추가로 입력할 수 있다.
시스템 속성 이용하여 PersistenceManagerFactory 검색하기
InvoiceManager 서블렛은 어떻게 PersistenceManagerFactory 클래스를 검색하는 지 보여준다. 이 서블렛은 JDOHelper 클래스와 기존에 어셈블되어 입력된 속성 파일을 활용한다. PersistenceManagerFactory를 얻은 후에 PersistenceManager를 검색하고 JDO API를 사용하기 시작하는 것은 쉬운 일이다.
// ...
// get the JDO properties
Properties props = new Properties();
try {
props.load(CreateInvoice.class.getResourceAsStream
("jdori.properties"));
} catch (IOException e) {
e.printStackTrace();
}
// get the PMF
PersistenceManagerFactory fact =
JDOHelper.getPersistenceManagerFactory(props);
// get the persistence manager
PersistenceManager mgr = fact.getPersistenceManager();
//...
이 예제에서 사용된 PersistenceManager를 얻기 위한 메서드는 좋은 예가 아니다. 실제 애플리케이션에서는 ServletFilter를 이용해야한다. ServletFilter에서는 init 메서드가 PersistenceManagerFactory를 한번 획득하고(비싼 작업이다), 이를 필터에 인스턴스 변수로써 저장한다. 각각의 호출은 필터를 통과하게 될 것이며, ServletFilter를 리퀘스트의 엘리먼트로써 저장하게 될 것이다.
PersistenceManager 활용하여 새로운 지속 객체 생성하기
이 마지막 단계에서는 InvoiceBean의 생성, 읽기, 업데이트, 삭제 과정을 관리하기 위한 클래스를 구축한다. JavaBean 클래스가 그 클래스의 지속성을 관리할 수 있게 할 수도 있지만 이를 패시브 데이터 저장소로 활용하고 실제 역할은 다른 클래스에 넘겨주는 것이 더 나을 것이다. InvoiceManager 서블렛에서 이 관리자 기능의 적당한 시작점을 찾게 될 것이다. 이 서블렛에는 데이터 저장소에 객체를 저장할 충분한 코드가 있다. 그 후 서블렛은 저장소에 저장된 InvoiceBean 객체의 총 개수를 측정함으로써 추가사항을 검사하고 정보를 화면에 표시한다.
// make the transaction
try {
mgr.currentTransaction().begin();
mgr.makePersistent(savingInvoice);
invoice.setPersistenceStatus(""
+ " Saved Successfully at "
+ System.currentTimeMillis());
/* Count all of the invoices. This is
* Okay for a demo, but in production you should
* Never use an unqualified query.
*/
Query query = mgr.newQuery(InvoiceBean.class);
Collection result = (Collection) query.execute();
invoice.setInvoiceCount("" + result.size());
query.close(result);
// commit the transaction.
mgr.currentTransaction().commit();
} catch (Throwable t) {
invoice.setPersistenceStatus(" Not Saved: " + t);
mgr.currentTransaction().rollback();
}
// forward to a view component
try {
res.sendRedirect("/ttsep2004/faces/viewInvoice.jsp");
} catch (IOException e) {
e.printStackTrace();
}
약간의 시간과 노력만으로 지속성을 위한 Java Data Objects와 표현을 위한 JavaServer Faces 기술을 조합하여 정교하면서도 복잡하지않은 인보이스 트래킹 시스템을 구축할 수 있다. 각각의 기술은 복잡성과 개발 오버헤드를 감소시킨다. 이 기술들을 마스터하고 나면 생산성을 무척 증가시킬 수 있을 것이다.
JDO에 대한 좀 더 자세한 정보를 알고싶으면, 다음의 자료들을 참고하기 바란다.
샘플 코드
예제의 샘플 아카이브를 다운로드 받으세요. 컨텍스트 루트는 ttmay2004이고 샘플코드의 사용법은 index.html welcome file 에서 보실 수 있습니다. 다운로드되는 WAR 파일에는 예제를 위한 완전한 소스 코드가 포함되어있습니다.
J2EE 1.4 SDK에는 Sun Java System Application Server Platform Edition 8이 포함되어 있습니다. 디플로이툴 프로그램이나 어드민 콘솔을 이용해 Sun Java System Application Server Platform Edition 8의 웹 아카이브 (ttsep2004.war)를 디플로이할 수 있으며, 다음과 같은 asadmin 커멘드를 통해서도 가능합니다.
install_dir를 war 파일을 설치하는 디렉토리로 변경하세요.
http://localhost:8080/ttsep2004에서 이 애플리케이션에 접근할 수 있습니다.
Sun Java System Application Server Platform Edition 8 대신 J2EE 1.4-compliant을 구현하기 위해서는 J2EE 제품의 디플로이먼트 툴을 사용하여 플랫폼에 애플리케이션을 디플로이 하시기 바랍니다.
"Java EE" 카테고리의 다른 글
- Attach API (댓글 18개 / 트랙백 1개) 2007/09/03
- JSP 2.0 EXPRESSION LANGUAGE (댓글 1개 / 트랙백 0개) 2004/02/05
- 환경 엔트리를 이용해서 배포의 사용자 정의하기 (댓글 2개 / 트랙백 0개) 2003/12/24
- JAX-WS를 이용한 웹 서비스 개발 (댓글 1개 / 트랙백 0개) 2006/01/18
- EJB 2.1로 메시지 구동 빈 이용하기 (댓글 1개 / 트랙백 0개) 2005/05/18
- EclipseLink를 사용하여 JPA에서 반복 불가능한 읽기 방지 (댓글 0개 / 트랙백 1개) 2008/07/09
- 컴포넌트 시스템과 클래스 로더 경계 (댓글 1개 / 트랙백 0개) 2004/10/05
- JAX-WS Dispatch 및 Provider API를 이용한 문서 처리 (댓글 4개 / 트랙백 0개) 2006/09/15
- POJO를 Persistent Entity로 변환하기 (댓글 1개 / 트랙백 0개) 2005/12/27
- SAAJ 소개 (댓글 1개 / 트랙백 0개) 2005/06/08
댓글을 달아 주세요
알면 알수록 빠져드는 자바
2007/09/07 20:21자바와 함께라면 불가능은 없네요 웹세상을 주도하는 자바
과연 자바입니다!!
좋은 정보 감사해요~
2007/09/19 05:39