저자: Rahul Biswas
2006년 8월 10일자 테크 팁 상속과 Java Persistence API에서는 새로운 Java Persistance API에 관한 첫번째 엔터프라이즈 자바 기술 테크 팁이었으며. 본 팁은 이 시리즈의 제2편이라고 할 수 있다. 이번에는 Java Persistance API를 이용하여 복수 데이터베이스의 엔티티를 퍼시스트하는 예제 애플리케이션을 검토해 보기로 하자.
예제 애플리케이션
본 팁에는 예제 애플리케이션이 첨부되어 있으며, 이 애플리케이션은 주문에 관한 정보를 표시한다. 따라서 사용자는 주문에 관한 기본 정보를 열람할 수 있다.

사용자는 또한 주문에 관한 세부 내역을 표시할 수도 있다.

이 정보를 표시하기 위해 애플리케이션은 2개의 독립된 데이터베이스에 매핑되는 엔티티(즉, 퍼시스턴트 오브젝트)를 로드하고 디스플레이하는데, 한 엔티티는 주문 확인번호나 기재 사항처럼 주문에 관한 기본 정보가 포함된 데이터베이스 내의 데이터에 매핑된다. 다른 엔티티는 구성 명세처럼 주문에 관한 추가 세부사항이 포함된 데이터베이스에 매핑된다.
애플리케이션은 다음 4가지 유형의 구성요소를 사용한다.
- HTML 페이지:
index.html - JavaServer 페이지(JSP):
viewOrder.jsp - stateless 세션 빈(
SessionStateless.java)과 해당 로컬 인터페이스(SessionStatelessLocal.java) - 엔티티(
Order.java및Configuration.java)
JSP는 stateless 세션 빈을 사용하여 엔티티에 액세스하는데, 예를 들어 사용자가 index.html 페이지의 드롭다운 메뉴에서 주문을 선택하고 View Order 버튼을 클릭하면 viewOrder.jsp 페이지가 로드된다. 이어서 JSP는 stateless 세션 빈을 사용하여 Order 엔티티에 액세스한다. 다음은 Order 엔티티에 액세스하는 viewOrder.jsp의 코드 단편이다.

(위의 코드는 본 테크 팁의 텍스트 버전에서 캡쳐할 수 있다.)
viewOrder.jsp 페이지는 stateless 세션 빈의 loadOrder 메소드를 호출한다는 점에 유의할 것. 다음은 loadOrder 메소드의 모습이다.

(위의 코드는 본 테크 팁의 텍스트 버전에서 캡쳐할 수 있다.)
loadOrder 메소드 내의 em1은 엔티티 관리자로, 세션 빈은 엔티티 관리자를 이용하여 데이터베이스에서 엔티티를 로드하고 loadOrder 메소드에서는 em1을 사용하여 데이터베이스에서 Order 엔티티를 로드한다. 사용자가 주문에 관한 추가 세부정보를 요구하면 JSP 페이지는 세션 빈 내의 다른 메소드 loadConfiguration을 호출한다. 이 메소드는 또 다른 엔티티 관리자를 이용하여 두 번째 데이터베이스에서 Configuration 엔티티를 로드한다. 로드된 Configuration 엔티티는 Order 엔티티에 저장된 configID에 기초로 한다. Order 및 Configuration 엔티티는 다음과 같은 속성을 가진다.

(위의 코드는 본 테크 팁의 텍스트 버전에서 캡쳐할 수 있다.)
Order 엔티티의 configID 속성은 독립된 데이터베이스에 있는 Configuration 엔티티의 기본 키(primary key)이다.
복수의 데이터베이스 사용하기
예제의 setup 디렉토리에 있는 build.xml 파일을 살펴보면 타깃 setup을 가진 ant 태스크를 볼 수 있다. 이 태스크는 다음 2개의 Derby 데이터베이스를 생성한다: sun-appserv-samples-db1 및 sun-appserv-samples-db2(데이터베이스 이름은 예제 디렉토리의 build.properties 파일에 지정되어 있다). setup 태스크는 또한 애플리케이션 서버 상에 두 세트의 트랜잭션 JDBC 데이터 소스(jdbc/SamplesDB 및 jdbc/SamplesDB2)와 JDBC 커넥션 풀을 생성하는데, 한 커넥션 풀은 sun-appserv-samples-db1 데이터베이스를, 그리고 다른 커넥션 풀은 sun-appserv-samples-db2 데이터베이스를 가리킨다.
JDBC 리소스와 JDBC 커넥션 풀은 퍼시스턴스 유닛에 매핑되어야 하는데, Java Persistance API는 사용자가 각각 독립된 데이터베이스에 매핑될 수 있는 복수의 퍼시스턴스 유닛을 정의할 수 있게 해준다. src\conf 디렉토리의 persistence.xml 파일을 살펴보면 sample-db1과 sample-db2에 대해 지정된 퍼시스턴스 유닛을 볼 수 있다.

