[Spring] iBatis 1

2020. 6. 10. 17:25 Spring Framework/Spring Core

iBatis 1


iBatis는 자바오브젝트와 SQL문 사이의 자동 매핑 기능을 지원하는 ORM 프레임워크이다.

iBatis는 코드 내에서 자바오브젝트만을 이용해 데이터 로직을 작성할 수 있게 해주고, SQL을 별도의 파일로 분리해서 관리하게 해주며, 오브젝트-SQL 사이의 파라미터 매핑 작업을 자동으로 해주기 때문에 많은 인기를 얻고 있는 기술이다.

→ JDBC 코드 작성의 불편함을 제거해주고, 도메인 오브젝트나 DTO를 중심으로 개발이 가능하다는 장점이 있다. iBatis의 가장 큰 특징은 SQL을 자바 코드에서 분리해서 별도의 XML 파일 안에 작성하고 관리할 수 있다는 점이다.

XML에 담긴 SQL과 자바오브젝트 사이의 매핑은 이름 치환자와 빈 프로퍼티 사이의 매핑을 이용한다.

스프링 DataSource 빈 사용, 스프링 트랜잭션 적용, 예외 자동변환, 템플릿/콜백 스타일의 템플릿, SqlMapClient 팩토리 빈 등을 지원한다.


1. Spring과 iBatis의 연동 


(1) Dependency 설정

ibatis와 spring-orm의 dependency 설정을 pom.xml 에서 확인한다.

ibatis 버전이 2.3.4.726 인지 확인한다.

pom.xml

<dependency>

   <oupId>org.apache.ibatis</groupId>

   <artifactId>ibatis-sqlmap</artifactId>

   <version>2.3.4.726</version>

</dependency>

<dependency>

    <groupId>org.springframework</groupId>

    <artifactId>spring-orm</artifactId>

    <version>${spring-core-version}</version>

</dependency>


(2) Spring datasource 설정

/spring/applicationContext-datasource.xml

<!-- Apache Commons DBCP DataSource -->

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">

    <property name="driverClassName" value="${JDBC.Driver}"/>

    <property name="url" value="${JDBC.ConnectionURL}"/>

    <property name="username" value="${JDBC.Username}"/>

    <property name="password" value="${JDBC.Password}"/>

    <property name="maxActive" value="15" />

    <property name="initialSize" value="15" />

    <property name="maxIdle" value="15" />

    <property name="minIdle" value="15" />

    <property name="testOnBorrow" value="false" />

    <property name="validationQuery" value="select 1" />

    <property name="timeBetweenEvictionRunsMillis" value="10000" />

    <property name="testWhileIdle" value="true" />  

    <property name="numTestsPerEvictionRun" value="3" />        

    <property name="minEvictableIdleTimeMillis" value="-1" />

</bean>


(3) sqlMapConfig, sqlMap XML 파일 설정

sqlMapConfig, sqlMap XML 파일을 생성한다.


1) sqlMapConfig.xml

cp.) 설정파일 역할: 설정파일에는 데이터소스, 트랜잭션 매니저, 매핑 리소스 파일 목록, 프로퍼티, 타입 별칭과 핸들러, 오브젝트 팩토리와 설정 프로퍼티 값을 넣을 수 있다.

resources/datasource/sqlMapConfig.xml 파일로 생성한 예이다.

/datasource/sqlMapConfig.xml

<?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>

<settings

cacheModelsEnabled="true"

enhancementEnabled="true"

lazyLoadingEnabled="true"

useStatementNamespaces="true"

/>

// 매핑정보를 담은 파일의 클래스패스를 지정한다. 매핑파일마다 <sqlMap> 태그를 추가하면된다.

<sqlMap resource="sqlmap/Emp.xml"/> 

</sqlMapConfig>


2) sqlMap.xml

cp.) 매핑파일 역할: 매핑의 목적--> DB의 데이터인 SQL문(DB의 테이블)을 자바의 객체(클래스)로 전환하는 것이 주목적이다.

