슬라이드 1

Similar documents
< 목차 > 1. Data Access Service 개요 (ibatis 활용 ) 3. DBIO 소개

슬라이드 1

- JPA를사용하는경우의스프링설정파일에다음을기술한다. <bean id="entitymanagerfactory" class="org.springframework.orm.jpa.localentitymanagerfactorybean" p:persistenceunitname=

Spring Boot/JDBC JdbcTemplate/CRUD 예제

10.ppt

Connection 8 22 UniSQLConnection / / 9 3 UniSQL OID SET

PowerPoint 프레젠테이션

@OneToOne(cascade = = "addr_id") private Addr addr; public Emp(String ename, Addr addr) { this.ename = ename; this.a

Spring Data JPA Many To Many 양방향 관계 예제

쉽게 풀어쓴 C 프로그래밊

Intro to Servlet, EJB, JSP, WS

표준프레임워크로 구성된 컨텐츠를 솔루션에 적용하는 것에 문제가 없는지 확인

파워포인트 템플릿

목차 BUG DEQUEUE 의 WAIT TIME 이 1 초미만인경우, 설정한시간만큼대기하지않는문제가있습니다... 3 BUG [qp-select-pvo] group by 표현식에있는컬럼을참조하는집합연산이존재하지않으면결괏값오류가발생할수있습니다... 4

슬라이드 1

iBATIS-SqlMaps-2-Tutorial

C# Programming Guide - Types

슬라이드 1

4 주차 - SPRING 환경설정및구현 Spring 기반의웹프로젝트를구성하고싶어요 T^T Spring 기반의웹환경구축 1. web.xml 수정으로 Spring 을설정하는방법 2. eclipse Spring Plug-In 을활용한템플릿프로젝트자동구성필수는아니지만해놓으면편

(jpetstore \277\271\301\246\267\316 \273\354\306\354\272\270\264\302 Spring MVC\277\315 iBatis \277\254\265\277 - Confluence)

1

No Slide Title

<property name="configlocation" value="classpath:/egovframework/sqlmap/example/sql-map-config.xml"/> <property name="datasource" ref="datasource2"/> *

DBMS & SQL Server Installation Database Laboratory

untitled

* Factory class for query and DML clause creation * tiwe * */ public class JPAQueryFactory implements JPQLQueryFactory private f

Microsoft PowerPoint - ibatis.pptx

13주-14주proc.PDF

InsertColumnNonNullableError(#colName) 에해당하는메시지출력 존재하지않는컬럼에값을삽입하려고할경우, InsertColumnExistenceError(#colName) 에해당하는메시지출력 실행결과가 primary key 제약에위배된다면, Ins

Interstage5 SOAP서비스 설정 가이드

Microsoft PowerPoint - GUI _DB연동.ppt [호환 모드]

J2EE Concepts

I. Introduction... 1 II. Jdbc Support 구현배경 사용자요구사항 p6spy Architecture Architecture InjectionPa

Microsoft PowerPoint - Smart CRM v4.0_TM 소개_ pptx

ALTIBASE 사용자가이드 Templete

q 이장에서다룰내용 1 객체지향프로그래밍의이해 2 객체지향언어 : 자바 2

rmi_박준용_final.PDF

교육2 ? 그림

PowerPoint 프레젠테이션

NoSQL

JAVA PROGRAMMING 실습 08.다형성

Web Application을 구성하는 패턴과 Spring ROO의 사례

교육자료

ALTIBASE 사용자가이드 Templete

<4D F736F F F696E74202D20C1A63038C0E520C5ACB7A1BDBABFCD20B0B4C3BC4928B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

thesis

FileMaker 15 ODBC 및 JDBC 설명서

SQL Developer Connect to TimesTen 유니원아이앤씨 DB 기술지원팀 2010 년 07 월 28 일 문서정보 프로젝트명 SQL Developer Connect to TimesTen 서브시스템명 버전 1.0 문서명 작성일 작성자

단계

Mobile Service > IAP > Android SDK [ ] IAP SDK TOAST SDK. IAP SDK. Android Studio IDE Android SDK Version (API Level 10). Name Reference V

API STORE 키발급및 API 사용가이드 Document Information 문서명 : API STORE 언어별 Client 사용가이드작성자 : 작성일 : 업무영역 : 버전 : 1 st Draft. 서브시스템 : 문서번호 : 단계 : Docum

PowerPoint 프레젠테이션

[Brochure] KOR_TunA

PowerPoint 프레젠테이션

ALTIBASE 사용자가이드 Templete

Microsoft PowerPoint - 04-UDP Programming.ppt

I T C o t e n s P r o v i d e r h t t p : / / w w w. h a n b i t b o o k. c o. k r

JUNIT 실습및발표

Microsoft PowerPoint - JCO2007_Spring2.0_발표자료_Rev-A.ppt [호환 모드]

슬라이드 1

PowerPoint Presentation

ORANGE FOR ORACLE V4.0 INSTALLATION GUIDE (Online Upgrade) ORANGE CONFIGURATION ADMIN O

<C0CCBCBCBFB52DC1A4B4EBBFF82DBCAEBBE7B3EDB9AE2D D382E687770>

Microsoft PowerPoint - 2강

Microsoft PowerPoint - 10Àå.ppt

MasoJava4_Dongbin.PDF

歯JavaExceptionHandling.PDF

ETL_project_best_practice1.ppt

금오공대 컴퓨터공학전공 강의자료

신림프로그래머_클린코드.key

PowerPoint Presentation

iBATIS-SqlMaps-2

gnu-lee-oop-kor-lec06-3-chap7

Spring Boot

어댑터뷰

Microsoft PowerPoint - CSharp-10-예외처리

슬라이드 1

슬라이드 1

목차 BUG offline replicator 에서유효하지않은로그를읽을경우비정상종료할수있다... 3 BUG 각 partition 이서로다른 tablespace 를가지고, column type 이 CLOB 이며, 해당 table 을 truncate

제11장 프로세스와 쓰레드

USER GUIDE

Intra_DW_Ch4.PDF

내장서버로사용. spring-boot-starter-data-jpa : Spring Data JPA 사용을위한설정 spring-boot-devtools : 개발자도구를제공, 이도구는응용프로그램개발모드에서유 용한데코드가변경된경우서버를자동으로다시시작하는일들을한다. spri

ALTIBASE 사용자가이드 Templete

웹연동 } 웹 (Web) 환경에서데이터베이스시스템을연동하는방법은다음과같다 } Server Client 구조의통신 (2-Tier) } Server Middleware Client 구조의통신 (3-Tier) 2

Portal_9iAS.ppt [읽기 전용]

JVM 메모리구조

슬라이드 1

Chap7.PDF

thesis

FileMaker ODBC and JDBC Guide

FileMaker ODBC 및 JDBC 가이드

JDBC 소개및설치 Database Laboratory

C++ Programming

Analytics > Log & Crash Search > Unity ios SDK [Deprecated] Log & Crash Unity ios SDK. TOAST SDK. Log & Crash Unity SDK Log & Crash Search. Log & Cras

서현수

개발문서 Oracle - Clob

Spring Batch 2.0 시작하기

(Microsoft PowerPoint - java1-lecture11.ppt [\310\243\310\257 \270\360\265\345])

Design Issues

Transcription:

1. 개요 2. Data Source 3. Data Access 4. ORM 5. Transaction - 1 -

1. 개요 - 실행환경데이터처리레이어 (1/3) 데이터베이스에대한연결및영속성처리, 선언적인트랜잭션관리를제공하는 Layer 임 전자정부개발프레임워크실행환경 서비스그룹 Presentation Layer 설명 업무프로그램과사용자간의 Interface 를담당하는 Layer 로서, 사용자화면구성, 사용자입력정보검증등의기능을제공함 Layer Presentation Layer Logic Business Layer Persistence Integration Layer Business Logic Layer 업무프로그램의업무로직을담당하는 Layer 로서, 업무흐름제어, 에러처리등의기능을제공함 Persistence Layer 데이터베이스에대한연결및영속성처리, 선언적인트랜잭션관리를제공하는 Layer 임 Foundation Layer ( 공통기반레이어 ) Integration Layer 타시스템과의연동기능을제공하는 Layer 임 환경 서비스그룹 Foundation Layer ( 공통기반레이어 ) 실행환경의각 Layer 에서공통적으로사용하는공통기능을제공함 - 2 -

