티스토리 뷰

728x90
반응형

 포스팅은 JEUS7 JPA Deploy 가이드입니다.



1. 소개
Java Persistence API(이하 JPA)는 관계형 데이터베이스에 접근하기 위한 표준 ORM 기술을 제공하며, 기존에 EJB에서 제공되던 CMP Entity Bean을 대체하는 기술이다. JEUS는 JPA 스펙의 기능을 모두 지원한다. JPA는 JSR 317에서 JPA 2.0 스펙으로 정의되어 있으며, EJB 컨테이너에 의존하지 않고 EJB, 웹 모듈 및 Java SE Standalone 클라이언트에서 모두 사용이 가능하다.
*주의
JEUS6버전 이하는 JPA1.0만 지원 가능해 JAP2.0이상 버전을 JEUS에 Deploy하려면 JEUS7.0이상만 지원이 가능하다.

2. JPA 프로바이더 설정
JEUS의 기본 프로바이더인 EclipseLink에 대한 설정 뿐만 아니라 OpneJPA, Hibernate EntityManager 대한 설정은 JPA 스펙에서 정의되지 않는 기능을 구형하기 위해 필요한 부분으로, 각 어플리케이션에 맞게 정확하게 설정 되어야 한다.

2.1. 데이터베이스 설정
사용 환경, 데이터베이스 타입에 따른 데이터베이스 설정과 자동으로 데이터베이스 스키마를 생성하는 설정에 대해 설명한다.
2.1.1 Java EE환경
Java EE 환경(또는 모드)은 JEUS의 Managed Server(이하 MS) 위에서 웹 컨테이너, EJB 컨테이너, 어플리케이션 클라이언트 컨테이너를 의미한다. 즉 JEUS의 JPA엔진에서 데이터베이스 관리를 직접 컨트롤 한다.
* 참고
좀 더 정확하게는 각 컨테이너에서 컨트롤하는 Thread를 의미한다. 예를 들어 웹 엔진에 설정하는 Web Thread Pool의 Thread이다. 만약 애플리케이션이 직접 생성한 Thread Pool의 Thread처럼 컨테이너가 관리하지 않는 Thread 상에서는 Java SE 환경과 똑같다.
사용할 데이터베이스 대상에 대한 설정은 persistence.xml Descriptor에 설정한다. 사용할 트랜잭션의 종류에 따라서 <jta-data-source>와 <non-jta-data-source> 값을 설정한다.

- 글로벌 트랜잭션을 사용하는 경우
    <transaction-type>의 값을 'JTA'로 설정한다.
    <jta-data-source>에 해당 데이터소스의 JNDI 이름을 설정한다.

- 로컬 트랜잭션을 사용하는 경우
    <transaction-type>의 값을 'RESOURCE_LOCAL'로 설정한다.
    <non-jta-data-source>에 해당 데이터소스의 JNDI 이름을 설정한다.

 

[예 2.1] Java EE 모드에서 데이터베이스 설정 예(openJPA사용)

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence">
<persistence-unit name="onnet21" transaction-type="JTA">
<provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
<non-jta-data-source>jdbc/__default</non-jta-data-source> <-- 기존 소스에 추가
<class>com.svc.vo.club.Bbs</class>
<class>com.svc.vo.club.BbsAttachFile</class>
<class>com.svc.vo.club.BbsCMT</class>
<class>com.svc.vo.club.BbsRead</class>
<class>com.svc.vo.club.Club</class>
<class>com.svc.vo.club.CoverStory</class>

------ 중략 --------


2.1.2 Java SE 환경
Java SE 환경(또는 모드)은 Java EE 컨테이너에서 사용하지 않고 Java Standalone 클라이언트와 같은 환경에서 사용하는 경우를 말한다. 이때는 로컬 트랜잭션만 사용할 수 있으며, 사용되는 데이터베이스의 JDBC 설정을 프로퍼티로 설정해야 한다.
다음의 예제와 같이 <transaction-type>의 값을 'RESOURCE_LOCAL'로 설정한다.

[예 2.2] Java SE 모드에서 데이터베이스 설정 예(openJPA사용)

<persistence-unit name="onnet21_kctech" transaction-type="RESOURCE_LOCAL" >
<provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
<class>com.svc.vo.club.Bbs</class>
<class>com.svc.vo.club.BbsAttachFile</class>
<class>com.svc.vo.club.BbsCMT</class>
<class>com.svc.vo.club.BbsRead</class>
<class>com.svc.vo.club.Club</class>
<class>com.svc.vo.club.CoverStory</class>

