by-nc-sa     개발자, DBA가 함께 만들어가는 구루비 지식창고!

iBatis 구성요소의 이해




iBatis 구성요소의 이해

1. SqlMapConfig 파일

1.1 SqlMapConfig.xml

  • 쓰레드, Cache, 데이터소스 등의 iBatis 환경설정을 담당하는 파일이다.
  • settings 태그를 이용하여 환경 설정을 한다.
  • sqlMap 태그를 이용하여 개발자가 작성하는 SQLMap 파일을 지정한다.
SqlMapConfig.xml 예
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMapConfig PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
    "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">

<sqlMapConfig>
	<settings
		cacheModelsEnabled="true"
		enhancementEnabled="true"
		lazyLoadingEnabled="true"
		useStatementNamespaces="true"
	/>
	
	<typeAlias alias="emp" type="com.oracleclub.study.mvc.model.Emp"/>
	
	<sqlMap resource="sqlmap/CacheModel.xml"/>	 
	<sqlMap resource="sqlmap/Emp.xml"/> 
		
</sqlMapConfig>  

1.2 SqlMapConfig 설명

1.2.1 <settings />
  • iBatis의 환경설정 부분이다.
  • settings 속성
    속성 설 명 사용 예
    cacheModelsEnabled SqlMapClient의 캐쉬모델을 설정 한다. cacheModelsEnabled="true"
    Default: true (enabled)
    lazyLoadingEnabled SqlMapClient의 모든 늦은(lazy)로딩을 설정한다. lazyLoadingEnabled="true"
    Default: true (enabled)
    enhancementEnabled CGLIB에 최적화된 클래스를 통해 향상된 늦은(lazy)로딩사용여부를 선택한다. enhancementEnabled="true"
    Default: false (disabled)
    useStatementNamespaces SQLMap XML 파일에서 namespace를 사용할 수 있다.
    <sqlMap namespace="article">
    useStatementNamespaces="true"
    Default: false (disabled)
1.2.2 typeAlias
  • 클래스를 별칭으로 사용 할 수 있게 해준다.
  • <typeAlias alias="emp" type="com.spring.common.model.Emp"/>
  • emp 라는 별칭으로 sqlMap XML 파일에서 사용 할 수 있다.
1.2.3 sqlMap
  • 개발자가 작성한 SQL문장이 기록되는 XML 파일의 경로를 지정한다.
  • classes 상의 위치를 지정하면 된다.

2. Sql Map XML 파일

2.1 Sql Map XML 파일

  • 개발자가 작성하는 실제 비즈니스 로직의 SQL 문장이 저장되는 파일이다.
  • 아래는 Sql Map XML파일의 예이다.
SqlMap XML 예
 
<?xml version="1.0" encoding="UTF-8" ?>

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

<sqlMap namespace="emp">

<select id="selectEmpList" resultClass="emp" parameterClass="int" cacheModel="cachemodel.empCache" >
	SELECT empno, ename, job, sal, mgr
	  FROM  emp  
	<isGreaterThan   compareValue="0">
	 WHERE deptno = #deptno#
	</isGreaterThan>
</select>
 	
<insert id="insertEmp"  parameterClass="emp"  >
   INSERT INTO emp (empno, ename, job, sal, mgr,  hiredate, deptno)
   VALUES (#empno#, #ename#, #job#, #sal#, 0, SYSDATE, #deptno#) 
</insert> 

</sqlMap>

2.2 Sql Map XML Statement설명

  • Statement 속성
    Statement 속 성 설 명
    <statement> id
    parameterClass
    resultClass
    parameterMap
    resultMap
    cacheModel
    모든 쿼리 구문 사용
    <insert> id
    parameterClass
    parameterMap
    데이터 입력
    <update> id
    parameterClass
    parameterMap
    데이터 수정
    <delete> id
    parameterClass
    parameterMap
    데이터 삭제
    <select> id
    parameterClass
    resultClass
    parameterMap
    resultMap
    cacheModel
    데이터 조회
    <procedure> id
    parameterClass
    resultClass
    parameterMap
    resultMap
    저장 프로시저 호출

2.3 #과 $의 차이

2.3.1 # (#empno#)
  • PreparedStatement 형태로 파싱되어 다이나믹 SQL 로 생성됨
  • SQL Injection에 안전하며, 성능상으로 유리 (권장)
2.3.2 $ ($empno$)
  • $는 단순히 문자열 치환이 되는 형태
  • Static SQL로 생성됨
  • SQL Injection 공격에 노출 됨(위험)
  • DB 성능문제 발생, 가능한 사용하지 말 것
#과 $의 차이
# 예
  SELECT * FROM emp WHERE empno = #empno#
  →  SELECT * FROM emp WHERE empno = ?
empno 파라미터 값이 바뀌어도 DB에서는 하나의 SQL 문장으로 처리


$ 예 (보안 및 성능문제가 있기 때문에 절대 사용하지 말 것
   SELECT * FROM emp WHERE empno = $empno$
→ SELECT * FROM emp WHERE empno = 1024
empno 파라미터 값이 바뀔 때 마다 DB에서는 서로 다른 SQL 문장으로 처리

2.4 SQL 문 작성시 조건문(<, >) 사용 문제

  • &lt ; &gt ; 로 바꾸거나 (비권장)
  • <![CDATA[STUDY: 쿼리]]> 로 감싸준다 (권장)

3. SqlMapClient API

  • iBatis에서는 SqlMapClient API를 이용해서 SQL문을 수행 할 수 있다.
  • SqlMapClient클래스에서 SQL statement를 수행하기 위한 API를 제공한다.
API 설 명
insert() insert 쿼리
update() update 쿼리
delete() delete 쿼리
queryForObject() select 쿼리 1개 결과 반환, object형
queryForMap() select 쿼리 1개 결과 반환, map형
queryForList() select 쿼리 1개 이상 row 반환
flushDataCache() 캐쉬된 데이터 삭제
startTransaction() transaction 시작
commitTransaction() transaction 커밋
endTransaction() transaction 종료

문서정보

Enter labels to add to this page:
Please wait 
Looking for a label? Just start typing.