SessionFailOver
개요
본 문서는 iBATIS 환경, iBATIS+Spring 환경에서 Altibase와 연동하는 방법에 대해 기술한다.
iBATIS 2.3.4, Spring Framework 2.5.6, Altibase v5.3.3, 개발 IDE로는 Eclipse를 사용하였고, 문서 이외에 각 chapter 별도로 예제가 제공된다.
본 문서와 더불어 개발 시 참고해야 할 문서들은 다음과 같다.
1. 『Altibase 개발가이드』
2. 『JAVA 개발가이드』
3. 『Altibase_JBOSS 연동가이드』
4. 『Altibase_TOMCAT 연동가이드』
5. 『Altibase_WEBSPHERE 연동가이드』
6. 『Altibase_WEBLOGIC 연동가이드』
7. 『Altibase_Spring 연동가이드』
8. 『Altibase_HIBERNATE 연동가이드』
9. 『Altibase_iBATIS 연동가이드』
iBATIS 개요
본 장에서는 iBATIS의 개념과 특징, 다운로드 및 사용 방법에 대해 살펴본다.
iBATIS란?
iBATIS란 프로그래머가 DB를 보다 편리하게 핸들링 할 수 있게 해주는 ORM(Object Relational Mapping) 프레임워크로서 DB 테이블과 JAVA 객체와의 관계를 mapping시켜 persistence logic 처리를 도와주는 역할을 한다. 즉, iBATIS를 이용하면 DB의 테이블과 JavaBean을 mapping(SqlMap XML파일)시켜 DB에 CRUD(생성, 조회, 수정, 삭제) 작업을 쉽게 할 수 있다.
기존의 JDBC를 이용하여 프로그래밍하는 방식은 프로그램 소스 안에 SQL문을 작성하였지만, iBATIS를 이용하면 SQL문을 프로그램에서 분리하여 XML 파일에 별도로 작성한다. 따라서 프로그래머가 기존의 JDBC를 사용할 때 보다 프로그래밍하는 부담이 줄어들게 된다. 뿐만 아니라 SQL을 변경하고자 할 경우 기존처럼 프로그램을 수정하는 것이 아니라 XML 파일의 SQL문 만을 변경하면 되기 때문에 SQL 변환이 자유롭다는 특징이 있다.
다음은 iBATIS에서 xml(SqlMap.xml)로 작성된 SQL을 DB와 어떻게 통신하는지를 간단히 보여주는 그림이다.
사용자는 CRUD에 대한 각각의 SQL문은 SqlMap XML 파일에 작성하고 이 파일들을 SqlMapConfig XML 파일에 작성하면 iBATIS API를 통해 자동으로 Mapping된 Statement 객체들을 생성하여 이를 통해 DB에 SQL문을 실행하게 된다.
iBATIS의 보다 자세한 아키텍처는 다음의 사이트를 참고하면 된다.
iBATIS 다운로드
iBATIS를 사용하기 위해서 iBATIS 관련 jar 파일이 필요하다. 이 jar 파일은 http://ibatis.apache.org/java.cgi 사이트에서 다운로드 받을 수 있다. 다운로드 받은 파일의 압축을 풀면 압축 푼 디렉토리 안의 lib 디렉토리에 jar 파일이 존재하는데 이 jar 파일을 이용하여 iBATIS와 연동하면 된다. 만약, iBATIS 패키지가 ibatis-2.3.4.726.zip 이라면 압축을 푼 디렉토리의 lib 디렉토리에 ibatis-2.3.4.726.jar 파일이 한다.
기존 iBATIS 버전에서는 ibatis-comm.jar, ibatis-sqlmap.jar 파일들이 필요했지만, iBATIS 2.3.4 버전에서는 ibatis-comm.jar 파일과 ibatis-sqlmap.jar 파일이 ibatis-2.3.4.x.jar 파일로 통합되었다. 본 문서에서는 ibatis-2.3.4.726.jar 를 사용하였다.
iBATIS를 이용한 Sample 작성
iBATIS를 이용하여 SQL문을 처리하기 위해서는 SqlMapConfig XML 파일과 SqlMap XML 파일을 작성해야 한다. 이 파일들은 프로그래머에게 JavaBean을 PreparedStatement의 파라미터와 ResultSet으로 쉽게 mapping 할 수 있도록 해준다. 본 장에서는 SqlMapConfig XML 파일, SqlMap XML 파일을 작성하는 방법과 application에서 이 파일을 이용하여 실제로 SQL을 처리하는 방법에 대해 설명한다. Sample 프로그램을 작성하는 보다 자세한 내용은 부록 부분을 참고하면 된다.
SqlMap 파일 작성
SqlMap XML 파일은 DB로 전송할 SQL 구문, PreparedStatement로 binding될 parameter의 mapping, ResultSet의 result의 mapping들을 명시하는 파일이다.
다음은 person 테이블에 CRUD를 처리하는 SqlMap XML 파일을 작성한 예제이다. (Person.xml)
<resultMap> 태그에는 SELECT문을 실행 후 ResultSet에 담길 데이터들의 Map 객체에 대해 정의하고, <insert>, <update>, <delete>, <select> 태그에는 CRUD의 작업에 대한 각각의 SQL문을 정의한다.
각각의 태그에 대한 보다 자세한 설명은 http://ibatis.apache.org 사이트를 참고하거나 첨부된 문서 iBATIS-SqlMaps-2-ko.pdf 파일을 참고하면 된다.
SqlMapConfig 파일 작성
SqlMapConfig 파일은 DB 연결을 위한 dataSource, SqlMap 파일의 경로, 그 외 SqlMapClient를 제어할 property들을 작성하는 SQL Maps 설정파일이다.
다음은 SqlMapConfig 파일(SqlMapConfigExample.xml) 예제이다.
<properties> 태그에는 형태로 정의된 property들을 작성한 properties 파일의 경로 및 이름을 명시해주고, <settings> 태그에는 SqlMapClient 를 제어할 property들을, <transactionManager> 와<dataSource>에는 연결할 DB정보를 작성한다.
또, <SqlMap> 태그에는 미리 작성한 SqlMap 파일들의 경로 및 이름을 작성한다.
각각의 태그에 대한 보다 자세한 설명은 http://ibatis.apache.org 사이트를 참고하거나 첨부된 문서 iBATIS-SqlMaps-2-ko.pdf 파일을 참고하면 된다.
SqlMapConfig 파일 작성 - iBATIS.Net 연동 시
ODBC를 통한 접속 시 SqlMap.config 의 알티베이스 연결 설정 방법을 간단히 설명한다.
먼저 알티베이스 ODBC Driver 설치 및 ODBC 데이터 원본 관리자에서 사용자 DSN 을 추가해야 한다.
ODBC 설치 및 설정 방법은 기술문서 "Windows 환경의 Altibase ODBC 개발가이드" 를 참고한다.
providers.config에 정의된 여러 DBMS Provider 중에서 알티베이스 접속 시 사용할 Provider 는 Odbc2.0이다. <provider>태그에 Odbc2.0을 작성한다.
<dataSource> 태그에서 connectionString에 ODBC 데이터 원본 관리자에서 추가한 DSN을 입력한다.
Application 작성
Application에서 SqlMapClient 인스턴스를 이용하여 DB 테이블에 Mapping된 객체와 연동하여 CRUD 작업을 처리할 수 있다.
iBATIS를 이용하여 DB와 연동하기 위해서는 먼저 SqlMapConfig 파일을 통해 SqlMapClient 객체를 얻어와야 한다. 이후 SqlMapClient 객체를 통해 CRUD에 해당하는 메소드를 호출하여 DB와 통신하면 된다.
다음은 DB의 person 테이블에 데이터를 삽입, 변경, 삭제, 조회하는 application이다.
예) SimpleConnection의 PersonApp.java
먼저 SqlMapConfig 파일을 읽어 들여 SqlMapClient 객체를 얻어온다. (
String resource ="SqlMapConfigExample.xml";
Reader reader = Resources.getResourceAsReader(resource);
SqlMapClient sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
)
이후 CRUD에 해당하는 SqlMapClient 클래스의 각각의 메소드를 호출한다. (
sqlMap.insert(), sqlMap.queryForList(), sqlMap.queryForObject(),sqlMap.update(), sqlMap.delete()
)
각 메소드의 자세한 설명은 http://ibatis.apache.org 사이트를 참고하거나 첨부된 문서 iBATIS-SqlMaps-2-ko.pdf 파일을 참고하면 된다.
Altibase 연동
iBATIS에서 Altibase를 연동하는 위해서는 Altibase JDBC Driver를 setting하고 SqlMapConfig 파일에 Altibase를 위한 dataSource를 지정하면 된다.
본 장에서는 Altibase JDBC Driver를 얻는 방법, JDBC Driver를 설정하는 방법, SqlMapConfig에 dataSource를 설정하는 방법에 대해 설명한다.
또한, FailOver 기능을 사용하는 방법, 여러 버전의 Altibase와 연동하는 방법, Stored Procedure/Function을 호출하는 방법에 대해서도 살펴본다.
Altibase JDBC Driver 얻는 방법
Altibase에서 제공하는 JDBC driver는 Altibase.jar 파일이다. 이 파일은 Altibase가 설치되어있는 서버의 $ALTIBASE_HOME/lib 디렉토리 안에 존재한다.
Altibase v5부터는 $ALTIBASE_HOME/lib 디렉토리에 Altibase.jar 파일과 Altibase5.jar 파일이 존재하는데, Altibase.jar는 일반 JDBC Driver 파일이고, Altibase5.jar는 Altibase v5와 그 이하의 버전을 함께 연동하고 싶을 때 사용하는 JDBC Driver 파일이다. 따라서 하나의 Altibase와 연동하거나, 또는 버전이 동일한 여러 대의 Altibase와 연동할 경우에는 $ALTIBASE_HOME/lib/Altibase.jar 파일을 사용하면 된다.
연동하려는 Altibase와 Altibase JDBC Driver가 호환 가능한지 확인을 위해 Altibase JDBC Driver 버전 확인이 필요하다.
Altibase JDBC Driver 버전을 확인하는 방법은 다음의 명령어를 수행하면 된다.
이때, Altibase의 cm protocol version과 Altibase JDBC Driver의 CMP가 동일하면 호환 가능하다.
버전이 UP 되면서 JDBC 관련 버그가 fix되었을 가능성이 있으므로, 일반적으로 Altibase의 버전과 같거나 이 보다 더 최신의 Altibase JDBC Driver 파일을 사용하는 것을 권장한다.
JDBC Driver에 설정하는 방법
다운로드 받은 JDBC Driver 인 Altibase.jar 파일은 classpath에 추가하거나 웹서버의 적절한 디렉토리에 위치시킨다.
만약, Eclipse를 사용하여 개발한다면 다음과 같이 해당 프로젝트에 Altibase JDBC Driver를 추가할 수 있다.
프로젝트 – JRE System Library [DOCKI:J2SE-1.5] - Properties – Installed JREs – 항목 중 jre를 클릭 – Edit – Add External JARs 를 클릭하여 Altibase JDBC Driver인 Altibase.jar를 추가한다.
SqlMapConfig 파일에 dataSource를 설정하여 Altibase와 연동
SqlMapConfig 파일의 <transactionManager> 태그에 Altibase용 property를 지정하여 Altibase와 연결하면 된다. 이 때 SqlMapConfig 파일에 직접 property 값을 입력할 수 있고, 또는 별도의 properties 파일을 작성하여 이 파일에 작성된 property값을 로딩하여 사용할 수 도 있다.
다음은 db.properties 라는 properties 파일에 Altibase에 대한 property들을 정의하고, 이 property들을 읽어와 SqlMapConfig 파일에서 사용하는 예제이다.
예) SimpleConnection의 db.properties 파일
이 파일에 설정된 각각의 값의 의미는 다음과 같다.
Property | 설정 |
---|---|
driver | Altibase JDBC driver class Name |
url | Altibase와 연결을 위한 Connection string정보 "jdbc:Altibase://IP:port_no/db_name” 형태로 기입 |
username | 데이터베이스 계정 |
password | 데이터베이스 패스워드 |
예) SimpleConnection의 SqlMapConfigExample.xml 파일
db.properties에 지정한 driver, url, username, password property들을 읽어와 dataSource의 JDBC.Driver, JDBC.ConnectionURL, JDBC.Username, JDBC.password property에 setting하고 있다.
위의 예제 SimpleConnection 프로젝트를 실행하기 위해서는 Altibase.jar, ibatis-2.3.4.x.jar 파일이 필요하다.
FailOver를 이용한 Connection
Altibase v5.3.3부터 FailOver를 지원하는데, FailOver 기능을 사용하기 위해서는 dataSource의 Connection url을 적어주는 부분에 FailOver 관련 속성을 넣어주면 된다.
다음은 FailOver를 이용하여 Altibase에 연결하는 예제이다. db.properties 파일에 Connection url 부분을 정의하였다.
예) FailOverSample의 db.properties 파일
위의 파일에 지정한 Connection url 부분에 정의할 수 있는 FailOver 관련 property는 다음과 같다.
Property | 설명 |
---|---|
AlternateServer | 장애 발생시 접속하게 될 가용 서버를 나타내며 (IP Address1:Port1, IP Address2:Port2,...) 형식으로 기술한다. |
ConnectionRetryCount | 가용 서버 접속 실패 시, 접속 시도 반복 횟수 |
ConnectionRetryDelay | 가용 서버 접속 실패 시, 다시 접속을 시도하기 전에 대기하는 시간(초 단위) |
LoadBalance | on으로 설정하면 최초 접속 시도 시에 기본 서버와 가용 서버를 포함하여 랜덤으로 선택한다. off로 설정하면 최초 접속 시도 시에 기본 서버에 접속하고, 접속에 실패하면 AlternateServer로 기술한 서버에 접속한다. |
SessionFailOver | STF(Service Time Fail-Over)를 할 것인지 여부를 나타낸다. on : STF, off : CTF CTF(Connection Time Fail-Over)는 DBMS 접속 시점에 장애를 인식하여 다른 정상서버로 접속을 재시도하는 것을 의미한다. STF(Service Time Fail-Over)는 서비스하는 도중에 장애를 감지하여 다른 가용 노드의 DBMS에 다시 접속하여 세션의 프로퍼티를 복구한 후 사용자 응용 프로그램의 업무 로직을 다시 수행할 수 있도록 하는 것을 의미한다. (STF는 DB접속에 대해서만 Fail-Over를 수행해주는 것이며 실패한 트랜잭션에 대해서는 사용자에 의해 재처리되어야 한다) |
위의 예제 FailOverSample 프로젝트를 실행하기 위해서는 “SqlMapConfig 파일에 dataSource를 설정하여 ALTIBASE와 연동”과 마찬가지로 Altibase.jar, ibatis-2.3.4.x.jar 파일이 필요하다.
Altibase5와 이전 버전을 동시에 Connection
Altibase v5부터는 하나의 어플리케이션에서 Altibase v5와 Altibase v4 혹은 Altibase v3와 동시에 연결할 수 있도록 Altibase v5 전용의 JDBC Driver(Altibase5.jar)를 제공한다.
이 Driver를 이용하면 Altibase v5 – Altibase v4, 혹은 Altibase v5 – Altibase v3, Altibase v5.1.5 – Altibase v5.3.3 간 두 버전의 Altibase에 접속이 가능하다.
기존의 Altibase.jar와 구별하기 위해 별도로 Altibase v5 전용의 Altibase5.jar 가 필요하다. 또한 dataSource에 지정해주는 부분에 JDBC Driver 클래스 이름도 기존의 Altibase.jdbc.driver.AltibaseDriver 대신 Altibase v5 전용의 Altibase5.jdbc.driver.AltibaseDriver를 지정해야 한다.
iBATIS에 다른 버전의 Altibase와 연동하기 위해서는 각 버전에 해당하는 SqlMapConfig 파일을 별도로 작성하여 어플리케이션에서 각각의 SqlMapConfig 파일을 읽어드리면 된다.
이 때 주의할 점은 프로그램에서 Altibase5.jdbc.driver.AltibaseDriver를 먼저 로딩한 후에 Altibase.jdbc.driver.AltibaseDriver를 로딩해야 한다는 것이다.
다음은 Altibase.jar와 Altibase5.jar 파일을 이용하여 두 버전의 ALTIBASE의 드라이버를 로딩하는 예제이다.
예) MultiVersionConnection의 db.properties1 파일 : Altibase v5 버전에 대한 설정
예) MultiVersionConnection의 db.properties2 파일 : Altibase v5 이전 버전에 대한 설정
예) MultiVersionConnection의 SqlMapConfigExample1.xml파일 : Altibase v5 버전에 대한 설정
예) MultiVersionConnection의 SqlMapConfigExample2.xml파일 : Altibase v5 이전 버전에 대한 설정
예) MultiVersionConnection의 PersonApp.java파일
위의 PersonApp.java 예제를 보면 Altibase5.jdbc.driver.AltibaseDriver를 Altibase.jdbc.driver.AltibaseDriver보다 먼저 로딩하기 위해 Altibase5.jdbc.driver.AltibaseDriver를 JDBC.Driver로 사용하는 SqlMapConfigExample1.xml 파일을 먼저 읽어드리고 있다. 반드시 Altibase v5 전용의 드라이버를 먼저 로딩해야 한다.
예제에 포함된 MultiVersionConnection 프로젝트를 실행하기 위해서는 기존에 사용했던 ibatis-2.3.4.x.jar 파일 뿐만 아니라, Altibase.jar와 Altibase5.jar 파일이 더 필요하다.
이 파일들은 Altibase가 설치된 디렉토리($ALTIBASE_HOME)의 lib 디렉토리 안에 존재하는데 Altibase v5 버전의 Altibase5.jar 파일, 그 이전 버전의 Altibase.jar 파일을 사용하면 된다.
Procedure/Function 호출
iBATIS에서 DB에 생성한 Stored Procedure/Function을 호출할 경우에는 SqlMap 파일에 Stored Procedure/Function에 정의된 parameter에 대한 정보를 설정해주고, <procedure> 태그에 CallableStatement에 적용되는 Procedure/Function을 호출하는 문장을 정의해주면 된다.
다음은 Stored Procedure/Function을 호출하는 예제이다.
예) ProcedureSample의 Procedure/Function 생성 구문
예) Procedure의 Procedure.xml(SqlMap) 파일
<paramaterMap> 태그에 Procedure/Function의 파라미터에 대한 타입과 IN/OUT 설정을 정의하고 <procedure> 태그에서 parameterMap 속성에 <paramaterMap> 태그의 id 값을 명시해준다.
그리고 <procedure> 태그에 Procedure/Function을 호출하는 문장을 작성해준다.
ProcedureSample 예제를 실행하기 위해서는 “SqlMapConfig 파일에 dataSource를 설정하여 Altibase와 연동”과 마찬가지로 Altibase.jar, ibatis-2.3.4.x.jar 파일이 필요하다.
iBATIS, Spring, Altibase 연동
Altibase와 연동하기 위해서는 iBATIS에 dataSource를 지정할 수도 있고, Spring에 dataSource를 지정할 수도 있다.
본 장에서는 이 두 방법을 이용하여 ATLIBASE와 연동하는 방법에 대해 설명한다.
Spring에 dataSource를 설정하는 경우
iBATIS와 Spring을 함께 사용하기 위해서는 Spring의 applicationContext.xml 파일에 iBATIS의 SqlMapClientFactoryBean bean을 지정해 주면 된다.
이 후 각각의 DAO bean에 SqlMapClientFactoryBean bean을 참조하도록 설정해주면 다른 bean 에서 SqlMapClient 객체를 사용하여 CRUD에 해당하는 메소드들을 호출할 수 있다.
iBATIS, Spring을 연동한 환경에서 Spring에 dataSource를 설정하는 방법은『Altibase Spring 연동가이드』문서에서 설명한 방법들 중 하나를 선택하여 applicationContext.xml에 dataSource를 지정해주고, iBATIS와 연동을 위해 iBATIS의 SqlMapClientFactoryBean bean을 지정해주면 된다. 이 때 SqlMapClientFactoryBean bean의 configLocation property에 SqlMapConfig 파일의 이름을 명시해준다.
다음은 applicationContext.xml 파일에서 dataSource와 SqlMapClientFactoryBean bean을 지정해주는 예제이다.
예) SpringIbatisConnection1의 applicationContext.xml 파일
위의 예제 SpringIbatisConnection1 프로젝트를 실행하기 위해서는 Altibase.jar, ibatis-2.3.4.x.jar 파일과 spring-jdbc.jar, spring-orm.jar, spring.jar, commons-logging.jar 파일이 필요하다.
spring-jdbc.jar, spring-orm.jar, spring.jar, commons-logging.jar 파일은 Spring Framework에 포함된 파일이다. 자세한 디렉토리 위치는 『Altibase Spring 연동가이드』문서를 참고하면 된다.
iBATIS에 dataSource를 설정하는 경우
iBATIS, Spring을 연동한 환경에서 iBATIS에 dataSource를 설정하는 방법은 위의 “SqlMapConfig 파일에 dataSource를 설정하여 ALTIBASE와 연동” 부분에서 설명한 방법과 동일한 방법으로 SqlMapConfig 파일에 <transactionManager>에 ALTIBASE 연결을 위한 property를 지정하면 된다.
다만, Spring에서 iBATIS를 연동하기 위해 위의 “Spring에서 dataSource를 설정하는 경우”와 마찬가지로 iBATIS의 SqlMapClientFactoryBean bean 을 applicationContext.xml 파일에 지정해줘야 한다.
다음은 iBATIS와 Spring 연동 환경에서 iBATIS에 dataSource를 설정하여 Altibase와 연동하는 예제이다.
예) SpringIbatisConnection2의 applicationContext.xml 파일
예) SpringIbatisConnection2의 SqlMapConfigExample.xml 파일
위의 예제를 보면 dataSource를 SqlMapConfigExample.xml에 설정하고 applicationContext.xml 파일에는 이 SqlMapConfigExample.xml 파일을 읽어 SqlMapClientFactoryBean bean을 설정하고 있는 것을 확인할 수 있다.
SpringIbatisConnection2 예제를 실행하기 위해서는 Altibase.jar, ibatis-2.3.4.x.jar 파일과 spring-orm.jar, spring.jar, commons-logging.jar 파일이 필요하다. spring-orm.jar, spring.jar, commons-logging.jar 파일은 Spring Framework에 포함된 파일이다. 자세한 디렉토리 위치는 『Altibase Spring 연동가이드』문서를 참고하면 된다.
Altibase의 ConnectionPool을 이용
Altibase에서 제공하는 AltibaseConnectionPoolDataSource 클래스를 사용하면 Altibase의 ConnectionPool을 이용할 수 있는데, iBATIS, Spring 연동 환경에서는 Spring의 applicationContext.xml 파일에 AltibaseConnectionPoolDataSource 클래스를 이용하여 dataSource bean을 정의하면 된다. Spring과 연동 없이 iBATIS에서만 Altibase의 ConnectionPool을 사용할 수 있는 방법은 없다는 것을 주의해야 한다.
자세한 내용은 『Altibase Spring 연동가이드』문서를 참고하여 설정하면 된다.
예) 『Altibase Spring 연동가이드』에 첨부된 AltibaseConnectionPool의 applicationContext.xml 파일
트랜잭션 관리
iBATIS에서 DB와 연동할 경우 SqlMapConfig 파일의 <transactionManager> 에 dataSource를 지정하면 SqlMap 파일에서 정의한 각각의 CRUD 메소드가 호출될 때 자동으로 setAutoCommit(false); 가 호출이 된다. 이후 해당 메소드가 종료되면 트랜잭션은 commit이 되고 다시 default autocommit 모드로 바뀌게 된다.
또한 프로그래머가 어플리케이션에서 명시적으로 트랜잭션을 관리할 수 도 있다.
만약, iBATIS와 Spring을 연동하였다면 Spring에서도 트랜잭션을 관리할 수 있다.
본 장에서는 이러한 트랜잭션 관리 방법들을 소개한다.
iBATIS에서 트랜잭션 관리
iBATIS에서 DB와 연동할 경우 SqlMapConfig 파일의 <transactionManager> 에 dataSource를 지정하면 SqlMap 파일에서 정의한 각각의 CRUD 메소드가 호출될 때 자동으로 setAutoCommit(false); 가 호출이 된다. 이후 해당 메소드가 종료되면 트랜잭션은 commit이 되고 다시 default autocommit 모드로 바뀌게 된다.
또한 어플리케이션에서 프로그래머가 직접 트랜잭션을 관리할 수 있다.
이때, 트랜잭션을 시작하기 위해서는 SqlMapClient의 startTransaction() 메소드를 호출하고, commit 하고자 할 경우에는 commitTransaction () 메소드, commit 없이 rollback 하고자 할 경우에는 endTransaction() 메소드를 호출하면 된다.
다음은 어플리케이션에서 명시적으로 트랜잭션을 처리하는 예제이다..
예) TransactionSample의 PersonApp.java 파일
위의 예제 TransactionSample 프로젝트를 실행하기 위해서는 “SqlMapConfig 파일에 dataSource를 설정하여 Altibase와 연동”과 마찬가지로 Altibase.jar, ibatis-2.3.4.x.jar 파일이 필요하다.
Spring에서 트랜잭션 관리
iBATIS, Spring 을 연동한 환경이라면, Spring에서 트랜잭션을 관리할 수 있다.
본 문서에서는 Spring의 applicationContext.xml 파일에 선언적으로 트랜잭션을 관리/처리하는 예제(LobSpringIbatisSample 예제)를 포함하고 있다.
보다 자세한 내용은『Altibase Spring 연동가이드』문서를 참고하면 된다.
iBATIS 연동 시 고려사항
iBATIS에서 Altibase에 연동할 경우 고려해야 할 사항에 대해 설명한다.
LOB 데이터 처리
iBATIS에서 LOB을 처리하기 위해서는 SqlMap 파일에 parameter와 result에 대한 정보를 setting하는 부분에 반드시 jdbcType을 CLOB/BLOB이라고 명시를 해줘야 한다.
그렇지 않을 경우에 길이제한에 의해 올바르지 않은 데이터를 입력하거나 잘못된 데이터를 질의할 수 있다.
혹은 Invalid length등의 에러가 발생할 수도 있다. 따라서 반드시 parameter와 result에 대한 mapping을 CLOB/BLOB으로 지정해줘야 한다.
다음은 CLOB 타입의 데이터에 대한 parameterMap과 resultMap을 지정하여 setting하고 있는 예제이다.
예) LobSample의 LobSample.xml(SqlMap) 파일
또한 LOB 처리 시 반드시 주의해야 할 사항은 Altibase에서 LOB 데이터를 처리하기 위해서는 반드시 autocommit 모드를 false로 바꾼 후 트랜잭션을 관리해줘야 한다는 것이다.
iBATIS 연동 시 SqlMapConfig 파일의 <transactionManager>에 dataSource를 설정할 경우에는 내부적으로 setAutoCommit(false); 메소드를 호출하여 autocommit 모드를 false로 바꿔주기 때문에 LOB 처리 시 따로 고려할 사항은 없다. 하지만, iBATIS와 Spring을 함께 연동할 경우 Spring에서 트랜잭션을 관리해준다면 LOB을 처리하기 위해서는 반드시 TransactionManager bean을 명시해줘야 한다.
또, Spring에서 선언적으로 트랜잭션을 처리하는 경우에는 propagation을 PROPAGATION_REQUIRED, PROPAGATION_REQUIRES_NEW, PROPAGATION_NESTED 중 하나로 지정해줘야 한다.
만약 TransactionManager를 지정해주지 않았거나, 또는 선언적 트랜잭션을 사용하는데 propagation을 위에 설명한 값 이외의 다른 값으로 지정했을 경우에는 LOB 데이터 조회 시 null 값이 리턴 되거나, “java.sql.SQLException: [DOCKI:0]:LobLocator can not span the transaction 101858625.” 과 같은 에러가 발생한다.
그리고 LOB 데이터를 입력 시에도 “java.sql.SQLException: [DOCKI:0]:LobLocator can not span the transaction 101858625.” 에러가 발생하게 된다.
다음의 예제는 Spring의 applicationContext.xml에서 선언적으로 트랜잭션을 처리하여 LOB 데이터를 처리하는 예제이다. 선언적으로 트랜잭션을 처리하는 방법에 대한 자세한 설명은 『Altibase Spring 연동가이드』문서를 참고하면 된다.
예) LobSpringIbatisSample의 applicationContext.xml 파일
위의 LobSpringIbatisSample 프로젝트를 실행하기 위해서는 Altibase.jar, ibatis-2.3.4.x.jar 파일과 spring-jdbc.jar, spring-orm.jar, spring.jar, commons-logging.jar, cglib-nodep-x.x.jar 파일이 필요하다.
부록
sampleConnection 예제를 바탕으로 iBATIS에서 Altibase와 연동하는 방법에 대해 좀 더 자세하게 설명한다.
단, IDE는 Eclipse를 사용한다.
DB 테이블 및 시퀴스 생성
DB에 다음의 테이블과 시퀀스를 생성한다. (create_tbl.sql 파일 참고)
프로잭트 생성
Eclipse에서 SimpleConnection 이라는 프로젝트를 생성한다.
1. 메뉴 – File – Java Project 클릭
2. Project name : 에 SimpleConnection 입력
3. Finish 버튼을 클릭
SqlMap 파일 생성
Person 테이블의 CRUD SQL 구문과 mapping되는 메소드들을 정의한 SqlMap 파일을 작성한다.(Person.xml)
1. SimpleConnection 프로젝트 – src 디렉토리에서 마우스 오른쪽 버튼 클릭하여 New – File을 클릭한다.
2. File name: 에 Person.xml을 작성한다.
다음의 내용을 Person.xml 파일에 작성한다.
Application에서 SqlMapClient의 insert, update, delete, queryForXXX()메소드를 호출할 때 위의 파일에 정의되어 있는 <insert>, <update>, <delete>, <select> 태그에 정의되어 있는 id와 일치하는 SQL 문들이 자동으로 수행이 된다.
SqlMapConfig 파일 생성
1. Altibase 연결을 위한 property들을 정의한 properties 파일(db.properties)을 작성한다.
( SimpleConnection 프로젝트 – src 디렉토리에서 마우스 오른쪽 버튼 클릭하여 New – File을 클릭한다. File name: 에 db.properties을 작성한다.)
2. SqlMapConfig 파일(SqlMapConfigExample.xml)에 Altibase와 연동을 위한 dataSource와 SqlMap 파일을 설정한다.
( SimpleConnection 프로젝트 – src 디렉토리에서 마우스 오른쪽 버튼 클릭하여 New – File을 클릭한다. File name: 에 SqlMapConfigExample.xml을 작성한다.)
Application 작성
1. person 테이블에 대한 DO객체인 Person 클래스(Person.java)를 작성한다.
1-1. SimpleConnection 프로젝트의 src 디렉토리에서 마우스 오른쪽 버튼 클릭하여 New – Class를 클릭한다.
1-2. Package: 에 examples.domain를 입력하고 Name: 에 Person를 입력한다
다음의 내용을 Person.java 파일에 작성한다.
2. DB에 CRUD를 실행하는 main 프로그램(PersonApp.java)을 작성한다.
2-1. SimpleConnection 프로젝트의 src 디렉토리에서 마우스 오른쪽 버튼 클릭하여 New – Class를 클릭한다.
2-2. Name: 에 PersonApp를 입력한다.
다음의 내용을 PersonApp.java 파일에 작성한다.
관련 JAR 파일 추가
Altibase.jar와 ibatis-2.3.4.x.jar 파일을 추가한다.
SimpleConnection 프로젝트에서 마우스 오른쪽 버튼 클릭하여 Properties를 클릭 – Java Build Path – Libraries 에서 Add External JARS를 클릭하여 Altibase.jar와 ibatis-2.3.4.x.jar 파일을 추가한다.
Application 실행
SimpleConnection 프로젝트를 실행한다.
SimpleConnection 프로젝트를 클릭한 후 메뉴에서 Run을 실행하거나 Run 실행 단추를 클릭한다.