1. 개요 - 실행환경데이터처리레이어 (2/3) 데이터처리레이어는 DataSource, Data Access 등총 4 개의서비스를제공함 실행환경 화면처리레이어 업무처리레이어 데이터처리레이어 연계통합레이어 MVC Internationalization Process Control DataSource Data Access Naming Service Ajax Support Security Exception Handling ORM TBD Transaction Integration Service UI Adaptor Web Service 공통기반레이어 AOP Cache Compress/Decompress Encryption/Decryption Excel File Handling File Upload/Download FTP Server Security ID Generation IoC Container Logging Mail Marshalling/Unmarshalling Object Pooling Property Resource Scheduling String Util XML Manipulation 실행환경서비스그룹서비스 - 3 -

1. 개요 - 실행환경데이터처리레이어 (3/3) 데이터처리레이어는 Spring MVC, ibatis 등총 3 종의오픈소스 SW 를사용하고있음 서비스 오픈소스 SW 버전 DataSource Spring 2.5 Data Access ibatis SQL Maps 2.3 ORM Hibernate 3.2 Transaction Spring 2.5-4 -

1. 개요 - Hibernate(1/2) Hibernate 는자바객체와관계형데이터모델간의매핑을위한도구이며쿼리서비스를지원하는 강력한고성능의퍼시스턴스프레임워크임 관계형데이터모델에대한객체지향관점을제공하는객체 / 관계매핑 (Object Relational Mapping) 프레임워크 Gavin King (JBoss, 현재 Red Hat) 을중심으로한소프트웨어개발팀에의해개발됨. * Open Source Catalogue 2007, Optaros (Hibernate 3.2 기준 ) - 5 -

1. 개요 - Hibernate(2/2) Hibernate 는 J2EE 표준인 JNDI, JDBC, JTA 를기반으로객체관계형매핑 (OR Mapping), 데이터 베이스연결및트랜잭션관리기능등을제공함 - 6 -

1. 개요 - ibatis(1/2) ibatis 는단순성이라는사상을강조한퍼시스턴스프레임워크로, SQL 맵을이용하여반복적이고복 잡한 DB 작업코드를최소화함 단순성이라는사상을강조하여, XML 을이용하여 Stored Procedure 혹은 SQL 문과자바객체간의매핑을지원 2001 년 Clinton Begin (Apache 소프트웨어재단 ) 에의해개발된퍼시스턴스프레임워크 * Performance Comparison of Persistence Frameworks, Sabu M. Thampi, Ashwin a K. (2007) - 7 -

1. 개요 - ibatis(2/2) ibatis 는소스코드외부에정의된 SqlMap.xml 파일정보를바탕으로생성된 Mapped Statement 를 이용하여 SQL 과객체간의매핑기능을제공함 * ibatis SQL Maps 개발자가이드 Version 2.0-8 -

2. Data Source - 개요 서비스개요 데이터베이스에대한연결을제공하는서비스이다. 다양한방식의데이터베이스연결을제공하고, 이에대한 추상화계층을제공함으로써, 업무로직과데이터베이스연결방식간의종속성을배제한다. 주요기능 JDBC DataSource JDBC driver 를이용하여 Database Connection 을생성한다. 1. Configuration <bean id="datasource" class="org.springframework.jdbc.datasource.drivermanagerdatasource"> <property name="driverclassname" value="${driver" /> <property name="url" value="${dburl" /> <property name="username" value="${username" /> <property name="password" value="${password" /> </bean> driverclassname : JDBC driver class name 설정 url : DataBase 접근하기위한 JDBC URL username : DataBase 접근하기위한사용자명 password : DataBase 접근하기위한암호 - 9 -