SQL-오브젝트 사이의 매핑정보는 XML 파일로 만들어두면 된다. 매핑정보에는 사용할 SQL문과 SQL 파라미터, 실행 결과를 어떻게 자바오브젝트로 변환하는지가 담겨 있다.

sqlMap.xml 파일에 아래와 같이 SELECT, INSERT 문장을 작성한다.

/src/main/resources/sqlmap/sqlMap.xml

<?xml version="1.0" encoding="UTF-8" standalone="no"?>

<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd">

<sqlMap namespace="emp">

   <typeAlias alias="emp" type="com.spring.mvc.emp.model.Emp"/>  

  <select id="selectEmpList" resultClass="emp" >

SELECT empno, ename, job, sal, NVL(mgr,0) mgr, hiredate

FROM  emp

  </select>      

  <insert id="insertEmp"  parameterClass="emp"  >

      INSERT INTO emp (empno, ename, job, sal, mgr,  hiredate, deptno)

        VALUES (#empno#, #ename#, #job#, #sal#, 0, #hiredate#, #deptno#)

    </insert> 

</sqlMap>

테이블의 컬럼 이름과 매핑할 오브젝트의 프로퍼티 이름이 일치하면 특별한 매핑정보 없이도 자동으로 파라미터와 결과의 전환이 가능하다. 이름이 일치하지 않은 경우라면 컬럼-프로퍼티 사이의 매핑정보를 추가해주면 된다.


(4) sqlMapClient 설정

applicationContext-datasource.xml 파일에 sqlMapClient 아이디로 SqlMapClientFactoryBean 빈을 등록한다.

sqlMapClient 등록시 dataSource와 sqlMapConfig XML 파일의 의존성주입을 추가한다.

CLOB 데이터 타입을 사용하기 위해서는 DefaultLobHandler의 의존성 주입을 추가해야 한다.


cp.) iBatis의 핵심 API는 SqlMapClient 인터페이스에 담겨 있다. JDBC가 Connection, statement, ResultSet을 생성해 사용하듯이 iBatis를 이용하려면 이 SqlMapCilent를 구현한 오브젝트가 필요하다. 

SqlMapClient는 SqlMapCilentBuilder를 이용해 코드에서 생성할 수 있다. 

하지만 스프링에서는 SqlMapClient를 빈으로 등록해주는 팩토리 빈의 도움이 필요하다. 스프링이 제공하는 SqlMapClient용 팩토리 빈은 SqlMapClientFactoryBean이다. 

이 빈을 이용해서 DAO에서 사용할 SqlMapClient를 빈으로 등록해줘야 한다.


cp.) DAO가 iBatis 기능을 사용하려면 SqlMapClient가 필요하다. JDBC의 Connection처럼 모든 데이터 액세스 작업에서 필요로 하는 오브젝트이다. 스프링에서는 SqlMapClient를 싱글톤으로 등록해서 DAO에서 DI 받아 사용할 수 있다. SqlMapClient는 멀티스레드에서 공유해서 사용해도 안전한 오브젝트이다. SqlMapClient의 구현 클래스를 직접 빈으로 등록하는 대신 다음과 같이 SqlMapClientFactoryBean을 이용해 팩토리 빈이 생성해줘야 한다. 필요한 프로퍼티는 

Datasource와 앞에서 만들어둔 설정파일의 위치다.

/spring/applicationContext-datasource.xml

<!-- SqlMap setup for iBATIS Database Layer -->

<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">

    <property name="configLocation" value="classpath:datasource/sql-map-config.xml"/>

    <property name="dataSource" ref="defaultDataSource" />

    <property name="lobHandler" ref="lobHandler"/>

</bean>


/filter/build-local.filter

JDBC.Driver=oracle.jdbc.driver.OracleDriver

JDBC.ConnectionURL=jdbc:oracle:thin:@127.0.0.1:1521:ORCL

JDBC.Username=scott

JDBC.Password=tiger



출처: https://devbox.tistory.com/entry/Spring-iBatis-1?category=574587 [장인개발자를 꿈꾸는 :: 기록하는 공간]