객체 모델링(Object Oriented Modeling)과 관계형 데이터 모델링(Relational Data Modeling) 사이의 불일치를 해결해 주는 OR Mapping 서비스로 자바 표준인 JPA를 표준 서비스로 제시하고 구현체로는 JPA 구현체중에 가장 성능이 우수한 것으로 알려진 Hibernate를 이용하였다. 서비스의 특징을 살펴보면 다음과 같다.
옆의 그림에서 보는것과 같이 DBMS 기반의 어플리케이션 수행을 하기 위해 필요한 주요 구성 요소는 Entity, Persistence.xml 이며, 각각은 다음과 같은 역할을 수행한다.
ORM 서비스에 대한 자세한 설명에 앞서 간단하게 ORM 서비스를 시작하는데 필요한 것에 대한 설명을 하고자 한다.
본 서비스를 활용하기 위해서 필요한 Library 목록과 설명은 아래와 같다.
라이브러리 | 설 명 | 연관 라이브러리 |
---|---|---|
antlr-2.7.7.jar | 파서 라이브러리 | |
commons-collections-3.2.jar | collection 처리를 위한 라이브러리 | |
commons-dbcp-1.2.2.jar | DataSource 라이브러리 | |
commons-logging-1.1.1.jar | Logging 처리를 위한 라이브러리 | hibernate-annotations-3.4.0.GA.jar에서 참조 |
log4j-1.3alpha-8.jar | Logging 처리를 위한 라이브러리 | |
slf4j-api-1.5.3.jar | Logging 처리를 위한 라이브러리 | |
slf4j-log4j12-1.5.3.jar | Logging 처리를 위한 라이브러리 | |
commons-pool-1.3.jar | pooling 처리를 위한 라이브러리 | commons-dbcp-1.2.2.jar에서 참조 |
dom4j-1.6.1.jar | XML 파싱 라이브러리 | hibernate-3.2.4.ga.jar 에서 참조 |
ejb3-persistence-1.0.2.GA.jar | JPA Interface 클래스 라이브러리 | |
hibernate-annotations-3.4.0.GA.jar | Hibernate Annotation | |
hibernate-entitymanager-3.4.0.GA.jar | Hibernate Entity Manager 구현체 라이브러리 | |
hibernate-commons-annotations-3.1.0.GA.jar | Hibernate 공통 annotation 라이브러리 | hibernate-entitymanager-3.4.0.GA.jar에서 참조 |
hibernate-core-3.3.0.SP1.jar | Hiberante Core 라이브러리 | hibernate-entitymanager-3.4.0.GA.jar에서 참조 |
javassist-3.4.GA.jar | 자바 bytecode 조작 라이브러리 | hibernate-entitymanager-3.4.0.GA.jar에서 참조 |
jta-1.1.jar | JTA 인터페이스 라이브러리 | hibernate-entitymanager-3.4.0.GA.jar에서 참조 |
hsqldb-1.8.0.10.jar | HSQL JDBC 드라이버 | |
mysql-connector-java-5.1.6.jar | MYSQL JDBC 드라이버 | |
ojdbc-14.jar | ORACLE JDBC 드라이버 | |
junit-4.4.jar | 테스트 지원 라이브러리 |
간단한 형태의 Entity 클래스를 생성한다. 네개의 Attribute로 구성되어 있고 각각의 getter,setter 메소드로 구성되어 있다.
@Entity public class Department implements Serializable { private static final long serialVersionUID = 1L; @Id private String deptId; private String deptName; private Date createDate; private BigDecimal empCount; public String getDeptId() { return deptId; } public void setDeptId(String deptId) { this.deptId = deptId; } ... }
위에서 정의한 Entity 클래스를 가지고 JPA 수행하기 위한 프로퍼티 파일로 구현체제공 클래스정보,엔티티클래스정보,DB접속 정보,로깅정보,테이블자동생성정보를 포함하고 있다.
<persistence-unit name="PersistUnit" transaction-type="RESOURCE_LOCAL"> <provider>org.hibernate.ejb.HibernatePersistence</provider> <class>egovframework.Department</class> <exclude-unlisted-classes/> <properties> <property name="hibernate.connection.driver_class" value="org.hsqldb.jdbcDriver"/> <property name="hibernate.connection.url" value="jdbc:hsqldb:mem:testdb"/> <property name="hibernate.connection.username" value="sa"/> <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/> <property name="hibernate.connection.autocommit" value="false"/> <property name="hibernate.show_sql" value="true"/> <property name="hibernate.format_sql" value="true"/> <property name="hibernate.hbm2ddl.auto" value="create"/> </properties> </persistence-unit>
위에서 정의한 Department를 이용하여 입력,수정,조회,삭제 처리를 하는 것을 JUNIT형태로 구성하였다.
@Test public void testDepartment() throws Exception { String modifyName = "Marketing Department"; String deptId = "DEPT-0001"; Department department = makeDepartment(deptId); // Entity Manager 생성 emf = Persistence.createEntityManagerFactory("PersistUnit"); em = emf.createEntityManager(); // 입 력 em.getTransaction().begin(); em.persist(department); em.getTransaction().commit(); em.getTransaction().begin(); Department departmentAfterInsert = em.find(Department.class, deptId ); // 입력 확 인 assertEquals("Department Name Compare!",department.getDeptName(),departmentAfterInsert.getDeptName()); // 수 정 departmentAfterInsert.setDeptName(modifyName); em.merge(departmentAfterInsert); em.getTransaction().commit(); em.getTransaction().begin(); Department departmentAfterUpdate = em.find(Department.class, deptId ); // 수 정 확 인 assertEquals("Department Modify Name Compare!",modifyName,departmentAfterUpdate.getDeptName()); // 삭 제 em.remove(departmentAfterUpdate); em.getTransaction().commit(); // 삭 제 확 인 Department departmentAfterDelete = em.find(Department.class, deptId ); assertNull("Department is Deleted!",departmentAfterDelete); em.close(); }
※ ORACLE 이나 MySQL의 경우는 첨부되는 persistence.xml 의 주석을 참고하여 설정하고 수행하면 정상적으로 수행되는 것을 확인할 수 있다.