개요
본 문서는 MyBatis 환경, iBatis와의 차이점, MyBatis에서 Altibase와 연동하는 방법에 대해 기술한다.
MyBatis 3.2.8, Altibase 6.3.1, 개발 IDE로는 Eclipse, Maven을 사용하였으며 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 연동가이드』
MyBatis 개요
본 장에서는 MyBatis의 개념과 특징, 다운로드 및 사용 방법에 대해 살펴본다.
MyBatis 란?
MyBatis는 개발자가 지정한 SQL, 저장프로시저 그리고 몇가지 고급 매핑을 지원하는 퍼시스턴스 프레임워크이다.
MyBatis는 JDBC 코드와 수동으로 셋팅하는 파라미터와 결과 매핑을 제거한다.
MyBatis는 데이터베이스 레코드에 원시타입과 Map 인터페이스 그리고 자바 POJO 를 설정하고 매핑하기 위해 XML 과 애노테이션을 사용할 수 있다.
기존의 JDBC를 이용하여 프로그래밍하는 방식은 프로그램 소스 안에 SQL문을 작성하였지만, MyBatis를 이용하면 SQL문을 프로그램에서 분리하여 XML 파일에 별도로 작성한다. 따라서 프로그래머가 기존의 JDBC를 사용할 때 보다 프로그래밍하는 부담이 줄어들게 된다. 뿐만 아니라 SQL을 변경하고자 할 경우 기존처럼 프로그램을 수정하는 것이 아니라 XML 파일의 SQL문 만을 변경하면 되기 때문에 SQL 변환이 자유롭다는 특징이 있다.
다음은 MyBatis의 구조를 간단하게 표현한 그림이다.
Configuration 파일(SqlMapConfig.xml) : DB 설정과 트랜잭션 등 Mybatis가 동작하는 규칙을 정의.
매퍼(Mapper) : SQL을 XML에 정의한 매퍼 XML 파일과 SQL을 인터페이스의 메소드마다 애노테이션으로 정의한 매퍼 인터페이스를 의미.
매핑 구문(Mapped Statements) : 조회 결과를 자바 객체에 설정하는 규칙을 나타내는 결과 매핑과 SQL을 XML에 정의한 매핑 구문을 의미.
매핑 구문을 정의하는 방법은 애노테이션과 XML 방식 두 가지가 존재함.
사용자는 CRUD에 대한 각각의 SQL문은 SqlMap XML 파일에 작성하고 이 파일들을 SqlMapConfig XML 파일에 작성하면 MyBatis API를 통해 자동으로 Mapping된 Statement 객체들을 생성하여 이를 통해 DB에 SQL문을 실행하게 된다.
MyBatis는 현재 구글이 인수하였으며 홈페이지 주소는 다음과 같다.
http://blog.mybatis.org/http://mybatis.github.io/mybatis-3/
MyBatis에 대한 다양한 레퍼런스를 제공하며 한글 번역 페이지도 존재하고 있다.( http://mybatis.github.io/mybatis-3/ko/)
MyBatis 다운로드
MyBatis를 사용하기 위해서 Mybatis 관련 jar 파일이 필요하다.
이 jar 파일은 http://repo1.maven.org/maven2/org/mybatis/mybatis/3.2.8/ 페이지에서 다운로드 받을 수 있다.
mybatis-3.2.8.jar를 받아 eclipse에서 추가 해주면 되며 Maven을 사용한다면 다음의 구문을 pom.xml에 추가 해주면 된다.
Maven을 통하여 Library를 추가하는 방법은 부록2에서 상세히 설명 한다.
MyBatis와 iBatis의 차이
iBatis가 MyBatis로 변경되면서 버전만 변경된 것으로 생각했었으나(iBatis : ~ 2.3 MyBatis : 2.5 ~)
확인해보니 변경점이 많아져서 따로 페이지에 기술하게 되었다.
Java 요구 버전
iBatis에서는 JDK 1.4 이상에서 사용이 가능 하였으나, MyBatis에서는 JDK 1.5 이상을 요구 한다.(MyBatis 3.2 이상 버전은 JDK 1.6 이상을 요구한다.)
Package 내부 구조의 변경
iBatis : com.ibatis.*
MyBatis : org.apache.ibatis.*(이름은 변경되었지만 내부적으로는 여전히 iBatis를 사용하고 있다.)
SqlMap.xml 내부 구조의 변경
가장 큰 변경점은 parameterMap이 Deprecated된 점이라고 할 수 있다.
parameterMap을 사용하지 못하게 되며 기존 parameterMap을 사용하던 부분은 아래와 같이 parameterType에 정의하게 되었다.
사용 용어의 변경
SqlMapConfig -> Configuration
sqlMap -> mapper로 변경됨.
네임스페이스 방식의 변경
sqlMap 별로 줄여놓은 이름을 사용할 수 없게 되며 경로를 모두 명시해 주어야 함.
또한 iBatis에서는 namespace가 선택이었지만 MyBatis는 필수 항목이다.
MyBatis를 이용한 Sample 작성
MyBatis를 이용하여 SQL문을 처리하기 위해서는 Configuration XML 파일과 Mapper XML 파일을 작성해야 한다.
이 파일들은 프로그래머에게 JavaBean을 PreparedStatement의 파라미터와 ResultSet으로 쉽게 mapping 할 수 있도록 해준다.
본 장에서는 Configuration XML 파일, Mapper XML 파일을 작성하는 방법과 application에서 이 파일을 이용하여 실제로 SQL을 처리하는 방법에 대해 설명한다.
Sample 프로그램을 작성하는 보다 자세한 내용은 부록 부분을 참고하면 된다.
Mapper 파일 작성
Mapper XML 파일은 DB로 전송할 SQL 구문, PreparedStatement로 binding될 parameter의 mapping, ResultSet의 result의 mapping들을 명시하는 파일이다.
다음은 person 테이블에 CRUD를 처리하는 Mapper XML 파일을 작성한 예제이다. (UserMapper.xml)
<insert>, <update>, <delete>, <select> 태그에는 CRUD의 작업에 대한 각각의 SQL문을 정의한다.
각각의 태그에 대한 보다 자세한 설명은 http://mybatis.github.io/mybatis-3/ko/ 사이트를 참고하거나
첨부된 문서 MyBatis-3-User-Guide_ko.pdf 파일을 참고하면 된다.
Configuration 파일 작성
Configuration 파일은 DB 연결을 위한 dataSource, Mapper 파일의 경로, typeAliases의 설정 외 SqlMapClient를 제어할 property들을 작성하는 SQL Maps 설정파일이다.
다음은 Configuration 파일(mybatis-config.xml) 예제이다.
<properties> 태그에는 name=value 형태로 정의된 property들을 작성한 properties 파일의 경로 및 이름을 명시해주고, <settings> 태그에는 Configuration을 제어할 property들을, <transactionManager> 와<dataSource>에는 연결할 DB정보를 작성한다.
또, <mappers> 태그에는 미리 작성한 Mapper 파일들의 경로 및 이름을 작성한다.
다만 이전 iBatis와 다른 점은 iBatis에서 DB 설정을 한 개만 할 수 있었던 것에 비해서 MyBatis는 설정 파일에 여러 개의 DB를 설정하고 SqlSessionFactory 객체를 생성하는 시점에서 특정 DB를 설정할 수 있다.
각각의 태그에 대한 보다 자세한 설명은 http://mybatis.github.io/mybatis-3/ko/ 사이트를 참고하거나 첨부된 문서 MyBatis-3-User-Guide_ko.pdf 파일을 참고하면 된다.
Application 작성
Application에서 MyBatis에서 제공하는 SqlSession 객체의 instance를 이용하여 DB 테이블에 Mapping된 객체와 연동하여 CRUD 작업을 처리할 수 있다.
MyBatis를 이용하여 DB와 연동하기 위해서는 먼저 DB 연결에 대한 설정이 있는 Configuration 파일을 읽어 SqlSessionFactory 객체를 생성하고 해당 객체에서 SqlSession 객체를 얻어 Mapper에 매핑되는 쿼리를 처리하게 된다.
다음은 DB의 users 테이블에 데이터를 삽입, 변경, 삭제, 조회하는 application이다.
Application에서 연결을 얻어오는 부분은 별도의 Class로 분류 하였다.
예) altibase_mybatis_sidu의 SiduMain.java
먼저 Mapper 파일을 읽어 들여 SqlSessionFactory 객체를 생성하며 생성된 SqlSessionFactory 객체에서 SqlSession 객체를 생성 하며, Sample에서 SqlSession을 가져온 메소드는 다음과 같다.
"sqlSessionFactory.openSession(boolean arg0);" 해당 메소드의 Boolean 인자는 autocommit 모드를 결정하는 값이다.
( inputStream = Resources.getResourceAsStream("mybatis-config.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
sqlSession = sqlSessionFactory.openSession(false); )
이후 SqlSession 객체와 Mapper에 명명되어 있는 id를 가지고 CRUD 클래스의 각각의 메소드를 호출한다.
( String statement = "com.altibase.sidu.mapper.UserMapper.updateUserData";
sqlSession.update(statement, update); )
각각의 태그에 대한 보다 자세한 설명은 http://mybatis.github.io/mybatis-3/ko/ 사이트를 참고하거나 첨부된 문서 MyBatis-3-User-Guide_ko.pdf 파일을 참고하면 된다.
Altibase 연동
MyBatis에서 Altibase를 연동하는 위해서는 Altibase JDBC Driver를 Setting하고 Configuration 파일에 Altibase를 위한 dataSource를 지정하면 된다.
본 장에서는 Altibase JDBC Driver를 얻는 방법, JDBC Driver를 설정하는 방법, Configuration에 dataSource를 설정하는 방법에 대해 설명한다.
또한, Fail-Over 기능을 사용하는 방법, 여러 버전의 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 DB와 연동하거나, 또는 버전이 동일한 여러 대의 Altibase와 연동할 경우에는 $ALTIBASE_HOME/lib/Altibase.jar 파일을 사용하면 된다.
연동하려는 Altibase DB Server와 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를 추가할 수 있다.
프로젝트 – Properties – Java Build Path 메뉴로 이동하여 Add External JARS 메뉴를 통해 라이브러리를 등록 한다.
Configuration 파일에 DataSource를 설정하여 Altibase 연동
Configuration 파일의 <configuration> 태그에 Altibase용 property를 지정하여 Altibase와 연결하면 된다. 이 때 Configuration 파일에 직접 property 값을 입력할 수 있고, 또는 별도의 properties 파일을 작성하여 이 파일에 작성된 property값을 로딩하여 사용할 수 도 있다.
다음은 db.properties 라는 properties 파일에 Altibase에 대한 property들을 정의하고, 이 property들을 읽어와 Configuration 파일에서 사용하는 예제이다.
예) altibase_mybatis_sidu의 db.properties 파일
이 파일에 설정된 각각의 값의 의미는 다음과 같다.
Property | 설명 |
---|---|
driver | Altibase JDBC driver class Name |
URL | Altibase와 연결을 위한 Connection string정보 jdbc:Altibase://IP:port_no/db_name” 형태로 기입 |
username | 데이터베이스 계정 |
password | 데이터베이스 패스워드 |
예) altibase_mybatis_sidu의 mybatis-config.xml 파일
db.properties에 지정한 driver, url, username, password property들을 읽어와 dataSource의 JDBC.Driver, JDBC.ConnectionURL, JDBC.Username, JDBC.password property에 setting하고 있다.
위의 예제 SimpleConnection 프로젝트를 실행하기 위해서는 Altibase.jar, mybatis-3.2.8.jar 파일이 필요하다.
Fail-Over를 이용한 Connection
Altibase 5.3.3부터 Fail-Over를 지원하는데, Fail-Over 기능을 사용하기 위해서는 dataSource의 Connection url을 적어주는 부분에 Fail-Over 관련 속성을 넣어주면 된다.
다음은 Fail-Over를 이용하여 Altibase에 연결하는 예제이다. db.properties 파일에 Connection url 부분을 정의하였다.
위의 파일에 지정한 Connection url 부분에 정의할 수 있는 Fail-Over 관련 property는 다음과 같다.
Property | 설명 |
---|---|
AlternateServer | 장애 발생시 접속하게 될 가용 서버를 나타내며 (IP Address1:Port1, IP Address2:Port2,...) 형식으로 기술한다. |
ConnectionRetryCount | 가용 서버 접속 실패 시, 접속 시도 반복 횟수 |
ConnectionRetryDelay | 가용 서버 접속 실패 시, 다시 접속을 시도하기 전에 대기하는 시간(초 단위) |
LoadBalance | on으로 설정하면 최초 접속 시도 시에 기본 서버와 가용 서버를 포함하여 랜덤으로 선택한다. off로 설정하면 최초 접속 시도 시에 기본 서버에 접속하고, 접속에 실패하면 AlternateServer로 기술한 서버에 접속한다. |
SessionFailOver | STF(Service Time Fail-Over)를 할 것인지 여부를 나타낸다. |
Healthcheckduration | Failover가 발생한 서버가 다시 AlternativeServer |
Failover_source | Failover를 수행할 때, 서버에 전달하는 Failoversource에 대한 설명을 지정한다. 이 정보는 V$SESSION 성능 뷰의 FAILOVER_SOURCE 칼럼에 저장된다. |
위의 예제 FailOverSample 프로젝트를 실행하기 위해서는 “Configuration 파일에 dataSource를 설정하여 ALTIBASE와 연동”과 마찬가지로 Altibase.jar, ibatis-2.3.4.x.jar 파일이 필요하다.
Altibase5와 이전 버전을 동시에 Connection
Altibase v5부터는 하나의 어플리케이션에서 Altibase v6와 Altibase v5 혹은 Altibacse v4와 동시에 연결할 수 있도록 Altibase v5 전용의 JDBC Driver(Altibase5.jar)를 제공한다.
이 Driver를 이용하면 Altibase v6 – Altibacse v5, 혹은 Altibase v6 – Altibase v4, 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를 지정해야 한다.
MyBatis에 다른 버전의 Altibase와 연동하기 위해서는 각 버전에 해당하는 <environment> 태그를 작성하여 Application에서 <environment>의 id를 통해 DB 연결 시 각각의 설정을 읽어드리면 된다.
이 때 주의할 점은 프로그램에서 Altibase5.jdbc.driver.AltibaseDriver를 먼저 로딩한 후에 Altibase.jdbc.driver.AltibaseDriver를 로딩해야 한다는 것이다.
다음은 Altibase.jar와 Altibase5.jar 파일을 이용하여 두 버전의 ALTIBASE의 드라이버를 로딩하는 예제이다.
예) altibase_mybatis_MultiVersionConnection의 db.properties 파일
Altibase v6 버전에 대한 설정
예) altibase_mybatis_MultiVersionConnection의 db.properties 파일
Altibase v6 이전 버전에 대한 설정
Altibase v6 이전 버전에 대한 설정
예) altibase_mybatis_MultiVersionConnection의 MultiVersionConnectionMain.java파일
altibase_mybatis_MultiVersionConnection의 MultiVersionConnectionSelect.java
(public String MultiVersionConnectionDBVersionSelect(String conn_type))
위의 MultiVersionConnectionMain.java.java 예제를 보면 Altibase5.jdbc.driver.AltibaseDriver를 Altibase.jdbc.driver.AltibaseDriver보다 먼저 로딩하기 위해 Altibase v5 driver의 <environment> 태그의 id인 release를 인자 값으로 설정하고 있다. 위에서도 기술하였듯이 Altibase5.jdbc.driver.AltibaseDriver 드라이버를 먼저 로딩해야 한다.
예제에 포함된 MultiVersionConnection 프로젝트를 실행하기 위해서는 기존에 사용했던 mybatis.3.2.8.jar 파일 뿐만 아니라, Altibase.jar와 Altibase5.jar 파일이 더 필요하다. 이 파일들은 Altibase가 설치된 디렉토리($ALTIBASE_HOME)의 lib 디렉토리 안에 존재하는데 Altibase v5의 Altibase5.jar 파일, 그 이전 버전의 Altibase.jar 파일을 사용하면 된다.
- ALTIBASE 6.3.1 jar : Altibase.jar
- ALTIBASE 5.x.x.jar : Altibase5.jar
Procedure 호출
MyBatis에서 DB에 생성한 Stored Procedure을 호출할 경우에는 기본적인 DML 동작과 같이 Configuration 파일에 설정해주면 되며 다음의 항목을 아래와 같은 점에 주의하여 사용 하여야 한다.
- 기존 iBatis에서 사용하던 <procedure> 태그가 사라지고 statementType으로만 판단하므로 Procedure/Function 사용시에는 statementType을 필히 CALLABLE로 설정해야 함.
- 기존 ibatis에서 사용하던 <parameterMap>을 사용할 수 없다.
다음은 Stored Procedure의 Select 하는 예제이다.
예) altibase_mybatis_procedure의 Procedure 생성 구문
예) altibase_mybatis_procedure의 UserMapper.xml(Mapper) 파일
<select> 태그에 statementType의 속성을 CALLABLE로 지정하여 해당 요청이 Procedure/Function이라는 것을 명시하고 호출하는 Procedure/Function의 IN 파라미터에 대한 설정을 정의하며 resultType에 Bean 클래스를 지정함으로써 해당 procedure에 대한 결과를 Bean 클래스로 받아오게 된다.
이 때 Bean 클래스의 컬럼과 DB서 select하는 컬럼명을 동일하게 맞춰줘야 Bean 클래스에 결과가 리턴 된다.
altibase_mybatis_procedure 예제를 실행하기 위해서는 “Configuration 파일에 dataSource를 설정하여 ALTIBASE와 연동”과 마찬가지로 Altibase.jar, mybatis.3.2.8.jar 파일이 필요하다.
Function 호출
MyBatis에서 DB에 생성한 Function을 호출할 경우에는 기본적인 DML 동작과 같이 Configuration 파일에 설정해주면 되며 다음의 항목을 아래와 같은 점에 주의하여 사용 하여야 한다.
- 기존 iBatis에서 사용하던 <procedure> 태그가 사라지고 statementType으로만 판단하므로 Procedure/Function 사용시에는 statementType을 필히 CALLABLE로 설정해야 함.
- 기존 ibatis에서 사용하던 <parameterMap>을 사용할 수 없다.
다음은 단순한 덧셈 결과를 리턴하는 Stored Function 처리 예제이며 기본적인 것은 Stored Procedure와 동일하지만 에서 호출하는 부분이 약간 달라 따로 기술하게 되었다.
예) altibase_mybatis_procedure의 Function 생성 구문
예) altibase_mybatis_procedure의 UserMapper.xml(Mapper) 파일
기본적인 설정법은 Stored Procedure 방법과 동일 하지만 Mapper에서 Function을 호출하는 형식이 다르다.
Stored Procedure의 호출과의 차이점은 다음과 같다.
Function을 Mapper에서 호출 시에 위와 같은 형식을 지켜야 정상적인 Function Call이 가능하다.
altibase_mybatis_procedure 예제를 실행하기 위해서는 “Configuration 파일에 dataSource를 설정하여 ALTIBASE와 연동”과 마찬가지로 Altibase.jar, mybatis.3.2.8.jar 파일이 필요하다.
MyBatis, Spring, Altibase 연동
MyBatis, Spring을 Altibase와 연동하기 위해서는 Spring에 MyBatis 모듈을 이용하여 dataSource를 정의하고 Altibase와 연동해야 한다.
본 장은 Spring에 MyBatis 모듈을 이용하여 Altibase와 연결하는 방법을 설명 한다.
Spring에 MyBatis를 연동하여 dataSource를 설정
Spring과 MyBatis를 함께 사용하여 Altibase를 사용하기 위해서는 Spring의 설정 파일(applicationContext.xml)에 다음의 내역을 설정 한다.
- MyBatis 모듈을 이용한 SqlSessionFactory bean
- 트랜잭션에 대한 설정인 transactionManager
- DB에 대한 dataSource
- Mapper Bean 설정 : 연동 작업을 수행하려면 Mybatis와 Spring 연동 관련 모듈이 필요하며 모듈의 이름은 다음과 같다.
mybatis-spring-1.x.x.jar
mybatis-spring 연동모듈을 사용하려면 자바 1.5이상의 버전이 필요하고 MyBatis와 Spring은 각각 Version 별로 조금씩 다르다.
세부정보는 아래의 표를 참고하기 바란다.MyBatis Spring 연동모듈
MyBatis
Spring
1.0.0 그리고 1.0.1
3.0.1 에서 3.0.5까지
3.0.0 또는 그 이상
1.0.2
3.0.6
3.0.0 또는 그 이상
1.1.0 또는 그 이상
3.1.0 또는 그 이상
3.0.0 또는 그 이상
MyBatis와 Spring을 함께 사용하기 위해서는 Spring의 ApplicationContext.xml 파일에 MyBatis의 SqlSessionFactory bean 및 Mapper bean을 지정해 주면 된다.
Mapper bean은 실제 쿼리를 처리하는 메소드를 정의한 bean으로 Spring의 처리 방식인 Interface를 통하여 처리 하게 된다.
MyBatis, Spring을 연동한 환경에서 Spring에 dataSource를 설정하는 방법은『Altibase_Spring_연동가이드』문서에서 설명한 방법들 중 하나를 선택하여 SqlSessionFactory bean 및 TransactionManager bean의 dataSource property에 설정한 DB의 datasource명을 기술 하면 된다.
다음은 applicationContext.xml 파일에서 dataSource와 SqlSessionFactory bean, TransactionManager bean을 지정해주는 예제이다.
예) altibase_mybatis_spring의 ApplicationContext.xml 파일
해당 예제는 Spring Template Project를 기반으로 Maven을 사용하여 작성 하였다.
실제 사용자가 추가하는 library는 DB 접속 라이브러리(Altibase.jar), Mybatis 관련 라이브러리(mybatis-3.2.8.jar), Mybatis-Spring 연동 라이브러리(Mybatis-spring.1.2.1.jar)만 필요하며 Spring 관련 라이브러리는 Maven을 이용하여 처리한다.
(Spring Template Project에서 Spring MVC Project를 통해 작성하였으며 해당 모드로 작성시 생성되는 pom.xml 파일에 dependency 태그를 이용하여 자동으로 Library를 import 한다. 자세한 내용은 부록에 명시 한다.)
Connection Pool 설정 방법
Spring-Mybatis가 연동됨에 따라 dataSource를 설정하는 부분이 독립적으로 설정이 가능하게 된다. Spring 연동 없이 Mybatis에서만 다른 모듈의 Connection Pool를 사용할 수 없으며 Spring과 연동을 해야 다른 모듈의 Connection Pool를 사용할 수 있다는 것을 주의해야 한다.
아래 내역은 Connection Pool을 설정 하는 예제 이다.
예) altibase_mybatis_spring의 applicationContext.xml 파일
트랜잭션 관리
MyBatis에서 DB와 연동할 경우 Configuration 파일의 <environments> 의 DB별 <environment> 태그의 <transactionManager>에 dataSource를 지정하고 <environment>의 id를 가지고 SqlSessionFactory 객체를 통해 DB와 연결하며 이 때 auto-commit mode도 설정이 가능하다. Default는 autocommit 모드이다.
본 장에서는 이러한 트랜잭션 관리 방법들을 소개한다.
MyBatis에서 트랜잭션 관리
MyBatis에서 DB와 연동할 경우 iBatis에서 설정 파일 하나에 한 개의 DB를 설정할 수 있었던 것과 다르게 MyBatis는 DB 설정을 <environments> 태그로 여러 개의 DB를 설정할 수 있게 관리 한다.
MyBatis는 <environments> 내의 <environment> 태그 하나당 하나의 DB를 설정할 수 있으며 <environment> 태그의 <transactionManager>에 dataSource를 지정 하게 되며 어플리케이션에서 프로그래머가 직접 트랜잭션을 관리할 수 있다.
MyBatis에서는 트랜잭션 시작과 끝은 따로 존재하지 않으며 Configuration을 통해 SqlSessionFactory를 설정할 때 AutoCommit 모드 설정이 가능하다.
다음의 예제는 다중 DB를 하나의 Configuration 파일로 설정하는 예제이다.
예) altibase_mybatis_MultiVersionConnection의 mybatis-config.xml 파일
예) altibase_mybatis_MultiVersionConnection의 MybatisUtil.java 파일
위의 예제 altibase_mybatis_MultiVersionConnection 프로젝트를 실행하기 위해서는 “Configuration 파일에 dataSource를 설정하여 ALTIBASE와 연동”과 마찬가지로 Altibase.jar, mybatis-3.2.8.jar 파일이 필요하다.
MyBatis 연동 시 고려사항
Spring에서 Altibase에 연동할 경우 고려해야 할 사항에 대해 설명한다.
LOB 데이터 처리
iBatis에서는 LOB을 처리하기 위해서는 Mapper 파일에 parameter와 result에 대한 정보를 setting하는 부분에 반드시 jdbcType을 CLOB/BLOB이라고 명시를 해줘야 하며 parameterMap을 이용하여 처리 하였지만, Mybatis에서는 parameterMap이 deprecated 되었기 때문에 쿼리의 binding하는 컬럼에 jdbcType을 직접 명시 한다. 명시하지 않을 경우 LOB 데이터로 인식하지 않아 에러를 발생 하게 된다.
다음은 CLOB 타입의 데이터에 대한 parameterMap과 resultMap을 지정하여 setting하고 있는 예제이다.
예) altibase_mybatis_lob의 LobMapper.xml(Mapper) 파일
또한 LOB 처리 시 반드시 주의해야 할 사항은 Altibase에서 LOB 데이터를 처리하기 위해서는 반드시 autocommit 모드를 false로 바꾼 후 트랜잭션을 관리해줘야 한다는 것이다. iBATIS 연동 시 SqlMapConfig 파일의 <transactionManager>에 dataSource를 설정할 경우에는 내부적으로 setAutoCommit(false); 메소드를 호출하여 autocommit 모드를 false로 바꿔주기 때문에 LOB 처리 시 따로 고려할 사항은 없으나 MyBatis에서는 default가 true이기 때문에 Session을 얻어올 때 명시해 주어야 한다.
만약 autocommit 모드를 false로 변경해주지 않으면, “java.sql.SQLException: 0:LobLocator can not span the transaction 101858625.” 과 같은 에러가 발생한다.
그리고 LOB 데이터를 입력 시에도 “java.sql.SQLException: 0:LobLocator can not span the transaction 101858625.” 에러가 발생하게 된다.
다음의 예제는 MyBatis에서 Lob데이터를 처리하는 Sample의 일부이며 전체 소스는 부록에 첨부 하였다.
예) altibase_mybatis_lob의 LobMapper.xml 파일
위의 altibase_mybatis_lob 프로젝트를 실행하기 위해서는 Altibase.jar, mybatis-3.2.8.jar 파일이 필요 하다.
Insert 시 Insert Query가 중복되어 보내지는 현
문제가 나오는 현상 :
- MyBatis 설정 xml 내에서 'useGeneratedKeys' 설정을 true로 하면 위의 문제점 발생
- 위 설정은 아래와 같이 정의되어 있음 (http://mybatis.github.io/mybatis-3/ko/sqlmap-xml.html)
- 데이터베이스에서 내부적으로 생성한 키를 받는 JDBC getGeneratedKeys 메서드를 사용하도록 설정한다.
- default value : 'false'
- 이에 해당 설정을 false로 변경 후 발생하지 않음
- 기 설정은 Oracle과 informix 내에서는 오류가 발생하지 않음
부록 1(MyBatis-Altibase 연동)
Altibase_mybatis_sidu 예제를 바탕으로 MyBatis에서 ALTIBASE와 연동하는 방법에 대해 좀 더 자세하게 설명한다. 단, IDE는 Eclipse를 사용한다.
DB 테이블 및 시퀀스 생성
DB에 다음의 테이블과 시퀀스를 생성한다.
프로젝트 생성
Eclipse에서 altibase_mybatis_sidu 이라는 프로젝트를 생성한다.
1. 메뉴 – File – Java Project 클릭
2. Project name : 에 Altibase_mybatis_sidu 입력
3. Finish 버튼을 클릭
패키지 명명 규칙
부록에서 설명하고 있는 패키지 명은 기본적으로 com.altibase.sidu를 명명하여 사용하고 있는 데 이는 일반적으로 사용하는 패키지 분류 법칙을 가져와 적용한 것이며 각각의 성격은 다음과 같다.
- com : 첫번째 항목은 프로젝트를 이끄는 그룹의 성격을 결정하는 것으로 com은 company를 의미 한다. 만약 소규모 단체 등이라면 org(organization)를 사용할 것이다.
- altibase : 두번째 항목은 자사의 그룹 또는 사명을 정해주는 부분으로 보통 회사라면 회사명이, 특정 그룹이라면 그룹명이 들어간다. 현 문서는 Altibase에서 작성 하였으므로 altibase로 명명 하였다.
- sidu : 세 번째 항목은 실제 이 프로젝트의 artifact 구조를 의미 한다. 현재 Sample은 DML의 일반적인 명령(Select/Insert/Delete/Update)이므로 sidu로 명명 하였다.
Configuration 파일 작성
1. Altibase 연결을 위한 property들을 정의한 properties 파일(db.properties)을 작성한다.
( altibase_mybatis_sidu 프로젝트 – src 디렉토리에서 마우스 오른쪽 버튼 클릭하여 New – File을 클릭한다. File name: 에 db.properties을 작성한다.)
2. Configuration 파일(mybatis-config.xml)에 ALTIBASE와 연동을 위한 dataSource와 SqlMap 파일을 설정한다.
( altibase_mybatis_sidu 프로젝트 – src 디렉토리에서 마우스 오른쪽 버튼 클릭하여 New – File을 클릭한다. File name: 에 mybatis-config.xml을 작성한다.)
Mapper 파일 작성
Users 테이블의 CRUD SQL 구문과 mapping되는 method들을 정의한 Mapper 파일을 작성한다.(Person.xml)
Mapper는 com.altibase.sidu.mapper Package에 작성 하게 된다.
1. altibase_mybatis_sidu 프로젝트 – src 디렉토리에서 마우스 오른쪽 버튼 클릭후 New – Package을 클릭하여 com.altibase.sidu.mapper 라는 신규 패키지를 생성한다.
2. 생성된 신규 패키지(com.altibase.sidu.mapper)에서 마우스 오른쪽 버튼 클릭 후 New – File을 클릭하여 File name: 에 UserMapper.xml을 작성한다.
3. 다음의 내용을 UserMapper.xml에 작성 한다.
Application에서 Configuration의 insert, update, delete Method를 호출할 때 위의 파일에 정의되어 있는 <insert>, <update>, <delete>, <select> 태그에 정의되어 있는 id와 일치하는 SQL 문들이 자동으로 수행이 된다.
Application 작성
1. users 테이블에 대한 VO(Value Object)객체인 UserVO 클래스(UserVo.java)를 작성한다.
1-1. altibase_mybatis_sidu 프로젝트 – src 디렉토리에서 마우스 오른쪽 버튼 클릭 후 New – Class를 클릭 한다.
1-2. Package:에 com.altibase.sidu.model를 입력하고 Name: 에 UserVo를 입력한다.
1-3. 다음의 내용을 UserVo.java 파일에 작성 한다.
2. DB 연결 및 필요한 메소드를 포함하는 MyBatisUtil.java 클래스를 작성 한다.
2-1. altibase_mybatis_sidu 프로젝트 – src 디렉토리에서 마우스 오른쪽 버튼 클릭 후 New – Class를 클릭 한다.
2-2. Package:에 com.altibase.sidu.util을 입력하고 Name: 에 MybatisUtil을 입력 한다.
2-3. 다음의 내용을 MybatisUtil.java 파일에 작성 한다.
3. MybatisUtil 클래스로부터 SqlSession 객체를 받아 쿼리를 수행하는 클래스를 작성 한다. 예제에서는 DML 각각의 처리에 대한 클래스를 별도로 선언하여 처리 하였다. 해당 예제에서는 Select에 대한 예시만 설명 한다.
3.1 altibase_mybatis_sidu 프로젝트 – src 디렉토리에서 마우스 오른쪽 버튼 클릭 후 New – Class를 클릭 한다.
3.2 Package:에 com.altibase.sidu.application을 입력하고 Name: 에 SiduSampleSelect를 입력 한다.
3.3 다음의 내용을 SiduSampleSelect.java 파일에 작성 한다.
4.실제 프로그램이 수행되는 Main 클래스를 SiduMain.java 파일에 작성 한다.
관련 JAR 파일 추가
Altibase.jar와 mybatis-3.2.8.jar 파일을 추가한다.
altibase_mybatis_sidu 프로젝트에서 마우스 오른쪽 버튼 클릭하여 Properties를 클릭 – Java Build Path – Libraries 에서 Add External JARS를 클릭하여 Altibase.jar와 mybatis-3.2.8.jar 파일을 추가한다.
Application 실행
altibase_mybatis_sidu 프로젝트를 실행한다.
altibase_mybatis_sidu 프로젝트를 클릭한 후 메뉴에서 Run을 실행하거나 com.altibase.sidu.application 패키지의 SiduMain.java 클래스를 더블 클릭하여 파일을 연 후에 Run을 실행 한다.
부록 2(Spring-MyBatis-Altibase 연동)
altibase_mybatis_spring 예제를 바탕으로 Spring-MyBatis-ALTIBASE와 연동하는 방법에 대해 좀 더 자세하게 설명한다. 단, IDE는 Eclipse를 사용한다.
DB 테이블 및 시퀀스 생성
DB에 다음의 테이블과 시퀀스를 생성한다.
Spring 설치
Spring을 사용하려면 STS(STS, SpringSource Tools Suite)를 설치해야 한다.
STS란 이클립스에서 Spring으로 개발시에 편리하게 클립에서 스프링으로 개발할때 편리를 제공하는 플러그인으로 아래 목록 중 Eclipse의 Version에 맞게 설치 한다.
Maven 설치
iB
- Maven은 Apache Software Foundation에서 개발되고 있는 소프트웨어 프로젝트 관리 툴이다.
Maven은 Project Object Model(POM)이라는 것에 기초를 두어 프로젝트의 빌드, 테스트, 도큐멘테이션 등 프로젝트 라이프사이클 전체를 관리할 수 있는 툴이며 Spring-Mybatis-Altibase 연동 테스트 소스도 Maven을 적용 하여 관리하게 되었다.
해당 part는 Maven의 설치 과정을 설명한다.
1. Maven 파일 다운로드 - http://maven.apache.org/download.html 에서 binary zip 파일을 다운 받는다.
2014년 10월 현재 최신버전은 apache-maven-3.2.8-bin.zip)
2. 메이븐 환경 설정 - 압축을 해제한 후에 윈도우 환경변수(바탕화면->내컴퓨터->속성->고급->환경변수)에서 MAVEN_HOME(c:\maven)을 사용자 변수에 추가하고,
PATH 설정에 maven binary path를 포함 시킨다.
- 윈도우에서 시작 -> 실행 -> cmd 입력 후 도스 창 뜨면 mvn –version 입력하여 버전이 뜨면 OK
3. eclipse에서 maven 다운로드
- eclipse의 Help->Eclipse Marketplace를 클릭하여 STS를 다운받는 것과 같이 maven을 다운로드 받는다.
4. 압축을 해제한 maven을 eclipse에 설정 한다.
- windows -> preference -> Maven -> Installatios 아래 browse클릭하여 “C:\maven\conf\settings.xml”경로를 잡아주고 Apply.
프로젝트 생성
Eclipse에 STS를 설치하면 Spring Template Project의 Spring 기반 프로젝트가 생성이 가능하다. 다음의 단계를 거쳐 프로젝트를 생성 한다.
1. 메뉴–File-New-Spring Template Project를 클릭하여 Spring MVC Project를 생성
2. Project name : 에 altibase_mybatis_spring, top-level package에 com.altibase.test 입력(Spring은 프로젝트 생성시 default 패키지 명을 필수로 입력해야 한다.)
3. Finish 버튼을 클릭
패키지 명명 규칙
부록에서 설명하고 있는 패키지 명은 기본적으로 com.altibase.test를 명명하여 사용하고 있는 데 이는 일반적으로 사용하는 패키지 분류 법칙을 가져와 적용한 것이며 각각의 성격은 다음과 같다.
- com : 첫번째 항목은 프로젝트를 이끄는 그룹의 성격을 결정하는 것으로 com은 company를 의미 한다. 만약 소규모 단체 등이라면 org(organization)를 사용할 것이다.
- altibase : 두번째 항목은 자사의 그룹 또는 사명을 정해주는 부분으로 보통 회사라면 회사명이, 특정 그룹이라면 그룹명이 들어간다. 현 문서는 Altibase에서 작성 하였으므로 altibase로 명명 하였다.
- test : 세 번째 항목은 실제 이 프로젝트의 artifact 구조를 의미 한다. 현재 Samle은 DML의 일반적인 명령(Select/Insert/Delete/Update)이므로 test로 명명 하였다.
ApplicationContext 파일 작성
스프링 코드 작성에서 가장 먼저 해야 할 것은 AppilcationContext라고 불리는 스프링 빈 설정 파일을 작성 하는 것이다. 아래는 스프링 빈 설정 파일의 내역이다.
Mapper 파일 작성
Users 테이블의 CRUD SQL 구문과 mapping되는 method들을 정의한 Mapper 파일을 작성한다.
pring의 방식을 따라야 하기 때문에 의존적 주입(Dependency Injection) 방식을 사용하게 된다.(UserMapper.xml, UserMapper.java)
Mapper는 com.altibase.test.persistence Package에 작성 하게 된다.
1. altibase_mybatis_spring 프로젝트 – src 디렉토리에서 마우스 오른쪽 버튼 클릭후 New – Package을 클릭하여 com.altibase.test.persistence 라는 신규 패키지를 생성한다.
2. 생성했던 신규 패키지(com.altibase.test.persistence)에 마우스 오른쪽 버튼 클릭 후 New – Interface를 클릭하여 UserMapper.java 파일을 생성한다
3. 생성한 Interface 파일의 내용을 다음과 같이 작성 한다.
4. 생성된 신규 패키지(com.altibase.test.persistence)에서 마우스 오른쪽 버튼 클릭 후 New – File을 클릭하여 File name: 에 UserMapper.xml을 작성한다.
5. 다음의 내용을 UserMapper.xml에 작성 한다.
해당 방식은 Spring만의 방식으로 의존적 주입(Dependency Injection)의 방식으로 처리 하고 있다.
Application에서는 인터페이스에 정의되어 있는 메소드를 통하여 SQL 문을 처리한다.
Dependency Injection
Dependency Injection(줄여서 DI)는 직역하면 의존적 주입 이다.
Dependency Injection이란 Gof의 디자인 패턴에 있는 기법으로, 실제 사용자가 사용하게 될 메소드를 인터페이스로 지정하여 실제 로직과 분리하여 처리하는 기법이다.
이렇게 처리하게 되면 사용자는 인터페이스의 메소드만 이용 하더라도 구현부는 나중에 주입을 통해 해결하므로 획기적인 분업과 동시에 구현 클래스를 쉽게 교체할 수 있다는 장점을 얻게 된다.
Application 작성
1. users 테이블에 대한 VO(Value Object)객체인 UserVO 클래스(UserVo.java)를 작성한다.
1-1. altibase_mybatis_spring 프로젝트의 src/main/java 디렉토리에서 마우스 오른쪽 버튼 클릭 후 New – Class를 클릭 한다.
1-2. Package:에 com.altibase.test.domain을 입력하고 Name: 에 UserVo를 입력한다.
1-3. 다음의 내용을 UserVo.java 파일에 작성 한다.
2. 실제 쿼리를 수행하는 인터페이스 및 주입 클래스 파일을 작성 한다.
2-1. altibase_mybatis_spring 프로젝트의 src/main/java 디렉토리에서 마우스 오른쪽 버튼 클릭 후 New – Interface를 클릭 한다.
2-2. Package:에 com.altibase.test.service를 입력하고 Name: 에 UserService를 입력한다.
2-3. 다음의 내용을 UserService.java 파일에 작성 한다.
2-4. 생성했던 신규 패키지(com.altibase.test.service)에 마우스 오른쪽 버튼 클릭 후 New – Class를 클릭하여 실제 로직을 처리하는 UserServiceImpl.java Class 파일을 생성 한다.
2-5. 다음의 내용을 UserMapperImple.java 파일에 작성 한다.
3. 실제 프로그램이 수행되는 Main 클래스를 Main.java 파일에 작성 한다.
관련 JAR 파일 작성
Jar를 추가하는 방법은 두 가지 이다.
- Maven에 의한 라이브러리 추가
- 기존 방식대로(properties-Java Build Path의 Add External JARS)의 라이브러리 추가
샘플 소스는 Maven에 의한 라이브러리 관리 방법을 선택하여 작성 되었으며, 두 번째 방법인 기존 방식은 위에서도 설명한 바 있어 본 장에선 Maven에 의한 라이브러리 관리 방법을 설명 한다.
Maven을 설치 하여 Spring Template Project를 생성하면 pom.xml이라는 파일이 생성 되는데, 해당 파일이 라이브러리를 관리해 주는 파일 이다.
pom.xml 파일에서 library를 추가하는 방법은 두 가지이다.
- pom.xml 탭에서 태그를 직접 입력 하여 library 추가
- Dependencies 탭에서 Add 버튼으로 library 추가
태그를 직접 입력 하는 방법은, 위의 탭중 pom.xml 탭을 눌러 나타나는 xml 파일에 직접 입력하여 library를 추가 하는 방법이며 아래 화면과 같이 추가 한다.
(테스트에 사용한 library는 Apache common dbcp library 이다.)
추가한 후에 xml 파일을 저장하면 Maven Dependecies에 Library가 추가된 것을 확인할 수 있다.
Dependencies 탭에서 Add 버튼으로 library 추가하는 방법은 다음과 같은 단계를 거쳐 추가가 가능하다.
1) pom.xml 파일에서 dependencies-Add 버튼을 클릭하면 다음의 창이 뜨게 된다.
해당 창의 Enter groupId, artifactId or sha1 prefix or pattern : 칸에 추가하고 싶은 library의 이름을 입력하게 되면 아래와 같이 입력한 이름에 대한 라이브러리를 보여 준다.
2) Search Results에 나타난 Library를 클릭하면 해당 Library에 대한 버전이 나타나게 되고 필요한 버전을 클릭한 후 OK 버튼을 클릭하면 해당 Library가 추가 된다.
라이브러리가 추가된 것을 확인할 수 있다.
파일을 저장하면 변경된 내역이 반영되면서 Library가 추가 된다.
마지막에 Library가 추가된 것을 보면 commons-dbcp말고 commons-pool도 같이 추가가 되었는데, dependencies 탭을 통해 추가하게 되면 이와 같이 관련된 Library도 같이 추가해 준다.
Application 실행
altibase_mybatis_spring 프로젝트를 실행한다.
altibase_mybatis_spring 프로젝트를 클릭한 후 메뉴에서 Run을 실행하거나 com.altibase.test 패키지의 Main.java 클래스를 더블 클릭하여 파일을 연 후에 Run을 실행 한다.