<class>com.svc.vo.club.CoverStoryCMT</class>
<class>com.svc.vo.club.Menu</class>
<class>com.svc.vo.club.MenuHeader</class>
<class>com.svc.vo.club.Notice</class>
<properties>
<property name="openjpa.ConnectionProperties" value="
DriverClassName=oracle.jdbc.driver.OracleDriver,
Url=jdbc:oracle:thin:@210.107.34.10:1521:KCTGWDB,
MaxActive=100, MaxWait=10000, TestOnBorrow=true,
validationQuery=select 1 from dual,
Username=onnet21, Password=onnet21,
poolPreparedStatements=true"/>
<propertyname="openjpa.ConnectionDriverName"value="org.apache.commons.dbcp.BasicDataSource"/>
<property name="openjpa.ConnectionRetainMode" value="always" />
<property name="openjpa.DynamicEnhancementAgent" value="false"/>
<property name="openjpa.RuntimeUnenhancedClasses" value="supported"/>
<!--
<property name="openjpa.Log" value="SQL=TRACE"/>
<property name="openjpa.FlushBeforeQueries" value="true"/>
-->

</properties>
</persistence-unit>

 

2.2 Java SE방식 Deploy 특이 사항
Java SE 방식은 JEUS DBpool을 통해 데이터베이스 작업을 하지 않고 AP단 jpa모듈에서 직접 데이터 베이스 작업을 관리하는 설정이다. 하지만 JEUS에서 Deploy하는 경우 jpa의 persistence.xml의 <jta-datasource>, <non-jta-data-source>에 있는 export name에 대한 체크를 무조건 진행하기 때문에
해당 방식으로 그대로 JEUS에 Deploy하면 아래와 같은 Exception이 발생하면서 정상적으로 Deploy가 되지 않는다.

<<__Exception__>>
jeus.management.j2ee.DeploymentException: Could not find non-jta-data-source
Caused by: javax.naming.NameNotFoundException: [jdbc] Name not found.


따라서 기존 JAP설정이 AP단에서 직접 DB에 요청을 보내는 설정이 되어있더라고 JEUS7와 JPA
Persistence.xml 파일 둘 다 persistence provider에 의해 사용되는 data source가 설정되어야 합니다.

 

2.2.1 JEUS7 Depoly 절차(Java SE방식)
1) JAP 소스내 persistence.xml파일 내에 Java SE방식 설정에 jta – datasource 설정 추가
<persistence-unit name="onnet21" transaction-type="RESOURCE_LOCAL">
<provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
<non-jta-data-source>jdbc/__default</non-jta-data-source> <-- 기존 소스에 추가

2) JEUS에 DBPool 설정 추가해 설정한 JDBC 네임 추가

 

3. 결론
JEUS의 JAP적용 환경에서는 persistence provider에 의해 사용되는 data source가 설정되어야 한다. 가장 기본적인 방법은, 이미 WAS에 정의된 data source의 JNDI name을 transaction-type에 따라 jta-datasource 혹은 non-jta-data-source를 통해 명시하는 것이다.
이 방법을 사용하지 않으면, deploy할 때 따로 data source 정보를 주거나 WAS가 알아서 data source를 생성할 수 있도록 부가정보를 더 줘야 한다. JEUS는 전자의 방법만 제공한다.
따라서 JEUS JPA엔진 자체가 java EE방식으로 개발되어 Depoy할 JAP 소스가 java SE방식으로 개발되어있어도 JAVA EE방식으로 변경해 Deploy해야 정상적으로 Deploy가 된다.


* 참고
JEUS에서 지원 가능한 Persistence 프로바이더에 대해서는 다음의 각 사이트를 참고한다.
Hibernate EntityManager (http://www.hibernate.org)
OpenJPA (
http://openjpa.apache.org)
BEA Kodo (
http://docs.oracle.com/cd/E13189_01/kodo/docs40/index.html)

728x90
반응형

'④ 미들웨어 > ⓙ JEUS' 카테고리의 다른 글

[JEUS6] EJB Clustering  (0) 2018.08.17
[JEUS] DB 누수 확인 방법  (0) 2018.08.12
JEUS-WebtoB 구간암호화 설정(SSL통신)  (0) 2018.08.05
[JEUS7] javamelody 사용 가이드  (0) 2018.08.05
[JEUS7] 이중화 테스트 가이드  (0) 2018.08.04