(위의 코드는 본 테크 팁의 텍스트 버전에서 캡쳐할 수 있다.)
sample-db1 퍼시스턴스 유닛은 SamplesDB라는 JNDI 이름을 가진 jta-data-source로 매핑되고, sample-db 2 퍼시스턴스 유닛은 SamplesDB2라는 JNDI 이름을 가진 jta-data-source에 매핑된다.
sample-db1과 sample-db2 퍼시스턴스 유닛은 적절한 엔티티 관리자를 생성하여 stateless 세션 빈 삽입에 사용된다. 다음은 세션 빈이 의존성을 가지는 트랜잭션 퍼시스턴스 컨텍스트를 엔티티 관리자에 삽입하는 세션 빈 코드이다.

(위의 코드는 본 테크 팁의 텍스트 버전에서 캡쳐할 수 있다.)
em1은 sample-db1 퍼시스턴스 컨텍스트를 위한 엔티티 관리자인데, 이 말은 viewOrder.jsp JSP가 loadOrder를 호출할 경우 메소드는 sample-db1 퍼시스턴스 컨텍스트를 위한 엔티티 관리자를 이용하여 sun-appserv-samples-db1 데이터베이스에서 Order 엔티티를 로드한다는 것을 의미한다.
em2는 sample-db2 퍼시스턴스 컨텍스트를 위한 엔티티 관리자이다. 이는 viewOrder.jsp JSP가 loadConfiguration를 호출할 경우 메소드는 sample-db2 퍼시스턴스 컨텍스트를 위한 엔티티 관리자를 이용하여 sun-appserv-samples-db2 데이터베이스에서 Configuration 엔티티를 로드한다는 것을 의미한다.
요약
보는 바와 같이, Java Persistance API는 복수의 데이터베이스에 퍼시스턴트 엔티티를 저장하는 작업을 용이하게 해준다.
Java Persistance API에 관한 자세한 내용을 보려면 기사 The Java Persistence API - A Simpler Programming Model for Entity Persistence(영문)를 참조할 것.
예제 코드 실행하기
본 팁에 첨부된 예제 코드를 실행하려면 다음 단계를 수행한다.
- GlassFish를 아직 구하지 못했다면 GlassFish 커뮤니티 다운로드 페이지에서 다운로드하여 설치한다.
- 아래의 환경 변수를 설정한다.
GLASSFISH_HOME. GlassFish의 설치 장소를 표시해야 한다.
ANT_HOME. ant의 설치 장소를 표시해야 한다. ant는 다운로드한 GlassFish 번들에 함께 포함되어 있다. (Windows에서는lib\ant서브디렉토리에 위치함)
JAVA_HOME. 사용자 시스템에서의 JDK 5.0 위치를 표시해야 한다.
PATH환경 변수에$JAVA_HOME/bin,$ANT_HOME/bin,$GLASSFISH_HOME/bin을 추가한다. - 예제 패키지를 다운로드하여 압축을 푼다. 새로 압축을 푼 디렉토리는
<sample_install_dir>/ttjuly2006multdb로 표시되어야 하는데, 여기서<sample_install_dir>은 예제 패키지가 설치된 디렉토리이다.ttjuly2006multdb아래의 예제 디렉토리에는 예제용 소스 파일과 기타 지원 파일이 포함되어 있다.
- 예제 디렉토리로 이동하여
build.properties파일을 적절히 편집한다. 예를 들어 admin 호스트가 원격인 경우에는admin.host의 값을 기본값(localhost)에서 해당 원격 호스트로 변경하면 된다. 아울러,javaee.server.passwordfile위치가 올바른지 확인한다.
- GlassFish를 시작한다.
$GLASSFISH_HOME/bin/asadmin start-domain domain1
- 데이터베이스 서버를 시작하고, 예제 디렉토리에서 아래 명령어를 입력한다.
다음과 유사한 출력이 표시되어야 한다.ant setup
(위의 코드는 본 테크 팁의 텍스트 버전에서 캡쳐할 수 있다.)
- 예제 애플리케이션을 구축하고 배포한다. 예제 디렉토리에서 아래 명령어를 입력한다.
다음과 유사한 출력이 표시되어야 한다.ant all
(위의 코드는 본 테크 팁의 텍스트 버전에서 캡쳐할 수 있다.)
- 애플리케이션을 시작하고, 브라우저를 http://<host>:8080/sample/index.html로 연다. 이 때, <host>에는 각자의 호스트 이름을 입력한다(가령,
localhost). 애플리케이션의 홈페이지가 표시되어야 한다.
저자 소개
Rahul Biswas는 썬 Java Performance Engineering 그룹 소속으로, Java Persistence에 대한 일반 성능 벤치마크 개발과 GlassFish에서의 퍼시스턴스 구현의 성능 개선 작업에 참여하고 있다.
"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/13 22:43좋은 정보 감사해요~
2007/09/19 04:14