Real Alternative DBMS ALTIBASE, Since 1999 Spring 연동가이드 2010. 08 Copyright c 2000~2013 ALTBASE Corporation. All Rights Reserved.
Document Control Change Record Date Author Change Reference 2010-08 snkim Created Reviews Date Name (Position) Distribution Name Location Spring 연동가이드 2 page of 31
목차 개요... 4 SPRING 이란?... 5 Spring 의특징... 5 개발전설정사항... 6 Spring Framework 환경구축... 6 ALTIBASE JDBC Driver 얻는방법... 6 SETTING UP JDBC DRIVER... 8 프로젝트에설정하는방법 (Eclipse)... 8 web application 에설정하는방법... 9 DATASOURCE 설정... 10 DriverManagerDataSource 이용... 10 DBCP 를이용... 11 ALTIBASE 의 ConnectionPool 을이용... 13 ADDITIONAL CONNECTION... 15 FailOver 를이용한 Connection... 15 ALTIBASE5 와이전버전을동시에 Connection... 16 트랜잭션관리... 19 DataSourceTransactionManager 설정... 19 TransactionProxyFactoryBean 을이용한선언적트랜잭션처리... 20 분산트랜잭션처리... 21 SPRING 연동시주의사항... 24 LOB 데이터처리... 24 부록... 25 HelloSpring 구현... 25 Spring 연동가이드 3 page of 31
개요 본문서는 Spring에서 ALTIBASE와연동하는방법에대해기술한다. Spring Framework 2.5.6, ALTIBASE는 5.3.3, 개발 IDE로는 Eclipse를사용하고, 문서이외에각 chapter 별로예제가제공되므로해당예제를참고하면된다. 본문서와더불어개발시참고해야할문서들은다음과같다. 1. ALTIBASE 개발가이드 2. JAVA 개발가이드 3. ALTIBASE_JBOSS 연동가이드 4. ALTIBASE_TOMCAT 연동가이드 5. ALTIBASE_WEBSPERE 연동가이드 6. ALTIBASE_WEBLOGIC 연동가이드 7. ALTIBASE_iBATIS 연동가이드 8. ALTIBASE_HIBERNATE 연동가이드 Spring 연동가이드 4 page of 31
Spring 이란? Spring Framework은 Enterprise Application에서필요로하는기능들을제공하는오픈소스프레임워크이다. EJB 컨테이너에비해 lightweight한컨테이너로서 POJO(Plain Old Java Object: 기존의일반자바객체 ) 의생성, 소멸등라이프사이클을관리해주며트랜잭션관리, 로깅, 보안등과같은모듈을제공한다. Spring 의특징 Spring 은다음과같은특징이있다. 1. J2EE 에비해 lightweight 한컨테이너이다. 2. 자바객체의생성소멸과같은라이프사이클을관리하며, 프로그램에서는객체를생성할필요없이, Spring 으로부터필요한객체를가져와사용할수있다. 3. IoC(Inversion of Control) 와 DI(Dependency Injection) 을지원한다. 즉, bean 설정파일을통해객체들의의존관계를설정할수있다.. 4. AOP(Aspect Oriented Programming) 를지원하므로여러모듈에서공통으로사용되지만, 실제모듈의핵심은아닌기능 ( 예 ) 트랜잭션이나, 로깅, 보안과같은기능 ) 을분리하여각모듈에적용할수있다. 5. EJB 처럼특정인터페이스를구현하거나특정클래스를상속받지않은일반자바객체인 POJO 를지원하다. 따라서기존에작성한소스들을수정하지않고 Spring 에서사용이가능하다. 6. 트랜잭션처리를위한일관된방법을제공한다. 7. 다양한 API 를제공한다. Spring 연동가이드 5 page of 31
개발전설정사항 Spring Framework 를사용하기위해서는 Spring 관련 jar 파일이필요하다. 또한 ALTIBASE 와연동하기위해서는 ALTIABSE JDBC Driver 가필요하다. 본장에서는 Spring 환경을구축하는방법과 ALTIBASE JDBC Diver 를얻는방법에대해설명한다. Spring Framework 환경구축 Spring Framework 환경을구축하기위해서는관련 jar 파일이필요하다. 이 jar 파일들은다음사이트에서다운로드받을수있다. http://www.springsource.org/download Spring Framework 중 2.5.6 버전을다운로드받은후압축을풀면다음디렉토리안에관련된 jar 파일들이존재한다. 이 jar 파일들을각각의프로젝트추가하여 Spring 환경을구축하면된다. spring-framework-2.5.6\dist spring-framework-2.5.6\dist\modules spring-framework-2.5.6\lib 본문서의예제들을실행하기위해서는다음의 jar 파일이필요하다. jar 파일 spring.jar spring-jdbc.jar common-logging.jar common_dbcp.jar common-poos.jar cglib-nodep-2.1_3.jar 위치 spring-framework-2.5.6\dist spring-framework-2.5.6\dist\modules spring-framework-2.5.6\lib\jakarta-commons spring-framework-2.5.6\lib\jakarta-commons spring-framework-2.5.6\lib\jakarta-commons spring-framework-2.5.6\lib\cglib 각예제에서는위의 jar 파일이외에추가되어야하는파일들이있을수있는데해당 jar 파일은각 chapter 에기술된내용을참조하면된다. ALTIBASE JDBC Driver 얻는방법 ALTIBASE 에서제공하는 JDBC driver 는 Altibase.jar 파일이다. 이파일은 ALTIBASE 가설치되어있는서버의 $ALTIBASE_HOME/lib 디렉토리안에존재한다. Spring 연동가이드 6 page of 31
ALTIBASE 5 버전부터는 $ALTIBASE_HOME/lib 디렉토리에 Altibase.jar 파일과 Altibase5.jar 파일이존재하는데, Altibase.jar 는일반 JDBC Driver 파일이고, Altibase5.jar 는 ALTIBASE 5 버전과그이하의버전을함께연동하고싶을때사용하는 JDBC Driver 파일이다. 따라서하나의 ALTIBASE DB 와연동하거나, 또는버전이동일한여러대의 ALTIBASE 와연동할경우에는 $ALTIBASE_HOME/lib/Altibase.jar 파일을사용하면된다. 연동하려는 ALTIBASE DB Server 와 ALTIBASE JDBC Driver 가호환가능한지확인을위해 ALTIBASE JDBC Driver 버전확인이필요하다. ALTIBASE JDBC Driver 버전을확인하는방법은다음의명령어를수행하면된다. $ java jar Altibase.jar JDBC Driver Info : Altibase Ver = 5.3.3.13 for JavaVM v1.4, CMP:5.6.1, $Revision: 14502 $ Jan 13 2010 14:35:28 이때, ALTIBASE DB Server 의 cm protocol version 과 ALTIBASE JDBC Driver 의 CMP 가동일하면호환가능하다. $ altibase -v version 5.3.3.13 XEON_LINUX_redhat_Enterprise_AS4-64bit-5.3.3.13-release- GCC3.4.6 (xeon-redhat-linux-gnu) Jan 13 2010 14:35:30, binary db version 5.4.1, meta version 5.6.1, cm protocol version 5.6.1, replication protocol version 5.4.1 버전이 UP 되면서 JDBC 관련버그가 fix 되었을가능성이있으므로, 일반적으로 ALTIBASE DB Server 의버전과같거나이보다더최신의 ALTIBASE JDBC Driver 파일을사용하는것을권장한다. Spring 연동가이드 7 page of 31
Setting up JDBC Driver ALTIBASE JDBC Driver 를 setting 하는방법에대해설명한다. 프로젝트에설정하는방법 (Eclipse) Eclipse 에서해당프로젝트에 ALTIBASE JDBC Driver 를추가하는방법은다음과같다. 프로젝트 JRE System Library [J2SE-1.5] - Properties Installed JREs 항목중 jre 를클릭 Edit Add External JARs 를클릭하여 ALTIBASE JDBC Driver 인 Altibase.jar 를추가한다. Spring 연동가이드 8 page of 31
web application 에설정하는방법 만약웹어플리케이션을구현할경우에는 ALTIBASE JDBC Driver 를두가지방법으로설정할수있는데, 첫번째방법은각웹서버의적절한디렉토리에 Altibase.jar 파일을위치시켜, 모든웹어플리케이션에서전역적으로 ALTIBASE JDBC Driver 를사용할수있는방법이고 ( 웹서버별연동가이드문서를참고한다.), 다른방법은웹어플리케이션별로 ALTIBASE JDBC Driver 를설정하여해당웹어플리케이션에서만 ALTIBASE JDBC Driver 를사용하는것이다. 만약웹어플리케이션에 ALTIBASE JDBC Driver 를설정한다면다음의위치에 Altibase.jar 를위치시키면된다. Web_application\WEB-INF\lib 만약, Eclipse 에서 Web Project 로프로젝트를생성하였다면다음의디렉토리에 Altibase.jar 를위치시킨다. 프로젝트 \WebContent\WEB-INF\lib Spring 연동가이드 9 page of 31
DataSource 설정 Spring 에서 DB 와연동하기위해서는 bean 설정파일에 DataSource 관련 bean 을설정해야한다. ( 본문서에서 bean 설정파일의이름은 applicationcontext.xml 으로정의하였다.) DataSource 를설정하는방법중에서 Spring Framework 에서제공하는 DriverManagerDataSource 를이용하는방법, Jakarta 에서제공하는 DBCP 를이용하는방법, DB 벤더에서제공하는 ConnectionPool 을이용하는방법등이있다. 본장에서는이방법들을이용하여 ATLIBASE 와연동하는방법에대해설명한다. DriverManagerDataSource 이용 Spring Framework 에서제공하는 DriverManagerDataSource 클래스를이용하여 DB 와연동할경우에는 bean 설정파일에서 datasource bean 을설정할때 class 속성값을 org.springframework.jdbc.datasource.drivermanagerdatasource 로지정하면된다. 이때 datasource bean 에 DB 와연동하기위한여러가지 property 들을정의할수있는데, 다음과같은 Property 들을 ALTIBASE 에맞게정의하면된다. Property driverclassname url username password 설명 ALTIBASE JDBC driver class Name ALTIBASE 와연결을위한 Connection string 정보 jdbc:altibase://ip:port_no/db_name 형태로기입 데이터베이스계정 데이터베이스패스워드 다음은예제로제공되는 DataManagerDataSourceConnection 의 acpplicationcontext.xml 파일의일부이다. 예 ) DataManagerDataSourceConnection 의 applicationcontext.xml 파일 <bean id="datasource" class="org.springframework.jdbc.datasource.drivermanagerdatasource"> <!-- JDBC Driver 클래스명설정 --> <property name="driverclassname" value="altibase.jdbc.driver.altibasedriver"/> <!-- connection url--> <property name="url" value="jdbc:altibase://192.168.1.35:21129/mydb"/> <!-- DB 사용자계정설정 --> <property name="username" value="sys"/> <!-- DB 사용자패스워드설정 --> <property name="password" value="manager" /> Spring 연동가이드 10 page of 31
예제에포함된 DataManagerDataSourceConnection 프로젝트를실행하기위해서는 Altibase.jar, spring.jar, spring-jdbc.jar, common-loggings.jar 파일이필요하므로해당 jar 파일을추가해주어야한다. DBCP 를이용 Spring 에서 Jakarta 에서제공하는 DBCP(Jakarta Commons Database Connection Pool) API 를이용하여 ConnectionPool 기반의 DataSource 를설정할수있다. 이때사용하는 DataSource 클래스는 org.apache.commons.dbcp.basicdatasource 이다. 설정하는방법은위에서설명한 DriverManagerDataSource 클래스를이용하는것처럼 applicationcontext.xml 파일에 BasicDataSource 클래스를사용하여 datasource bean 을작성하면된다. 예 ) DBCPConnection 의 applicationcontext.xml 파일 <bean id="datasource" class="org.apache.commons.dbcp.basicdatasource"> <!-- JDBC Driver 클래스명설정 --> <property name="driverclassname" value="altibase.jdbc.driver.altibasedriver"/> <!-- connection url--> <property name="url" value="jdbc:altibase://192.168.1.35:21129/mydb"/> <!-- DB 사용자계정설정 --> <property name="username" value="sys"/> <!-- DB 사용자패스워드설정 --> <property name="password" value="manager" /> BasicDataSource 클래스는 ConnectionPool 을관리하기위해다양한 Property 들을제공한다. Spring 연동가이드 11 page of 31
Property driverclassname url username password 설명 ALTIBASE JDBC driver class Name ALTIBASE 와연결을위한 Connection string 정보 jdbc:altibase://ip:port_no/db_name 형태로기입 데이터베이스계정 데이터베이스패스워드 maxactive 최대 Connection 수, 0 은무제한. default 는 8 initialsize 초기 Connection 수. default 는 0 maxidle Pool 에 idle 하게유지하는최대연결수. default 는 8 maxwait validationquery defaultautocommit defaulttransactionisolation 최대연결시도시간 ( 단위 : millisec) -1 은무한대기 Default 는무한대기 연결의 validation 을체크하기위해사용하는 SQL 문반드시최소한 1 개이상의 row 가 return 되는 select 문으로지정 ex) select 1 from dual autocommit 모드를설정. default 는 true Transaction Isolation level 을설정 NONE, REPEATABLE_READ, SERIALIZABLE 의값을설정할수있고, default 는 DB 서버의 default 값을따른다. ALTIBASE 의 isolation level 은 default 로 READ COMMITTED 이다. 예제에포함된 DBCPConnection 프로젝트를실행하기위해서는 Altibase.jar, spring.jar, spring-jdbc.jar, common-logging.jar, common-dbcp.jar, common-pools.jar 파일이필요하다. Spring 연동가이드 12 page of 31
ALTIBASE 의 ConnectionPool 을이용 ALTIBASE 에서제공하는 ABConnectionPoolDataSource 클래스를사용하면 ALTIBASE 의 ConnectionPool 을이용할수있다. 위에서설명한다른 DataSource 처럼 applicationcontext.xml 에 ABConnectionPoolDataSource 클래스를이용하여 datasource bean 을정의하면된다. 예 ) AltibaseConnectionPool 의 applicationcontext.xml 파일 <bean id="datasource" class="altibase.jdbc.driver.abconnectionpooldatasource"> <!-- connection url--> <property name="url" value="jdbc:altibase://192.168.1.35:21129/mydb"/> <!-- DB 사용자계정설정 --> <property name="user" value="sys"/> <!-- DB 사용자패스워드설정 --> <property name="password" value="manager" /> ABConnectionPoolDataSource 을이용할경우 ABConnectionPoolDataSource 내부에서자동으로 ALTIBASE JDBC Driver class 를로딩하므로 driverclassname property 를지정할필요가없다. 또한 DB 사용자계정을나타내는 property 가 username 이아니고 user 임을주의해야한다. ABConnectionPoolDataSource 클래스는 ConnectionPool 을관리하기위해다양한 property 들을제공한다. Property 설명 url user password ALTIBASE 와연결을위한 Connection string 정보 jdbc:altibase://ip:port_no/db_name 형태로기입 데이터베이스계정 데이터베이스패스워드 maxpoolsize 최대 Connection 수. 기본값 10. minpoolsize 최소 Connection 수. 기본값 0. initialpoolsize 초기 Connection 수. 기본값 1. maxidletime propertycycle idle 대기시간 ConnectionPool 이다찼을때대기시간 (millisec) 예제에포함된 AltibaseConnectionPool 프로젝트를실행하기위해서는 Altibase.jar, spring.jar, spring-jdbc.jar, common-logging.jar 파일이필요하다. Spring 연동가이드 13 page of 31
Spring 연동가이드 14 page of 31
Additional Connection ALTIBASE 에서제공하는 FailOver 와 Multi-version ALTIBASE 연동하는방법에대해설명한다. FailOver 를이용한 Connection ALTIBASE 5.3.3 부터 FailOver 를지원하는데, FailOver 를사용하기위해서는 Connection url 부분에 FailOver 관련속성을넣어주면된다. 다음은 FailOver 를이용하여 ALTIBASE 에연결하는예제이다. DataSource 는위에서기술한방법중 DBCP 를이용하였다. 예 ) FailOverConnection 의 applicationcontext.xml 파일 <bean id="datasource" class="org.apache.commons.dbcp.basicdatasource"> <!-- JDBC Driver 클래스명설정 --> <property name="driverclassname" value="altibase.jdbc.driver.altibasedriver"/> <!-- connection url--> <property name="url" value="jdbc:altibase://127.0.0.1:20300/mydb?alternateservers=(192.168.1.35:21129) &ConnectionRetryCount=1&ConnectionRetryDelay=1&SessionFailOver=on &LoadBalance=off /> <!-- DB 사용자계정설정 --> <property name="username" value="sys"/> <!-- DB 사용자패스워드설정 --> <property name="password" value="manager" /> Connection url 부분에정의할수있는 FailOver 관련 property 는다음과같다. Property AlternateServer ConnectionRetryCount ConnectionRetryDelay LoadBalance SessionFailOver 설명 장애발생시접속하게될가용서버를나타내며 (IP Address1:Port1, IP Address2:Port2,...) 형식으로기술한다. 가용서버접속실패시, 접속시도반복횟수 가용서버접속실패시, 다시접속을시도하기전에대기하는시간 ( 초단위 ) on 으로설정하면최초접속시도시에기본서버와가용서버를포함하여랜덤으로선택한다. off 로설정하면최초접속시도시에기본서버에접속하고, 접속에실패하면 AlternateServer 로기술한서버에접속한다. STF(Service Time Fail-Over) 를할것인지여부를 Spring 연동가이드 15 page of 31
Property 나타낸다. on : STF, off : CTF 설명 CTF(Connection Time Fail-Over) 는 DBMS 접속시점에장애를인식하여장애가발생한 DBMS 대신다른가용 STF(Service Time Fail-Over) 는 DBMS 접속에성공하여노드의 DBMS 로접속하고서비스를진행한다. 서비스하는도중에장애가발생하는것으로, 다른가용노드의 DBMS 에다시접속하여세션의프로퍼티를복구한후사용자응용프로그램의업무로직을다시수행하도록하는것을의미한다. 즉장애가발생한 DBMS 에서수행된작업을다시한번수행할필요가있는경우이다. FailOver 는첨부된예제중 FailOverConnection 프로젝트를참조하면된다. FailOverConnection 프로젝트를실행하기위해서는 Altibase.jar, spring.jar, springjdbc.jar, common-logging.jar 파일이필요하다. ALTIBASE5 와이전버전을동시에 Connection ALTIBASE 5 부터는하나의어플리케이션에서 ALTIBASE 5 와 ALTIBASE 4 혹은 ALTIBASE 3 와동시에연결할수있도록 ALTIBASE 5 버전전용의 JDBC Driver(Altibase5.jar) 를제공한다. 이 Driver 를이용하면 ALTIBASE 5 ALTIBASE 4, 혹은 ALTIBASE 5 ALTIBASE 3, ALTIBASE 5.1.5 ALTIBASE 5.3.3 간두버전의 ALTIBASE 에접속이가능하다. 기존의 Altibase.jar 와구별하기위해별도로 ALTIBASE 5 전용의 Altibase5.jar 가필요하다. 또한 applicationcontext.xml 의 datasource 에지정해주는 JDBC Driver 클래스이름도기존의 Altibase.jdbc.driver.AltibaseDriver 대신 ALTIBASE 5 전용의 Altibase5.jdbc.driver.AltibaseDriver 를지정해야한다. 이때주의할점은프로그램에서 Altibase5.jdbc.driver.AltibaseDriver 를먼저로딩한후에 Altibase.jdbc.driver.AltibaseDriver 를로딩해야한다. 다음은 Altibase.jar 와 Altibase5.jar 파일을이용하여두버전의 ALTIBASE 의드라이버를로딩하는예제이다. 예 ) MultiVersionConnection 의 applicationcontext.xml 파일 <! ALTIBASE 5 버전에대한 DataSource 설정 --> <bean id="datasource1" class="org.springframework.jdbc.datasource.drivermanagerdatasource"> <!-- JDBC Driver 클래스명설정 --> <property name="driverclassname" value="altibase5.jdbc.driver.altibasedriver"/> <!-- connection url--> <property name="url" value="jdbc:altibase://127.0.0.1:20300/mydb"/> <!-- DB 사용자계정설정 --> <property name="username" value="sys"/> <!-- DB 사용자패스워드설정 --> <property name="password" value="manager" /> Spring 연동가이드 16 page of 31
<! ALTIBASE 5 이전버전에대한 DataSource 설정 --> <bean id="datasource2" class="org.springframework.jdbc.datasource.drivermanagerdatasource"> <!-- JDBC Driver 클래스명설정 --> <property name="driverclassname" value="altibase.jdbc.driver.altibasedriver"/> <!-- connection url--> <property name="url" value="jdbc:altibase://192.168.1.35:21129/mydb"/> <!-- DB 사용자계정설정 --> <property name="username" value="sys"/> <!-- DB 사용자패스워드설정 --> <property name="password" value="manager" /> <!-- DAO 클래스의 bean 설정 --> <bean id="accountdao1" class="com.altibase.banking.accountdao"> <property name="datasource" ref="datasource1"/> <!-- DAO 클래스의 bean 설정 --> <bean id="accountdao2" class="com.altibase.banking.accountdao"> <property name="datasource" ref="datasource2"/> MultiVersionConnection 의 AccountApp.java 파일 Resource resource = new ClassPathResource("applicationContext.xml"); BeanFactory factory = new XmlBeanFactory(resource); AccountDao accountdao1 = (AccountDao)factory.getBean("accountDao1"); AccountDao accountdao2 = (AccountDao)factory.getBean("accountDao2"); 위의 AccountApp.java 예제를보면 Altibase5.jdbc.driver.AltibaseDriver 를 Altibase.jdbc.driver.AltibaseDriver 보다먼저로딩하기위해 Altibase5.jdbc.driver.AltibaseDriver 를 driverclassname 로사용하는 accountdao1 을먼저로딩하고있다. 예제에포함된 MultiVersionConnection 프로젝트를실행하기위해서는기존에사용했던 jar 파일뿐만아니라, Altibase.jar 와 Altibase5.jar 파일이필요하다. 이파일들은 ALTIBASE 가설치된디렉토리 ($ALTIBASE_HOME) 의 lib 디렉토리안에존재하는데 ALTIBASE 5 버전의 Altibase5.jar 파일, 그이전버전의 Altibase.jar 파일을사용하면된다. Spring 연동가이드 17 page of 31
Spring 연동가이드 18 page of 31
트랜잭션관리 Spring Framework 를이용하면다양한방법으로트랜잭션을처리할수있다. 먼저, 트랜잭션관리자 (TransactionManager) 를 bean 설정파일에지정해주고, 트랜잭션처리를해주면된다. 트랜잭션처리는필요에따라소스코드내에서직접프로그램을구현할수있고, 또다른방법으로 bean 설정파일에서선언적으로처리할수있다.. Spring Framework 는데이터베이스연동기술에따라여러 PlatformTransactionManager 인터페이스의구현클래스를제공하는데이클래스들을 TransactionManager 로지정하면된다. 예를들어, 로컬트랜잭션을처리하기위해서 DataSourceTransactionManager 클래스를 TransactionManager 로지정하고, 분산트랜잭션을처리하기위해서는 JtaTransactionManager 클래스를 TransactionManager 로지정하면된다. TransactionManager 를지정한후트랜잭션을선언적으로처리하기위해서는 bean 설정파일에트랜잭션을처리하는 bean 을정의하면된다. 이때, 이 bean 에 TransactionProxyFactoryBean 클래스를지정하여각메소드이름별로트랜잭션을처리하는방법을지정해주면된다. 본문서에서는이클래스들을 TransactionManager 를설정하는방법과 bean 파일을이용해서선언적으로트랜잭션을처리하는방법에대해살펴본다. DataSourceTransactionManager 설정 PlatformTransactionManager 구현클래스중 DataSourceTransactionManager 클래스를이용하여 TransactionManager 를지정할수있다. bean 설정파일 (applicationconext.xml) 에 transactionmanager bean 에 org.springframework.jdbc.datasource.datasourcetransactionmanager 클래스를지정해주면된다. 이후, 선언적으로트랜잭션을처리할때트랜잭션을처리하는 bean의 property중 transactionmanager에위해서정의한 transactionmanager bean을지정해주면된다. 서 예 ) DataSourceTransactionManager 의 applicationcontext.xml 파일 <bean id="transactionmanager" class="org.springframework.jdbc.datasource.datasourcetransactionmanager"> <property name="datasource" ref="datasource"/> <bean id="txproxytemplate" abstract="true" class="org.springframework.transaction.interceptor.transactionproxyfactorybean"> <property name="transactionmanager" ref="transactionmanager" /> <property name="transactionattributes"> <props> <prop key="get*">propagation_required, readonly </prop> <prop key="add*">propagation_required</prop> </props> </property> <bean id="accountservice" parent="txproxytemplate"> <property name="target"> <bean class="com.altibase.banking.accountservice"> <property name="accountdao" ref="accountdao"/> Spring 연동가이드 19 page of 31
</property> 트랜잭션을처리하기위해서는트랜잭션을관리 (TransactionManager) 하는방법뿐만아니라, 트랜잭션을처리하는방법도기술해야하는데위의예제는트랜잭션처리방법중 springframework.transaction.interceptor.transactionproxyfactorybean 클래스를이용하여 bean 설정파일 (applicationconext.xml) 에선언적으로트랜잭션을처리하는방법으로작성되었다.( 해당내용은아래에자세히설명한다.) TransactionProxyFactoryBean 을이용한선언적트랜잭션처리 TransactionProxyFactoryBean 클래스는트랜잭션을처리하기위한여러속성들을제공하는클래스이다. bean 설정파일 (applicationcontext.xml) 에 TransactionProxyFactoryBean 클래스의 bean을설정해주고, 트랜잭션을처리하는방법을각메소드별로정의하여선언적으로트랜잭션을처리할수있다. 이트랜잭션처리를위한 bean의 <property> 에지정하는트랜잭션관련속성들은다음과같다. 1. target 프로퍼티를통해트랜잭션을적용할대상객체를설정한다. 2. transactionmanager 위에서정의한 TransactionManager 를설정한다. 3. transactionattrubutes 트랜잭션속성을설정할때사용되는 Properties 객체를설정한다. 이때트랜잭션을적용할메소드단위로 <prop> 태그를이용하여트랜잭션속성을정의한다. <prop> 의태그값은다음과같은형식으로지정한다. PROPAGATION, ISOLATION_NAME, readonly, timeout, +Exception, -Exception <prop> 태그값의각항목에대한설명은다음과같다. 항목 설명 PROPAGATION 트랜잭션전파규칙을명시. 필수항목. PROPAGATION_REQUIRED( 기본값 ), PROPAGATION_REQUIRES_NEW, PROPAGATION_MANDATORY, PROPAGATION_SUPPORTS, PROPAGATION_NOT_SUPPORTED, PROPAGATION_NEVER, PROPAGATION_NESTED ISOLATION_NAME ISOLATION 속성을설정. 선택항목. DEFAULT, READ_COMMITTED, Spring 연동가이드 20 page of 31
READ_UNCOMMITTED, REPETABLE_READ, SERIALIZABLE. ALTIBASE 는이중 READ_COMMITTED, SERIALIZABLE, REPETABLE_READ 만지원한다. readonly readonly 가사용되면트랜잭션을읽기전용으로설정 timeout 트랜잭션의타임아웃시간을초단위로설정한다. +,-Exception ROLLBACK 규칙을설정. +Exception 은해당 Exception 이발생하더라도 COMMIT 을수행하고 Exception 은해당 Exception 이발생하면 ROLLBACK 을수행한다. 다음은 TransactionProxyFactoryBean 클래스를이용하여트랜잭션속성들을정의한 bean 설정파일 (applicaioncontext.xml) 이다. 예 ) DataSourceTransactionManager 의 applicationcontext.xml 파일 <bean id="transactionmanager" class="org.springframework.jdbc.datasource.datasourcetransactionmanager"> <property name="datasource" ref="datasource"/> <bean id="txproxytemplate" abstract="true" class="org.springframework.transaction.interceptor.transactionproxyfactorybean"> <property name="transactionmanager" ref="transactionmanager" /> <property name="transactionattributes"> <props> <prop key="get*">propagation_required, readonly </prop> <prop key="add*">propagation_required</prop> </props> </property> <bean id="accountservice" parent="txproxytemplate"> <property name="target"> <bean class="com.altibase.banking.accountservice"> <property name="accountdao" ref="accountdao"/> </property> 분산트랜잭션처리 Spring 에서 JOTM(Java Open Transaction Manager) 을이용하면분산트랜잭션을처리할수있다. 이때 JOTM 과연동하기위해서는먼저, Spring 에서제공하는 JotmFactoryBean 을등록해야한다. 그리고 TransactionManager 로는분산트랜잭션을제공하는 JtaTransactionManager 를사용하면된다. 뿐만아니라, 분산트랜잭션을처리하기위해서는분산트랜잭션을제공하는 DataSource 를사용해야하는데, JOTM 에서제공하는 Spring 연동가이드 21 page of 31
org.enhydra.jdbc.pool.standardxapooldatasource 를사용할수도있지만, 본문서에서는 ALTIBASE 에서제공하는 Altibase.jdbc.driver. ABXADataSource 를이용하여분산트랜잭션을처리하는방법에대해설명한다. 다음은 org.springframework.transaction.jta.jtatransactionmanager 와 Altibase.jdbc.driver. ABXADataSource 를이용하여분산트랜잭션을처리하는예제이다. 1. ABXADataSource 를이용하여 DataSource 를지정 2. JotmFactoryBean 을지정 3. TransactionManager 로 JtaTransactionManager 지정 4. TransactionProxyFactoryBean 클래스를이용하여선언적트랜잭션처리하는 bean 을지정 예 ) XAConnection 의 applicationcontext.xml 파일 <bean id="datasource1" class="altibase.jdbc.driver.abxadatasource"> <!-- connection url--> <property name="url" value="jdbc:altibase://192.168.1.35:21129/mydb"/> <!-- DB 사용자계정설정 --> <property name="user" value="sys"/> <!-- DB 사용자패스워드설정 --> <property name="password" value="manager" /> <bean id="datasource2" class="altibase.jdbc.driver.abxadatasource"> <!-- connection url--> <property name="url" value="jdbc:altibase://127.0.0.1:20300/mydb"/> <!-- DB 사용자계정설정 --> <property name="user" value="sys"/> <!-- DB 사용자패스워드설정 --> <property name="password" value="manager" /> <bean id="accountdao1" class="com.altibase.banking.accountdao"> <property name="datasource" ref="datasource1"/> <bean id="accountdao2" class="com.altibase.banking.accountdao"> <property name="datasource" ref="datasource2"/> <bean id="jotm" class="org.springframework.transaction.jta.jotmfactorybean"/> <bean id="transactionmanager" class="org.springframework.transaction.jta.jtatransactionmanager"> <property name="usertransaction" ref="jotm"/> <bean id="txproxytemplate" abstract="true" class="org.springframework.transaction.interceptor.transactionproxyfactorybean"> <property name="transactionmanager" ref="transactionmanager" /> <property name="transactionattributes"> <props> <prop key="get*">propagation_required, readonly</prop> <prop key="add*">propagation_required</prop> </props> </property> Spring 연동가이드 22 page of 31
<bean id="accountservice" parent="txproxytemplate"> <property name="target"> <bean class="com.altibase.banking.accountservice"> <property name="accountdao1" ref="accountdao1"/> <property name="accountdao2" ref="accountdao2"/> </property> 예제에포함되어있는 XAConnection 프로젝트를실행하기위해서는기존에추가했던 jar 파일이외에 JOTM 에대한 jar 파일들을더추가해야한다. JOTM 에관련된파일들은 http://forge.ow2.org/projects/jotm/ 사이트에서다운로드받을수있다. 다운로드후압축을풀면 jar 파일들이있는데이중 carol-2.0.5.jar, connector-1_5.jar, howl-0.1.11.jar, jotm.jar, jta-spec1_0_1.jar, xapool-1.5.0.jar 파일을프로젝트에추가해주면된다. ( 위의 jar 파일의이름은다운로드받은 JOTM 버전에따라이름이다를수있다.) 그외 cglib-nodep-2.1.3.jar 파일이별도로필요하다. Spring 연동가이드 23 page of 31
Spring 연동시주의사항 Spring 에서 ALTIBASE 에연동할경우주의해야할사항에대해설명한다. LOB 데이터처리 ALTIBASE 에서 LOB 데이터를처리하기위해서는반드시 autocommit 모드를 false 로바꾼후명시적으로트랜잭션을관리해줘야한다. 따라서 Spring 에서 LOB 을처리하기위해서는반드시 TransactionManager bean 을명시해줘야한다. 또한선언적트랜잭션을사용하는경우에는 propagation 을 PROPAGATION_REQUIRED, PROPAGATION_REQUIRES_NEW, PROPAGATION_NESTED 중하나로지정해줘야한다. 만약 TransactionManager 를지정해주지않았거나, 또는선언적트랜잭션을사용하는데 propagation 을위에설명한값이외의다른값으로지정했을경우에는 LOB 데이터조회시 null 값이리턴되거나, java.sql.sqlexception: [0]:LobLocator can not span the transaction 101858625. 과같은에러가발생한다. 그리고 LOB 데이터를입력시에도 java.sql.sqlexception: [0]:LobLocator can not span the transaction 101858625. 에러가발생하게된다. 예 ) LobConnection 의 applicationcontext.xml 파일 <bean id="transactionmanager" class="org.springframework.jdbc.datasource.datasourcetransactionmanager"> <property name="datasource" ref="datasource"/> <bean id="txproxytemplate" abstract="true" class="org.springframework.transaction.interceptor.transactionproxyfactorybean"> <property name="transactionmanager" ref="transactionmanager" /> <property name="transactionattributes"> <props> <prop key="get*">propagation_required</prop> <prop key="add*">propagation_ REQUIRED </prop> </props> </property> <bean id="lobsampleservice" parent="txproxytemplate"> <property name="target"> <bean class="com.altibase.lob.lobsampleservice"> <property name="lobsampledao" ref="lobsampledao"/> </property> Spring 연동가이드 24 page of 31
부록 sample 예제를바탕으로 Spring 을사용하는방법에대해좀더자세하게설명한다. 부록에서설명하는 sample 프로젝트의이름은 HelloSpring 이며 Eclipse 에서작성하였다. HelloSpring 프로젝트는인사말메시지를 print 하는간단한프로그램으로 Spring 컨테이너 (BeanFactory) 로부터 bean 설정파일 (applicationcontext.xml) 에정의되어있는 bean(greetingservice) 을가져와 bean 에정의되어있는인사말메시지를 print 한다. HelloSpring 구현 1. HelloSpring 프로젝트생성 1-1. 메뉴 File Java Project 클릭 1-2. Project name : 에 HelloSpring 입력 1-3. Finish 버튼을클릭 2. sample 자바파일구현 다음의클래스및인터페이스를구현한다. 2-1. GreetingService 인터페이스 Spring 연동가이드 25 page of 31
서비스를정의해놓은인터페이스이다. HelloSpring 프로젝트의 src 디렉토리에서마우스오른쪽버튼클릭하여 New Interface 를클릭한다. Package: 에 com.altibase.hello 를입력하고 Name: 에 GreetingService 를입력한다. GreeingService.java 파일이생성되면다음과같이소스를작성한다. package com.altibase.hello; public interface GreetingService { public void saygreeting(); } 2-2. GreetingServiceImp 클래스 GreetingServie 인터페이스를구현한클래스이다. HelloSpring 프로젝트의 src 디렉토리에서마우스오른쪽버튼클릭하여 New Class 를클릭한다. Package: 에 com.altibase.hello 를입력하고 Name: 에 GreetingServiceImp 를입력한다. Interfaces: 옆에 Add 버튼을클릭하여 GreetingService 를입력한후 OK 버튼을클릭한다. Spring 연동가이드 26 page of 31
GreeingServiceImp.java 파일이생성되면다음과같이소스를작성한다. package com.altibase.hello; public class GreetingServiceImp implements GreetingService{ private String greeting; public GreetingServiceImp(){ } } public GreetingServiceImp(String greeting){ this.greeting = greeting; } public void saygreeting() { // TODO Auto-generated method stub System.out.println(greeting); } public void setgreeting(string greeting){ this.greeting = greeting; } 3. bean 설정파일정의 bean 설정파일 (applicationcontext.xml) 에 GreetingServiceImp 에대한 bean 을정의한다. Spring 연동가이드 27 page of 31
HelloSpring 프로젝트에서마우스오른쪽버튼클릭하여 New File 을클릭한다. File name: 에 applicationcontext.xml 을작성한다. applicationcontext.xml 파일에다음과같이작성한다. <?xml version="1.0" encoding="utf-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xsi:schemalocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> <bean id="greetingservice" class="com.altibase.hello.greetingserviceimp"> <property name="greeting"> <value>hello</value> </property> </beans> Spring 연동가이드 28 page of 31
greetingservice 는 bean 의이름으로 java 프로그램에서해당이름으로 bean 가져와사용할수있다. class 에는서비스를담당하는 GreetingServiceImp 클래스의 full name 으로명시해주고, property 에 GreetingServiceImp 에정의되어있는멤버변수 greeting 에 setting 될메시지를넣어주면된다. 4. HelloApp 클래스정의 main 클래스로 BeanFactory 로부터 GreetingServiceImp 가정의되어있는 bean 을가져와서비스메소드 (saygreeting()) 를호출한다. HelloSpring 프로젝트의 src 디렉토리에서마우스오른쪽버튼클릭하여 New Class 를클릭한다. Package: 부분은공락으로나두고 Name: 에 HelloApp 를입력한다. HelloApp.java 파일이생성되면다음과같이소스를작성한다. import org.springframework.beans.factory.*; import org.springframework.beans.factory.xml.*; import org.springframework.core.io.*; import com.altibase.hello.*; public class HelloApp { public static void main(string[] args) { BeanFactory factory = new XmlBeanFactory(new FileSystemResource("applicationConrext.xml")); Spring 연동가이드 29 page of 31
GreetingService greetingservice = (GreetingService)factory.getBean("greetingService"); greetingservice.saygreeting(); } } 위의소스 applicationconext.xml 은위에정의한 bean 설정파일이고, greetingservice 는 applicationcontext.xml 에정의된 GreetingServiceImp 클래스에대한 bean 이름을나타낸다. 5. 관련 jar 파일들추가 Spring 관련 jar 파일을 HelloSpring 에추가한다. HelloSpring 프로젝트에서마우스오른쪽버튼클릭하여 Properties 를클릭 Java Build Path Libraries 에서 Add External JARS 를클릭하여 Spring Framework 의 jar 파일중 spring.jar 파일과 common-logging.jar 파일을추가한다. 해당파일의위치는 DriverManagerDataSource 설명부분을참조한다. 6. HelloSpring 프로젝트를실행한다. HelloSpring 프로젝트를클릭한후메뉴에서 Run 을실행하거나 Run 실행단추를클릭한다. Console 창에 Hello 문자열이 print 된다. Spring 연동가이드 30 page of 31
알티베이스 서울특별시구로구구로 3 동 182-13 대륭포스트 2 차 1008 호 02-2082-1000 http://www.altibase.com 대전사무소대전광역시서구둔산동 921 주은리더스텔 901 호 042-489-0330 기술지원본부서울특별시구로구구로 3 동 182-13 대륭포스트 2 차 908 호 02-2082-1000 기술지원센터 02-2082-1114 http://support.altibase.com Copyright c 2000~2013 ALTIBASE Corporation. All Rights Reserved. 이문서는정보제공을목적으로제공되며, 사전에예고없이변경될수있습니다. 이문서는오류가있을수있으며, 상업적또는특정목적에부합하는명시적, 묵시적인책임이일체없습니다. 이문서에포함된 ALTIBASE 제품의특징이나기능의개발, 발표등의시기는 ALTIBASE 재량입니다. ALTIBASE는이문서에대하여관련된특허권, 상표권, 저작권또는기타지적재산권을보유할수있습니다. Spring 연동가이드 31 page of 31