2. Data Source - 설명 (1/8) 2. Sample Source @Resource(name = "datasource") DataSource datasource; @Resource(name = "jdbcproperties") Properties jdbcproperties; boolean ishsql = true; DataSource 설정 @Test public void testjdbcdatasource() throws Exception { assertnotnull(datasource); assertequals("org.springframework.jdbc.datasource.drivermanagerdatasource", datasource.getclass().getname()); Connection con = null; Statement stmt = null; ResultSet rs = null; try { con = datasource.getconnection(); assertnotnull(con); stmt = con.createstatement(); rs = stmt.executequery("select 'x' as x from dual"); while (rs.next()) { assertequals("x", rs.getstring(1));. - 10 -

2. Data Source - 설명 (2/8) DBCP DataSource JDBC driver 를이용한 Database Connection 구현체이다.Commons DBCP 라불리는 Jakarta 의 Database Connection Pool 이 다. 1. Configuration <bean id="datasource" class="org.apache.commons.dbcp.basicdatasource" destroy-method="close"> <property name="driverclassname" value="${driver" /> <property name="url" value="${dburl" /> <property name="username" value="${username" /> <property name="password" value="${password" /> <property name="defaultautocommit" value="false" /> <property name="poolpreparedstatements" value="true" /> </bean> driverclassname : jdbc driver class name 설정 url : DataBase url 설정 username : DataBase 접근하기위한사용자명 password : DataBase 접근하기위한암호 defaultautocommit : DataBase 로부터리턴된 connection 에대한 auto-commit 여부를설정 poolpreparedstatements : PreparedStatement 사용여부 - 11 -

2. Data Source - 설명 (3/8) 2. Sample Source @Resource(name = "datasource") DataSource datasource; @Resource(name = "jdbcproperties") Properties jdbcproperties; boolean ishsql = true; @Test public void testdbcpdatasource() throws Exception { assertnotnull(datasource); assertequals("org.apache.commons.dbcp.basicdatasource", datasource.getclass().getname()); Connection con = null; Statement stmt = null; ResultSet rs = null; try { con = datasource.getconnection(); assertnotnull(con); stmt = con.createstatement(); rs = stmt.executequery("select 'x' as x from dual"); while (rs.next()) { assertequals("x", rs.getstring(1));.. - 12 -

2. Data Source - 설명 (4/8) C3P0 DataSource DBCP DataSource의메모리누수문제가한창불거져문제가되었을즈음대안으로제시되어지금은가장많이선호하는오픈소스 DataSource 이다. 1. Configuration <bean id="datasource" class="com.mchange.v2.c3p0.combopooleddatasource" destroy-method="close"> <property name="driverclass" value="${driver" /> driverclass : jdbc driver <property name="jdbcurl" value="${dburl" /> jdbcurl : DB URL <property name="user" value="${username" /> user : 사용자명 <property name="password" value="${password" /> password : 암호 <property name="initialpoolsize" value="3" /> initalpoolsize : 풀초기값 <property name="minpoolsize" value="3" /> maxpoolsize : 풀최소값 <property name="maxpoolsize" value="50" /> idleconnectiontestperiod : idle상태 <property name="idleconnectiontestperiod" value="200"/> 점검시간 <property name="acquireincrement" value="1" /> acquireincrement : 증가값 <property name="maxstatements" value="0" /> maxstatements : 캐쉬유지여부 <property name="numhelperthreads" value="3" /> numhelperthreads : HelperThread </bean> 개수 - 13 -

2. Data Source - 설명 (5/8) 2. Sample Source @Resource(name = "datasource") DataSource datasource; @Resource(name = "jdbcproperties") Properties jdbcproperties; @Test public void testc3p0datasource() throws Exception { assertnotnull(datasource); assertequals("com.mchange.v2.c3p0.combopooleddatasource", datasource.getclass().getname()); Connection con = null; Statement stmt = null; ResultSet rs = null; try { con = datasource.getconnection(); assertnotnull(con); stmt = con.createstatement(); rs = stmt.executequery("select 'x' as x from dual"); while (rs.next()) { assertequals("x", rs.getstring(1));... - 14 -

2. Data Source - 설명 (6/8) JNDI DataSource JNDIDataSource는 JNDI Lookup을이용하여 Database Connection을생성한다. JNDIDataSource는대부분 Enterprise application server에서제공되는 JNDI tree로부터 DataSource를가져온다. 1. Configuration <jee:jndi-lookup id="datasource" jndi-name="${jndiname" resource-ref="true"> <jee:environment> java.naming.factory.initial=${jeus.java.naming.factory.initial java.naming.provider.url=${jeus.java.naming.provider.url </jee:environment> </jee:jndi-lookup> JEUS 설정 WEBLOGIC 설정 <util:properties id="jndiproperties" location="classpath:/meta-inf/spring/jndi.properties" /> <jee:jndi-lookup id="datasource" jndi-name="${jndiname" resource-ref="true" environmentref="jndiproperties" /> - 15 -

2. Data Source - 설명 (7/8) 2. Sample Source @Resource(name = "datasource") DataSource datasource; @Resource(name = "jdbcproperties") Properties jdbcproperties; @Test public void testjndijeusdatasource() throws Exception { assertnotnull(datasource); assertequals("jeus.jdbc.connectionpool.datasourcewrapper", datasource.getclass().getname()); Connection con = null; Statement stmt = null; ResultSet rs = null; try { con = datasource.getconnection(); assertnotnull(con); stmt = con.createstatement(); rs = stmt.executequery("select 'x' as x from dual"); while (rs.next()) { assertequals("x", rs.getstring(1));... Jues DataSource 설정 - 16 -

2. Data Source - 설명 (8/8) 2. Sample Source @Resource(name = "datasource") DataSource datasource; @Resource(name = "jdbcproperties") Properties jdbcproperties; @Test WebLogic DataSource 설정 public void testjndidatasource() throws Exception { assertnotnull(datasource); assertequals("weblogic.jdbc.common.internal.rmidatasource_922_wlstub ", datasource.getclass().getname()); Connection con = null; Statement stmt = null; ResultSet rs = null; try { con = datasource.getconnection(); assertnotnull(con); stmt = con.createstatement(); rs = stmt.executequery("select 'x' as x from dual"); while (rs.next()) { assertequals("x", rs.getstring(1));... - 17 -

2. Data Source - 참고자료 Commons DBCP http://commons.apache.org/dbcp/ C3P0 http://www.mchange.com/projects/c3p0/index.html - 18 -

3. Data Access 개요 (1/2) 서비스개요 JDBC 를사용한 Data Access 를추상화하여간편하고쉽게사용할수있는 Data Mapper framework 인 ibatis 를 Data Access 기능의기반오픈소스로채택 ibatis 를사용하면관계형데이터베이스에엑세스하기위해필요한일련의자바코드사용을현저히줄일수있으며간단한 XML 기술을사용하여 SQL 문을 JavaBeans ( 또는 Map) 에간편하게매핑할수있음 Data Access 서비스는다양한데이터베이스솔루션및데이터베이스접근기술에일관된방식으로대응하기위한서비스 데이터를조회하거나입력, 수정, 삭제하는기능을수행하는메커니즘을단순화함 데이터베이스솔루션이나접근기술이변경될경우에도데이터를다루는시스템영역의변경을최소화할수있도록데이터베이스와의접점을추상화함 추상화된데이터접근방식을템플릿 (Template) 으로제공함으로써, 개발자들의업무효율을향상시킴. - 19 -

3. Data Access 개요 (2/2) 주요기능 추상화된접근방식제공 JDBC 데이터억세스에대한추상화된접근방식으로간편하고쉬운 API, 자원연결 / 해제, 공통에러처리등을통합지원함 코드로부터 SQL 분리지원 소스코드로부터 SQL 문을분리하여별도의 repository( 의미있는문법의 XML) 에유지하고이에대한빠른참조구조를내부적으로구현하여관리 / 유지보수 / 튜닝의용이성을보장함. 쿼리실행의입 / 출력객체바인딩 / 맵핑지원 쿼리문의입력파라메터에대한바인딩과실행결과 resultset 의가공 ( 맵핑 ) 처리시객체 (VO, Map, List) 수준의자동화를지원함 Dynamic SQL 지원 코드작성, API 직접사용없이입력조건에따른동적인쿼리문변경을지원함 다양한 DB 처리지원 기본질의외에 Batch SQL, Paging, Callable Statement, BLOB/CLOB 등다양한 DB 처리를지원함 - 20 -

3. Data Access 설명 (1/20) Data Access 서비스 ibatis Data Mapper API 는 XML을사용하여 SQL 문에대한객체맵핑을간편하게기술할수있도록지원 자바빈즈객체와 Map 구현체, 다양한원시래퍼타입 (String, Integer..) 등을 PreparedStatement 의파라메터나 ResultSet에대한결과객체로쉽게맵핑해줌 - 21 -

3. Data Access 설명 (2/20) 세부사항설명 ibatis Configuration ibatis 의메인설정파일인 SQL Map XML Configuration 파일 ( 이하 sql-map-config.xml 설정파일 ) 작성과상세한옵션설정 Data Type 데이터베이스를이용하여데이터를저장하고조회할때 Java 어플리케이션에서의 Type 과 DBMS 에서지원하는관련매핑 jdbc Type 의정확한사용이필요 parametermap 해당요소로 SQL 문외부에정의한입력객체의속성에대한 name 및 javatype, jdbctype 을비롯한옵션을설정할수있는매핑요소 Inline parameters prepared statement 에대한바인드변수매핑처리를위한 parametermap 요소 (SQL 문외부에정의한입력객체 property name 및 javatype, jdbctype 을비롯한옵션을설정매핑요소 ) 와동일한기능을처리하는간편한방법 resultmap resultmap 은 SQL 문외부에정의한매핑요소로, result set 으로부터어떻게데이터를뽑아낼지, 어떤칼럼을어떤 property 로매핑할지에대한상세한제어를가능케해줌 Dynamic SQL SQL 문의동적인변경에대한상대적으로유연한방법을제공하는 ibatis 의 Dynamic 요소 - 22 -

3. Data Access 설명 (3/20) 세부사항설명 ( ibatis Configuration ) (1/5) sql-map-config.xml ( 1/2 ) SqlMapClient 설정관련상세내역을제어할수있는메인설정파일로주로 transaction 관리관련설정및다양한옵션설정, Sql Mapping 파일들에대한 path 설정등을포함한다. <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE sqlmapconfig PUBLIC "-//ibatis.com//dtd SQL Map Config 2.0//EN" "http://www.ibatis.com/dtd/sql-map-config-2.dtd"> <sqlmapconfig> <properties resource="meta-inf/spring/jdbc.properties" /> <settings cachemodelsenabled="true" enhancementenabled="true" lazyloadingenabled="true" maxrequests="128" maxsessions="10" maxtransactions="5" usestatementnamespaces="false" defaultstatementtimeout="1" /> <typehandler javatype="java.util.calendar" jdbctype="timestamp" callback="egovframework.rte.psl.dataaccess.typehandler.calendartypehandler" /> <transactionmanager type="jdbc"> <datasource type="dbcp"> <property name="driverclassname" value="${driver" /> <property name="url" value="${dburl" /> <property name="username" value="${username" /> <property name="password" value="${password" /> <!-- OPTIONAL PROPERTIES BELOW --> - 23 -

3. Data Access 설명 (4/20) 세부사항설명 ( ibatis Configuration ) (2/5) sql-map-config.xml ( 2/2 ) <property name="maxactive" value="10" /> <property name="maxidle" value="5" /> <property name="maxwait" value="60000" /> <!-- validation query --> <!--<property name="validationquery" value="select * from DUAL" />--> <property name="logabandoned" value="false" /> <property name="removeabandoned" value="false" /> <property name="removeabandonedtimeout" value="50000" /> <property name="driver.driverspecificproperty" value="somevalue" /> </datasource> </transactionmanager> <sqlmap resource="meta-inf/sqlmap/mappings/testcase-basic.xml" /> <sqlmap../>.. </sqlmapconfig> properties : 표준 java properties (key=value 형태 ) 파일에대한연결을지원하며설정파일내에서 ${key 와같은 properties 형태로외부화해놓은실제의값 ( 여기서는 DB 접속관련 driver, url, id/pw) 을참조할수있다. resource 속성으로 classpath 지정가능, url 속성으로유효한 URL 상에있는자원을지정가능 settings : 이설정파일을통해생성된 SqlMapClient instance 에대하여다양한옵션설정을통해최적화할수있도록지원함. 모든속성은선택사항 (optional) 이다 - 24 -

3. Data Access 설명 (5/20) 세부사항설명 ( ibatis Configuration ) (3/5) 속성 설명 Example, Default maxrequests 같은시간대에 SQL 문을실행할수있는 thread 의최대갯수지정. maxrequests= 256, 512 maxsessions 주어진시간에활성화될수있는 session( 또는 client) 수지정. maxsessions= 64, 128 maxtransactions 같은시간대에 SqlMapClient.startTransaction() 에들어갈수있는최대갯수지정. maxtransactions= 16, 32 cachemodelsenabled SqlMapClient 의모든 cachemodel 에대한사용여부를 global 하게지정. lazyloadingenabled SqlMapClient 의모든 lazy loading 에대한사용여부를 global 하게지정. enhancementenabled runtime bytecode enhancement 기술사용여부지정. cachemodelsenabled= true, true (enabled) lazyloadingenabled= true, true (enabled) enhancementenabled= true, false (disabled) usestatementnamespaces defaultstatementtimeout classinfocacheenabled statementcachingenabled mapped statements 에대한참조시 namespace 조합사용여부지정. true 인경우 queryforobject( sqlmapname.statementname ); 과같이사용함. 모든 JDBC 쿼리에대한 timeout 시간 ( 초 ) 지정, 각 statement 의설정으로 override 가능함. 모든 driver 가이설정을지원하는것은아님에유의할것. introspected(java 의 reflection API 에의해내부참조된 ) class 의캐쉬를유지할지에대한설정 prepared statement 의 local cache 를유지할지에대한설정 usestatementnamespaces= false, false (disabled) 지정하지않는경우 timeout 없음 (cf. 각 statement 설정에따라 ) classinfocacheenabled= true, true (enabled) statementcachingenabled= true, true (enabled) - 25 -

3. Data Access 설명 (6/20) 세부사항설명 ( ibatis Configuration ) (4/5) SQL Map XML 파일 (sql 매핑파일 ) <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE sqlmap PUBLIC "-//ibatis.com//dtd SQL Map 2.0//EN" "http://www.ibatis.com/dtd/sql-map- 2.dtd"> <sqlmap namespace="dept"> <typealias alias="deptvo" type="egovframework.deptvo" /> <resultmap id="deptresult" class="deptvo"> <result property="deptno" column="dept_no" /> <result property="deptname" column="dept_name" /> <result property="loc" column="loc" /> </resultmap> <insert id="insertdept" parameterclass="deptvo"> insert into DEPT (DEPT_NO, DEPT_NAME, LOC) values (#deptno#, #deptname#, #loc#) </insert> <select id="selectdept" parameterclass="deptvo" resultmap="deptresult"> <![CDATA[ select DEPT_NO, DEPT_NAME, LOC from DEPT where DEPT_NO = #deptno# ]]> </select> </sqlmap> - 26 -

3. Data Access 설명 (7/20) 세부사항설명 ( ibatis Configuration ) (5/5) SQL Map XML 파일 typealias : 현재매핑파일내에서객체에대한간략한 alias 명을지정함. (cf. 매우자주쓰이는 class 의경우 sql-mapconfig.xml 에 global 하게등록하는것이좋음 ) resultmap : DB 칼럼명 (select 문의칼럼 alias) 과결과객체의 attribute 에대한매핑및추가옵션을정의함. insert, select : 각 statement 타입에따른 mapped statement 정의요소예시. 유형에따라 insert/update/delete/select/procedure/statement 요소사용가능 이외에도 parametermap, resultmap 에대한상세정의, cachemodel 설정, sql 문재사용을위한 sql 요소설정이나타날수있다. 각각에대한상세사항은관련가이드를참고 - 27 -

3. Data Access 설명 (8/20) 세부사항설명 ( Data Type ) 어플리케이션을작성할때 Data Type 에대한올바른사용과관련처리는매우중요함 데이터베이스를이용하여데이터를저장하고조회할때 Java 어플리케이션에서의 Type 과 DBMS 에서지원하는관련매핑 jdbc Type 의정확한사용이필요함 기본 Data Type 사용방법 ibatis SQL Mapper 프레임워크는 Java 어플리케이션영역의표준 JavaBeans 객체 ( 또는 Map 등 ) 의각 Attribute 에대한 Java Type 과 JDBC 드라이버에서지원하는각 DBMS의테이블칼럼에대한 Data Type 의매핑을기반으로 parameter / result 객체에대한바인딩 / 매핑을처리함 각 javatype 에대한매칭되는 jdbctype 은일반적인 Ansi SQL 을사용한다고하였을때아래에서대략확인할수있음 특정 DBMS 벤더에따라추가적으로지원 / 미지원하는 jdbctype 이다를수있고, 또한같은 jdbctype 을사용한다하더라도타입에따른사용가능한경계값 (boundary max/min value) 은다를수있음 - 28 -

3. Data Access 설명 (9/20) 세부사항설명 ( parametermap ) 해당요소로 SQL 문외부에정의한입력객체의속성에대한 name 및 javatype, jdbctype 을비롯한옵션을설정할수있는매핑요소임. JavaBeans 객체 ( 또는 Map 등 ) 에대한 prepared statement 에대한바인드변수매핑을처리할수있음. 유사한기능을처리하는 parameterclass 나 Inline Parameter 에비해많이사용되지않지만더기술적인 (descriptive) parametermap( 예를들어 stored procedure 를위한 ) 이필요함 XML 의일관된사용과순수성을지키고자할때좋은접근법이될수도있음. Dynamic 요소와함께사용될수없고바인드변수의갯수와순서를정확히맞춰야하는불편이있는등일반적으로사용을추천하지않음. - 29 -

3. Data Access 설명 (10/20) 세부사항설명 ( Inline Parameters ) prepared statement 에대한바인드변수매핑처리를위한 parametermap 요소 SQL 문외부에정의한입력객체 property name 및 javatype, jdbctype 을비롯한옵션을설정매핑요소와동일한기능을처리하는간편한방법을 Inline Parameters 방법으로제공보통 parameterclass 로명시된입력객체에대해바인드변수영역을간단한 #property# 노테이션으로나타내는 Inline Parameter 방법은기존 parametermap 에서의? 와이의순서를맞춘외부 parametermap 선언으로처리하는방법에비해많이사용되고일반적으로추천하는방법 Dynamic 요소와함께사용될수있고별도의외부매핑정의없이바인드변수처리가필요한위치에해당 property 를직접사용가능하며, 필요한경우 jdbctype 이나 nullvalue 를간단한추가노테이션과같이지정할수있음 (ex. #empname:varchar:blank# ) (ex. #comm,javatype=decimal,jdbctype=numeric,nullvalue=-99999# ),(comma) 로구분된필요한속성 = 값을상세하게기술할수도있음. - 30 -

3. Data Access 설명 (11/20) 세부사항설명 ( resultmap ) resultmap 은 SQL 문외부에정의한매핑요소 result set 으로부터어떻게데이터를뽑아낼지, 어떤칼럼을어떤 property로매핑할지에대한상세한제어를가능케해줌. resultmap 은일반적으로가장많이사용되는중요한매핑요소로 resultclass 속성을이용한자동매핑접근법에비교하여칼럼타입의지시, null value 대체값, typehandler 처리, complex property 매핑 ( 다른 JavaBean, Collections 등을포함하는복합객체 ) 등을허용함. - 31 -

3. Data Access 설명 (12/20) 세부사항설명 ( Dynamic SQL ) 일반적으로 JDBC API 를사용한코딩에서한번정의한쿼리문을최대한재사용하고자하나단순파라메터변수의값만변경하는것으로해결하기어렵고다양한조건에따라조금씩다른쿼리의실행이필요한경우많은 if~else 조건분기의연결이필요한문제가있음. 1-1 Dynamic SQL mapping xml 파일.. <typealias alias="jobhistvo" type="egovframework.rte.psl.dataaccess.vo.jobhistvo" /> <select id="selectjobhistlistusingdynamicelement" parameterclass="jobhistvo" resultclass="jobhistvo"> <![CDATA[ select EMP_NO as empno, START_DATE as startdate, END_DATE as enddate, JOB as job, SAL as sal, COMM as comm, DEPT_NO as deptno from JOBHIST ]]> <dynamic prepend="where"> <isnotnull property="empno" prepend="and"> EMP_NO = #empno# </isnotnull> </dynamic> order by EMP_NO, START_DATE </select> - 32 -

3. Data Access 설명 (13/20) 세부사항설명 ( Dynamic SQL ) Unary 비교연산 ( 1/2 ) 1-2 Sample Unary 비교연산.. <typealias alias="egovmap" type="egovframework.rte.psl.dataaccess.util.egovmap" /> <select id="selectdynamicunary" parameterclass="map" remapresults="true" resultclass="egovmap"> select <dynamic> <isempty property="testemptystring"> 'empty String' as IS_EMPTY_STRING </isempty> <isnotempty property="testemptystring"> 'not empty String' as IS_EMPTY_STRING </isnotempty>.. <ispropertyavailable prepend=", " property="testproperty"> 'testproperty Available' astest_property_available </ispropertyavailable> <isnotpropertyavailable prepend=", " property="testproperty"> 'testproperty Not Available' as TEST_PROPERTY_AVAILABLE </isnotpropertyavailable> </dynamic> from dual </select> - 33 -

3. Data Access 설명 (14/20) 세부사항설명 ( Dynamic SQL ) Unary 비교연산 ( 2/2 ) Unary 비교연산태그 태그 설명 isempty isnotempty isnull isnotnull ispropertyavailable isnotpropertyavailable Collection, String( 또는 String.valueOf()) 대상속성이 null 이거나 empty( 또는 size() < 1) 인경우 true Collection, String( 또는 String.valueOf()) 대상속성이 not null 이고 not empty( 또는 size() < 1) 인경우 true 대상속성이 null 인경우 true 대상속성이 not null 인경우 true 파라메터객체에대상속성이존재하는경우 true 파라메터객체에대상속성이존재하지않는경우 true Unary 비교연산태그속성 속성 설명 prepend 동적구문앞에추가되는 override 가능한 SQL 영역. property 필수. 파라메터객체의어떤 property 에대한체크인지지정. removefirstprepend open close 첫번째로내포될내용을생성하는태그의 prepend 를제거할지여부 (true/false) 전체결과구문에대한시작문자열 전체결과구문에대한닫는문자열 - 34 -

3. Data Access 설명 (15/20) 세부사항설명 ( Dynamic SQL ) Binary 비교연산 ( 1/2 ) 1-3 Sample Binary 비교연산.. <typealias alias="egovmap" type="egovframework.rte.psl.dataaccess.util.egovmap" /> <select id="selectdynamicbinary" parameterclass="map" remapresults="true" resultclass="egovmap"> select <dynamic> <isequal property="teststring" comparevalue="test"> '$teststring$' as TEST_STRING, 'test : equals' as IS_EQUAL </isequal> <isnotequal property="teststring" comparevalue="test"> '$teststring$' as TEST_STRING, 'test : not equals' as IS_EQUAL </isnotequal>.. <islessthan property="testotherstring" prepend=", " compareproperty="teststring"> '''$testotherstring$'' <![CDATA[<]]> ''$teststring$''' as COMPARE_PROPERTY_LESS_THAN </islessthan> </ispropertyavailable> </dynamic> from dual </select>.. - 35 -

3. Data Access 설명 (16/20) 세부사항설명 ( Dynamic SQL ) Binary 비교연산 ( 2/2 ) Binary 비교연산태그 태그 설명 isequal isnotequal isgreaterequal isgreaterthan islessequal 대상속성이 comparevalue 값또는 compareproperty 로명시한대상속성값과같은경우 true 대상속성이 comparevalue 값또는 compareproperty 로명시한대상속성값과다른경우 true 대상속성이 comparevalue 값또는 compareproperty 로명시한대상속성값보다크거나같은경우 true 대상속성이 comparevalue 값또는 compareproperty 로명시한대상속성값보다큰경우 true 대상속성이 comparevalue 값또는 compareproperty 로명시한대상속성값보다작거나같은경우 true islessthan 대상속성이 comparevalue 값또는 compareproperty 로명시한대상속성값보다작은경우 true Binary 비교연산태그속성 속성 설명 prepend 동적구문앞에추가되는 override 가능한 SQL 영역. property 필수. 파라메터객체의어떤 property 에대한비교인지지정. compareproperty 파라메터객체의다른 property 와대상 property 값을비교하고자할경우지정. (comparevalue 가없는경우필수 ) comparevalue 대상 property 와비교될값을지정. (compareproperty 가없는경우필수 ) removefirstprepend open close 첫번째로내포될내용을생성하는태그의 prepend 를제거할지여부 (true/false) 전체결과구문에대한시작문자열 전체결과구문에대한닫는문자열 - 36 -

3. Data Access 설명 (17/20) 세부사항설명 ( Dynamic SQL ) ParameterPresent 비교 (1/2) 1-4 Sample ParameterPresent 비교.. <typealias alias="egovmap" type="egovframework.rte.psl.dataaccess.util.egovmap" /> <select id="selectdynamicparameterpresent" parameterclass="map" remapresults="true" resultclass="egovmap"> select <isparameterpresent> 'parameter object exist' as IS_PARAMETER_PRESENT </isparameterpresent> <isnotparameterpresent> 'parameter object not exist' as IS_PARAMETER_PRESENT </isnotparameterpresent> from dual </select> - 37 -

3. Data Access 설명 (18/20) 세부사항설명 ( Dynamic SQL ) ParameterPresent 비교 (2/2) ParameterPresent 비교태그 태그 설명 isparameterpresent isnotparameterpresent 파라메터객체가전달된 (not null) 경우 true 파라메터객체가전달되지않은 (null) 경우 true ParameterPresent 비교테그속성 속성 설명 prepend 동적구문앞에추가되는 override 가능한 SQL 영역. removefirstprepend 필수. 파라메터객체의어떤 property 에대한비교인지지정. open close 전체결과구문에대한시작문자열 전체결과구문에대한닫는문자열 - 38 -

3. Data Access 설명 (19/20) 세부사항설명 ( Dynamic SQL ) iterate 연산 ( 1/2 ) 1-5 Sample iterate 연산 <typealias alias="jobhistvo" type="egovframework.rte.psl.dataaccess.vo.jobhistvo" /> <typealias alias="empincludesemplistvo" type="egovframework.rte.psl.dataaccess.vo.empincludesemplistvo" /> <select id="selectjobhistlistusingdynamiciterate" parameterclass="empincludesemplistvo" resultclass="jobhistvo"> <![CDATA[ select EMP_NO as empno, START_DATE as startdate, END_DATE as enddate, JOB as job, SAL as sal, COMM as comm, DEPT_NO as deptno from JOBHIST ]]> <dynamic prepend="where"> <iterate property="emplist" open="emp_no in (" conjunction=", " close=")"> #emplist[].empno# </iterate> </dynamic> order by EMP_NO, START_DATE </select> - 39 -

3. Data Access 설명 (20/20) 세부사항설명 ( Dynamic SQL ) iterate 연산 ( 2/2 ) iterate 연산태그 태그 설명 iterate collection 형태의대상객체에대하여포함하고있는각개별요소만큼반복루프를돌며해당내용을수행함 iterate 연산태그속성 속성 설명 prepend 동적구문앞에추가되는 override 가능한 SQL 영역. property 필수. 파라메터객체의어떤 property 에대한비교인지지정. removefirstprepend open Close conjunction 첫번째로내포될내용을생성하는태그의 prepend 를제거할지여부 (true/false/iterate) 전체결과구문에대한시작문자열전체결과구문에대한닫는문자열각 iteration 사이에적용될문자열. AND, OR 연산자나 ',' 등의구분자필요시유용함 - 40 -

3. Data Access - 참고자료 ibatis site http://ibatis.apache.org ibatis-sqlmaps-2 Developer Guide http://svn.apache.org/repos/asf/ibatis/trunk/java/ibatis-2/ibatis-2-docs/en/ibatis-sqlmaps-2_en.pdf ibatis-sqlmaps-2 개발자가이드 http://kldp.net/frs/download.php/5035/ibatis-sqlmaps-2_ko.pdf Spring Framework - Reference Documentation http://static.springframework.org/spring/docs/2.5.6/reference/orm.html#orm-ibatis - 41 -

4. ORM - 개요 서비스개요 객체모델과관계형데이터베이스간의매핑기능인 ORM(Object-Relational Mapping) 기능을제공함으로써, SQL이아닌객체을이용한업무로직의작성이가능하도록지원함 주요기능 객체와관계형데이터베이스테이블간의매핑 프레임워크설정정보에저장된 ORM 매핑정보를이용하여객체와관계형데이터베이스테이블간의매핑지원 객체로딩 객체와매핑되는관계형데이터베이스의값을읽어와객체의속성값으로설정함 객체저장 저장하고자하는객체의속성값을객체와매핑되는관계형데이터베이스에저장 다양한연관관계지원 객체와객체간의 1:1, 1:n, n:n 등의다양한연관관계를지원 객체의로딩및저장시, 연관관계를맺고있는객체도로딩및저장지원 Caching 객체에대한 Cache 기능을지원하여성능을향상시킴 - 42 -

4. ORM Hibernate 개요 (1/3) Hibernate 란 객체모델링 (Object Oriented Modeling) 과관계형데이터모델링 (Relational Data Modeling) 사이의불일치를 해결해주는 OR Mapping 서비스를지원하는개발프레임워크 Hibernate 특징 (1/2) 특정 DBMS에영향을받지않으므로 DBMS가변경되더라도데이터액세스처리코드에대한변경없이설정정보의변경만으로도동작가능 SQL을작성하고 SQL 실행결과로부터전달하고자하는객체로변경하는코드작성하는시간을감소시킴 필요시 SQL 사용도가능함 기본적으로필요시점에만 DBMS에접근하는 Lazy Loading 전략을채택하고 Cache활용을통해 DBMS에대한접근횟수를줄여나가어플리케이션의성능을향상시킴 별도의 XML 파일로매핑을관리하지않고 Entity Class에최소한의 Annotation으로정의함으로써작업이용이함 - 43 -

4. ORM - Hibernate 개요 (1/3) Hibernate 특징 (2/2) Entity Class가일반클래스로정의됨으로써상속이나다양성, 캡슐화같은것들을그대로적용하면서퍼시스턴스오브젝트로사용할수있음 자바표준이므로많은벤더들에서구현체를지원하고개발을편리하게할수있는 JPA툴 (Dali) 을지원함 SQL을이용하여처리하는방식에익숙한개발자가사용하려면학습이필요하고이에따른장벽이존재함 - 44 -

4. ORM - Hibernate 개요 (1/3) Hibernate 아키텍처 Entity 어플리케이션실행여부와상관없이물리적으로존재하는데이터들을다룸 데이터처리시 Entity를중심으로하여어플리케이션의데이터와 DBMS 연동함 annotation 기반으로매핑관련사항을 Entity 클래스에서정의할수있어별도의파일없이테이블과의관계를표현할수있음 Persistence.xml 구현체에대한선언및대상엔티티클래스지정구현체별프로퍼티지정등을할수있는설정파일 Conceptual Architecture Application Entity JPA(Hibernate) Persistence.xml JPA(Hibernate) JPA 구현체로의 Hibernate 의요소는 Hibernate Core, Hibernate Annotations, Hibernate EntityManager 로되어있으며 JPA 구성에 필요한 Entity Manager 등구현클래스를포함하고있음 Database - 45 -

4. ORM Hibernate 맛보기예제 (1/4) Entity 클래스작성 네개의 Attribute 와각각의 getter setter 메소드로구성되어있는간단한 Entity 클래스를생성 @Entity Department 가 Entity 클래스임을정의 public class Department implements Serializable { private static final long serialversionuid = 1L; @Id Primary Key 정보지정 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;... - 46 -

4. ORM Hibernate 맛보기예제 (2/4) persistence.xml 작성 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> - 47 -

4. ORM Hibernate 맛보기예제 (3/4) 테스트클래스작성 (1/2) Department 를사용하여입력, 수정, 조회, 삭제처리를하는것을테스트케이스로작성하여시험 @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()); - 48 -

4. ORM Hibernate 맛보기예제 (4/4) 테스트클래스작성 (2/2) Department 를사용하여입력, 수정, 조회, 삭제처리를하는것을테스트케이스로작성하여시험 // 수정 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(); - 49 -

4. ORM Hibernate 설명 (1/20) Entities(1/3) ORM 서비스를구성하는가장기초적인클래스로어플리케이션에서다루고자하는테이블에대응하여구성할 수있으며테이블이포함하는컬럼에대응한속성들을가지고있음 @Entity Entity annotation 선언 public class User implements Serializable { Serializable 인터페이스구현 private static final long serialversionuid = -8077677670915867738L; public User(){ argument 없는생성자선언 @Id Primary Key 선언 private String userid; private String username; public String getusername() { return username; public void setusername(string username) { this.username = username; - 50 -

4. ORM Hibernate 설명 (2/20) Entities(2/3) @Entity 해당클래스가 Entity 클래스임을표시하는것으로클래스선언문위에기재 테이블명과 Entity 명이다를때에는 name 에해당테이블명을기재 @Entity(name="USER_TB") public class User { @Id 해당 Attribute 가 Key 임을표시하는것으로 Attribute 위에기재 @Id private String userid; @Column 해당 Attribute 와매핑되는컬럼정보를입력하기위한것으로 Attribue 위에기재 컬럼명과 Attribute 명이일치할경우는기재하지않아도됨 @Column(name = "DEPT_NAME", length = 30) private String deptname; - 51 -

4. ORM Hibernate 설명 (3/20) Entities(3/3) @OneToOne, @OneToMany, @ManyToOne, @ManyToMany 테이블간관계를구성하기위한것으로정의되는 Attribute 위에기재 각각은 1:1,1:N,N:1,N;N 의관계를표현함. @ManyToMany private Set<Role> roles = new HashSet(0); @Transient 테이블의컬럼과매핑되지않고쓰이는 Attribute 를정의하고자할때 Attribute 위에기재 @Transient private String rolename; Entity Status New(transient) : 단순히 Entity 객체가초기화되어있는상태 Managed(persistent) : Entity Manager 에의해 Entity 가관리되는상태 Detached : Entity 객체가더이상 Persistance Context 와연관이없는상태 Removed : Managed 되어있는 Entity 객체가삭제된상태 - 52 -

4. ORM Hibernate 설명 (4/20) Entity Operation(1/3) 특정 DB 에데이터를입력, 수정, 조회, 삭제, 배치입력등의작업을수행하는오퍼레이션 입력 EntityManager 의 persist() 메소드를호출하여 DB 에단건의데이터추가 Department department = new Department(); String DepartmentId = "DEPT-0001"; em.persist(department); 수정 EntityManager 의 merge() 메소드호출 특정객체가 Persistent 상태이고, 동일한트랜잭션내에서해당객체의속성값에변경이발생한경우 merge() 메소드를직접 적으로호출하지않아도트랜잭션종료시점에변경여부가체크되어변경사항이 DB 에반영됨 // 2. update a Department information department.setdeptname("purchase Dept"); // 3. 명시적인메소드호출 em.merge(department); - 53 -

4. ORM Hibernate 설명 (5/20) Entity Operation(2/3) 조회 EntityManager 의 find() 메소드를호출하여 DB 에서원하는한건의데이터를조회할수있음 find() 메소드호출시대상이되는 Entity 의 Id 를입력인자로전달해야함 Department result = (Department) em.find(department.class, departmentid); 삭제 EntityManager 의 remove() 메소드사용 삭제할객체가동일한경우 remove() 메소드호출시대상이되는 Entity 를입력인자로전달하여삭제함 // 1. insert a new Department information Department department = adddepartment(); // 2. delete a Department information em.remove(department); 삭제할객체가동일한객체가아닐경우 getreference 메소드를호출하여 Entity 의 Id 에해당하는객체정보를추출하여그정 보를입력인자로해서 remove 를호출하여삭제함 Department department = new Department(); department.setdeptid = "DEPT_1"; // 2. delete a Department information em.remove(em.getreference(department.class, department.getdeptid())); - 54 -

4. ORM Hibernate 설명 (6/20) Entity Operation(3/3) 배치입력 EntityManager의 persist() 메소드를호출하여 DB에입력하고 loop를통해반복적으로수행 OutOfMemoryException 방지를위해서일정한 term을두고 flush(),clear() 을호출하여메모리에있는사항을삭제 public void testmultisave() throws Exception { for (int i = 0; i < 900 ; i++) { Department department = new Department(); String DeptId = "DEPT-000" + i; department.setdeptid(deptid); department.setdeptname("sale" + i); department.setdesc(" 판매부 " + i); em.persist(department); logger.debug("=== DEPT-000"+i+" ==="); // OutOfMemoryException 피하기위해서 if (i!= 0 && i % 9 == 0) { em.flush(); em.clear(); - 55 -

4. ORM Hibernate 설명 (7/20) Callback Methods(1/2) 엔티티 Operation 직전직후에비지니스로직체크등의로직을별도분리하여처리하도록지원함 Callback Methods 종류 PrePersist : Persist이전시점에수행 PostPersist : Persist이후시점에수행 PreRemove : Remove이전시점에수행 PostRemove : Remove이후시점에수행 PreUpdate : Merge이전시점에수행 PostUpdate : Merge이후시점에수행 PostLoad : Find 이후시점에수행 - 56 -

4. ORM Hibernate 설명 (8/20) Callback Methods(2/2) Callback Methods 정의방식 엔티티클래스에내부정의 EntityListener 를지정하여콜백함수정의 엔티티클래스에내부정의예제 @Entity public class User { @PrePersist @PreUpdate protected void validatecreate() throws Exception { if (getsalary() < 2000000 ) throw new Exception("Insufficient Salary!"); salary 가 2000000 이하로설정되어 Update 가실행될경우 Exception 이발생함 - 57 -

4. ORM Hibernate 설명 (9/20) Association Mapping(1/5) 두클래스사이의연관관계유형에따라매핑관계를선언함 One To One Mapping One To Many Mapping Many To Many Mapping One To One Mapping 예제 Employee 와 TravelProfile 가각각 OneToOne 이라는 Annotation 을기재하여매핑선언 @Entity public class Employee { @OneToOne private TravelProfile profile; @Entity public class TravelProfile { @OneToOne private Employee employee; - 58 -

4. ORM Hibernate 설명 (10/20) Association Mapping(2/5) One To Many Mapping Department:User = 1:N 의관계가있으며그관계에대해서 Department 클래스에서 OneToMany 로표시하고 User 클래스에 서 ManyToOne 으로표시하여관계를나타냈다. @Entity public class Department{ @OneToMany(targetEntity=User.class) private Set<User> users = new HashSet(0); @Entity public class User{ @ManyToOne private Department department; - 59 -

4. ORM Hibernate 설명 (11/20) Association Mapping(3/5) Collection Type Many관계에서 Collection Type은 Set 이외에도 List, Map를사용할수있음 Set 타입 : java.util.set 타입으로 <set> 을이용하여정의 List 타입 : java.util.list 타입으로 <list> 를이용하여정의 Map 타입 : java.util.map 타입으로 <map> 을이용하여 ( 키, 값 ) 을쌍으로정의 //Set 예제 @OneToMany(targetEntity=User.class) private Set<User> users = new HashSet(0); //List 예제 @OneToMany(targetEntity=User.class ) private List<User> users = new ArrayList(0); //Map 예제 @OneToMany(targetEntity=User.class) @MapKey(name="userId") private Map<String,User> users ; - 60 -

4. ORM Hibernate 설명 (12/20) Association Mapping(4/5) 단방향 / 양방향관계속성 1:N( 부모 : 자식 ) 관계지정에있어서자식쪽에서부모에대한참조관계를가지고있느냐없느냐에따라서참조관계가있으면양방향관계, 없으면단방향관계로정의 단방향 / 양방향예제 // 단방향예제 @Entity public class Department{ @OneToMany(targetEntity=User.class) private Set<User> users = new HashSet(0); @Entity public class User{ @Column(name="DEPT_ID") private String deptid; // 양방향예제 @Entity public class Department{ @OneToMany(targetEntity=User.class) private Set<User> users = new HashSet(0); @Entity public class User{ @ManyToOne private Department department; - 61 -

4. ORM Hibernate 설명 (13/20) Association Mapping(5/5) Many To Many Mapping Role:User = M:N 의관계가있다면그관계에대해서 Role 클래스에서 ManyToMany 로표시하고 User 클래스에서 ManyToMany 로표시하여관계를나타내면서 User 클래스에서관계를위한별도의테이블에대한정의를함 ROLE 과 USER 를연결하는관계테이블로 AUTHORITY 가사용되었음을선언 @Entity public class Role{ @ManyToMany(targetEntity=User.class) private Set<User> users = new HashSet(0); @Entity public class User{ @ManyToMany @JoinTable(name="AUTHORITY", joincolumns=@joincolumn(name="user_id"), inversejoincolumns=@joincolumn(name="role_id")) private Set<Role> roles = new HashSet(0); - 62 -

4. ORM Hibernate 설명 (14/20) Spring Integration(1/7) Spring 에서는 JPA 기반에서 DAO 클래스를쉽게구현할수있도록하기위해 JdbcTemplate, HibernateTemplate 등처럼 JpaTemplate 클래스를제공함 JPA 에서정의한 Entity Manager 의 Method 를직접이용하는방식도제공함 기본설정 persistence.xml 설정 (persisthsqlmemdb.xml 파일 ) <persistence-unit name="hsqlmunit" transaction-type="resource_local"> // 구현체는 Hibernate <provider>org.hibernate.ejb.hibernatepersistence</provider> // Entity Class List <class>egovframework.sample.model.bidirection.user</class> <class>egovframework.sample.model.bidirection.role</class> <class>egovframework.sample.model.bidirection.department</class> <exclude-unlisted-classes/> <properties> // DBMS 별다른설정여기는 HSQL 설정. <property name="hibernate.dialect" value="org.hibernate.dialect.hsqldialect"/> <property name="hibernate.show_sql" value="true"/> <property name="hibernate.format_sql" value="true"/> <property name="hibernate.hbm2ddl.auto" value="create-drop"/> </properties> </persistence-unit> - 63 -

4. ORM Hibernate 설명 (15/20) Spring Integration(2/7) 기본설정 Application Context 설정 (1/2) // 1.Transation Manager 설정 <bean id="transactionmanager" class="org.springframework.orm.jpa.jpatransactionmanager"> <property name="entitymanagerfactory" ref="entitymanagerfactory" /> </bean> // 2.Entity Manager Factory 설정 <bean id="entitymanagerfactory" class="org.springframework.orm.jpa.localcontainerentitymanagerfactorybean"> <property name="persistenceunitname" value="hsqlmunit" /> <property name="persistencexmllocation" value="classpath:meta-inf/persisthsqlmemdb.xml" /> <property name="datasource" ref="datasource" /> </bean> // 3.DataSource 설정 <bean id="datasource" class="org.apache.commons.dbcp.basicdatasource" destroy-method="close"> <property name="driverclassname" value="net.sf.log4jdbc.driverspy" /> <property name="url" value="jdbc:log4jdbc:hsqldb:mem:testdb" /> <property name="username" value="sa" /> <property name="password" value="" /> <property name="defaultautocommit" value="false" /> </bean> - 64 -

4. ORM Hibernate 설명 (16/20) Spring Integration(3/7) 기본설정 Application Context 설정 (2/2) // 4.JPA Annotation 사용설정 <bean class="org.springframework.orm.jpa.support.persistenceannotationbeanpostprocessor" /> // 5.Annotation 사용설정 <context:component-scan base-package="egovframework" /> // 6.Annotation 기반의 Transaction 활성화설정 <tx:annotation-driven /> - 65 -

4. ORM Hibernate 설명 (17/20) Spring Integration(4/7) JpaTemplate 이용 (2/2) Spring 에서정의한 JpaDaoSupport 를상속받아 getjpatemplate() 를통해서 Entity Method 등을호출작업할수있음 public class UserDAO extends JpaDaoSupport { // Application Context 에서설정한 Entity Manager Factory 명을지정하여부모의 EntityManagerFactory 를설정한다. @Resource(name="entityManagerFactory") public void setemf(entitymanagerfactory entitymanagerfactory) { super.setentitymanagerfactory(entitymanagerfactory); // gettemplate() 에의한입력 public void createuser(user user) throws Exception { this.getjpatemplate().persist(user); // gettemplate() 에의한조회 public User finduser(string userid) throws Exception { return (User) this.getjpatemplate().find(user.class, userid); // gettemplate() 에의한삭제 public void removeuser(user user) throws Exception { this.getjpatemplate().remove(this.getjpatemplate().getreference(user.class, user.getuserid())); - 66 -

4. ORM Hibernate 설명 (18/20) Spring Integration(5/7) JpaTemplate 이용 (2/2) Entity 클래스 @Entity public class User implements Serializable { private static final long serialversionuid = -8077677670915867738L; @Id @Column(name = "USER_ID", length=10) private String userid; @Column(name = "USER_NAME", length=20) private String username; @Column(length=20) private String password;... - 67 -

4. ORM Hibernate 설명 (19/20) Spring Integration(6/7) Plain JPA 이용 (1/2) JPA 에서정의한 Entity Manager 의 Entity Method 를호출작업할수있음 Entity Manager 를통해작업함으로써 Spring 환경하에서 Spring 에대한의존성을최소화할수있음 public class RoleDAO { // Application Context 설정의 4.JPA Annotation 사용설정에의해서정의가능한것으로 Annotation 기반으로 Entity Manager 를지정한다. @PersistenceContext private EntityManager em; // EntityManager 를통한입력 public void createrole(role role) throws Exception { em.persist(role); // EntityManager 를통한조회 public Role findrole(string roleid) throws Exception { return (Role) em.find(role.class, roleid); // EntityManager 를통한삭제 public void removerole(role role) throws Exception { em.remove(em.getreference(role.class, role.getroleid())); // EntityManager 를통한수정 public void updaterole(role role) throws Exception { em.merge(role); - 68 -

4. ORM Hibernate 설명 (20/20) Spring Integration(7/7) Plain JPA 이용 (2/2) Entity 클래스 @Entity public class Role implements Serializable { private static final long serialversionuid = 1042037005623082102L; @Id @Column(name = "ROLE_ID", length=10) private String roleid; @Column(name = "ROLE_NAME", length=20) private String rolename; @Column(name = "DESC", length=50) private String desc;... - 69 -

4. ORM - 참고자료 Hibernate 공식사이트 www.hibernate.org Spring JPA http://static.springframework.org/spring/docs/2.5.x/reference/orm.html#orm-jpa - 70 -

5. Transaction 개요 서비스개요 트랜잭션서비스는 Spring 트랜잭션서비스를채택하여가이드한다. 트랜잭션서비스에는여러가지가있지만여기서는 DataSource Transaction Service, JTA Transaction Service, JPA Transaction Service에대해서설명하고트랜잭션활용에대해서는설정및 Annotation을통해활용할수있는 Declaration Transaction Management와프로그램에서직접 API를호출하여쓸수있도록하는 Programmatic Transaction Management 두가지에대해서설명한다. - 71 -

5. Transaction 설명 (1/12) Declarative Transaction Management 코드에서직접적으로 Transaction 처리하지않고, 선언적으로 Transaction을관리할수있다. Annotation을이용한 Transaction 관리, XML 정의를이용한 Transaction 관리를지원한다. Configuration <tx:annotation-driven transaction-manager="transactionmanager" /> transactionmanager 선언 Sample Source @Transactional public void removerole(role role) throws Exception { this.roledao.removerole(role); 트랙잭션처리하고자하는메소드위에기재하여트랜잭션관리 - 72 -

5. Transaction 설명 (2/12) Configuration Transaction Management XML 정의설정을이용해서 Transaction 을관리할수있다. Configuration <aop:config> <aop:pointcut id="requiredtx" expression="execution(* egovframework.sample..impl.*impl.*(..))" /> <aop:advisor advice-ref="txadvice" pointcut-ref="requiredtx" /> </aop:config> <tx:advice id="txadvice" transaction-manager="transactionmanager"> <tx:attributes> <tx:method name="find*" read-only="true" /> <tx:method name="createnorbrole" no-rollback-for="norolebacktx" /> <tx:method name="createrbrole" rollback-for="rolebacktx" /> <tx:method name="create*" /> </tx:attributes> </tx:advice> aop:pointcut 를이용하여실행되어 Catch 해야하는 Method 를지정하고 tx:advice 를통해서각각에대한룰을정의하고있다. 이렇게정의하면프로그램내에서는별도의트랜잭션관련한사항에대해기술하지않아도트랜잭션관리가된다. - 73 -

5. Transaction 설명 (3/12) <tx:method> 상세속성정보 속성설명사용예 name 메소드명기술. 와일드카드사용가능함 Name= find* isolation Transaction 의 isolation Level 정의하는요소 Isolation= DEFAULT no-rollback-for 정의된 Exception 목록에대해서는 rollback을수행하지않음 No-rollbackfor= NoRolBackTx propagation Transaction 의 propagation 유형을정의하기위한요소 propagation= REQUIRED read-only 해당 Transaction 을읽기전용모드로처리 (Default=false) read-only= true rollback-for 정의된 Exception 목록에대해서는 rollback 수행 rollback-for=rolebacktx timeout 지정한시간내에해당메소드수행이완료되지않은경우 rollback 수행. timeout= 10-74 -

5. Transaction 설명 (4/12) Propagation Behavior,Isolation Level( 두가지 Transaction Management 공통적으로사용되는항목 ) Propagation Behavior Isolation Level - 75 -

5. Transaction 설명 (5/12) Programmatic Transaction Management 프로그램에서직접트랜잭션을관리하고자할때사용할수있는방법에대해서설명하고자한다. TransactionTemplate 를사용하는방법과 TransactionManager 를사용하는방법두가지가있다. TransactionTemplate Configuration <bean id="transactiontemplate" class="org.springframework.transaction.support.transactiontemplate"> <property name="transactionmanager" ref="transactionmanager" /> </bean> <bean id="transactionmanager" class="org.springframework.jdbc.datasource.datasourcetransactionmanager"> <property name="datasource" ref="datasource" /> </bean> TransactionTemplate 를정의하고 property 로 transactionmanager 을정의한다. - 76 -

5. Transaction 설명 (6/12) TransactionTemplate 를이용한 Sample Source @Test public void testinsertcommit() throws Exception { transactiontemplate.execute(new TransactionCallbackWithoutResult() { public void dointransactionwithoutresult(transactionstatus status) { try { Role role = new Role(); role.setroleid("role-001"); role.setrolename("role-001"); role.setroledesc(new Integer(1000)); roleservice.createrole(role); catch (Exception e) { status.setrollbackonly(); ); Role retrole = roleservice.findrole("role-001"); assertequals("rolename Compare OK",retRole.getRoleName(),"ROLE-001"); transactiontemplate.execute 에 TransactionCallbackWithoutResult 를정의하여 Transaction 관리를하는것을확인할수있다. - 77 -

5. Transaction 설명 (7/12) Transaction Manager Configuration <bean id="transactionmanager" class="org.springframework.jdbc.datasource.datasourcetransactionmanager"> <property name="datasource" ref="datasource" /> </bean> - 78 -

5. Transaction 설명 (8/12) Transaction Manager 를이용한 Sample Source @Test public void testinsertrollback() throws Exception { int prevcommitcount = roleservice.getcommitcount(); int prevrollbackcount = roleservice.getrollbackcount(); DefaultTransactionDefinition txdefinition = new DefaultTransactionDefinition(); txdefinition.setpropagationbehavior(transactiondefinition.propagation_required); TransactionStatus txstatus = transactionmanager.gettransaction(txdefinition); try { Role role = new Role(); role.setroleid(thread.currentthread().getname() + "-roleid"); role.setrolename(thread.currentthread().getname() + "-rolename"); role.setroledesc(new Integer(1000)); roleservice.createrole(role); roleservice.createrole(role); transactionmanager.commit(txstatus); catch (Exception e) { transactionmanager.rollback(txstatus); finally { assertequals(prevcommitcount, roleservice.getcommitcount()); assertequals(prevrollbackcount + 2, roleservice.getrollbackcount()); Transaction 서비스를직접얻어온후에위와같이 try~catch 구문내에서 Transaction 서비스를이용하여, 적절히 begin, commit, rollback 을수행한다. 이때, TransactionDefinition 와 TransactionStatus 객체를적절히이용하면된다. - 79 -

5. Transaction 설명 (9/12) Transaction Service DataSource Transaction Service DataSource 를사용하여 Local Transaction 을관리할수있다. Configuration <bean id="transactionmanager" class="org.springframework.jdbc.datasource.datasourcetransactionmanager"> <property name="datasource" ref="datasource" /> </bean> Jdbc driver <bean id="datasource" class="org.apache.commons.dbcp.basicdatasource" destroy-method="close"> <property name="driverclassname" value="com.mysql.jdbc.driver" /> <property name="url" value="dbc:mysql://db2:1621/rte" /> database url <property name="username" value="rte" /> <property name="password" value="xxx" /> <property name="defaultautocommit" value="false" /> </bean> 사용자명자동commit 설정 암호 - 80 -

5. Transaction 설명 (10/12) Sample Source @Resource(name="transactionManager") PlatformTransactionManager transactionmanager;... TransactionStatus txstatus = transactionmanager.gettransaction(txdefinition); - 81 -

5. Transaction 설명 (11/12) JTA Transaction Service JTA 를이용하여 Global Transation 관리를할수있도록지원한다. Configuration <tx:jta-transaction-manager /> <jee:jndi-lookup id="datasource" jndi-name="dbmsxads" resource-ref="true"> <jee:environment> java.naming.factory.initial=weblogic.jndi.wlinitialcontextfactory java.naming.provider.url=t3://was:7002 </jee:environment> </jee:jndi-lookup> 위의설정예에서 jndi-name 과 java.naming.factory.initial,java.naming.provider.url 은사이트환경에맞추어변경해야한다. DataSource Transaction Service 와는달리 transationmanager 에대해서따로 bean 정의하지않아도된다. - 82 -

5. Transaction 설명 (12/12) JPA Transaction Service JPA Transaction 서비스는 JPA EntityManagerFactory를이용하여트랜잭션을관리한다. JpaTransactionManager는 EntityManagerFactory에의존성을가지고있으므로반드시 EntityManagerFactory 설정과함께정의되어야한다. 아래에서예를들어서설정방법을설명한다. 사용법은 DataSource Transaction Service와동일하다. Configuration <bean id="transactionmanager" class="org.springframework.orm.jpa.jpatransactionmanager"> <property name="entitymanagerfactory" ref="entitymanagerfactory" /> </bean> <bean id="entitymanagerfactory" class="org.springframework.orm.jpa.localcontainerentitymanagerfactorybean"> <property name="persistenceunitname" value="oraunit" /> <property name="persistencexmllocation" value="classpath:meta-inf/persistence.xml" /> <property name="datasource" ref="datasource" /> </bean> <bean id="datasource" class="org.apache.commons.dbcp.basicdatasource" destroy-method="close"> <property name="driverclassname" value="com.mysql.jdbc.driver" /> <property name="url" value="dbc:mysql://db2:1621/rte" /> <property name="username" value="rte" /> <property name="password" value="xxx" /> <property name="defaultautocommit" value="false" /> </bean> 위의설정을보면 transactionmanager 의 property 로 entiymanagerfactory 로지정하고 entitymanagerfactory 의 property 로 datasource 를지정하고그에필요한 driver 정보,Url 정보등을지정한것을확인할수있다. 설정한 datasource 기반하에서트랜잭션서비스를제공한다. 사이트환경에맞추어 driverclassname,url,username,password 는변경해서적용한다. 또한 persistenceunitname 과 persistencexmllocation 정보를지정하는것을알수있다 - 83 -

5. Transaction 참고자료 Spring Transaction Management http://static.springframework.org/spring/docs/2.5.x/reference/ - 84 -