본문 바로가기

IT/Spring + iBatis

2013.04.12. iBatis



2013.04.12. iBatis


iBatis란?

- BL과 PL을 총체적으로 관리해주는 SpringFramework의 영역과 Database의 영역 간의 작업을 조율하는 Framework.

- SpringFramework와는 용도 자체가 다르며, Database와 그 안의 데이터로의 접근을 손쉽게 하는데에 목적이 있음.

   (이러한 Framework를 통칭 Object Relational Mapping이라 하며, 예로 Hibernate 등)


iBatis의 특징 input / output

1. 쿼리문의 실행결과를 JavaBeans 혹은 Map객체에 매핑.

2. SQL을 프로그램 내의 소스코드가 아닌 XML파일로 따로 분리해 관리하도록 지원해줌.

3. /WEB-INF/sqlmap-config.xml파일을 기본설정으로 사용하며, sqlMap파일을 include하는 형식으로 작동.

iBatis 설정파일 (xml파일 기반)

SqlMapConfig.xml


SqlMapClient객체 Important!

- MapStatement를 호출할 수 있는 SqlMapConfig객체를 Java객체화한 객체.

- 이를 통해 각 MapStatement별 메서드로 SQL문을 실행할 수 있기 때문에 iBatis 구동의 핵심이 된다.

- Reader를 생성하여 실제 SqlMapConfig파일의 경로를 담아준 다음, 이를 SqlMapClient객체의

  .SqlMapClientBuilder.buildSqlMapClient()메서드에 인자로 넣어줌으로써 SqlMapClient객체의 초기화를 완료한다.


SqlMaps와 MapStatement

- <select>, <insert>, <update>, <delete> : 각 태그당 하나의 쿼리문을 가지며, id값으로서 호출할 수 있다.

    < input / output 타입 >

    parameterClass – 데이터를 가진 객체를 인자로 투입 가능하며, <typeAlias>태그로 POJO객체를 정의해야 사용가능하다.

    parameterMap – Sql문의 input을 ‘?’로 동적으로 할당할 경우, <parameterMap>태그로 정의해야 사용가능하다.

    resultClass – 객체의 필드명과 테이블의 칼럼명이 같을 경우, MapStatement의 리턴값을 객체로 바로 가져올 수 있다.

    resultMap – 객체의 필드명과 테이블의 칼럼명이 다를 경우, 데이터값이 삽입될 경로를 매핑해주는 작업이 필요하다.


동적쿼리문과 관련된 태그들

 <dynamic>

  prepend=“aa”

  open=“(”, close=“)”

  body의 내용이 존재할 경우, aa를 동적쿼리문 시작 전에 붙여줌.

  body의 내용이 존재할 경우, 내용의 시작과 끝을 ‘( )’로 묶어줌.

 <iterate>

  property=“bb”

  conjunction=“or”

  open=“(”, close=“)”

  bb에는 배열 또는 Collection객체만 들어감. 인덱스만큼 반복.

  각 반복구문의 사이마다 ‘or’를 삽입해줌.

  <dynamic>의 open / close와 동일.

 <isEqual>

  property=“cc”

  compareValue=“dd”

  비교를 원하는 기준데이터값을 입력.

 기준데이터값과 비교할 대상데이터값을 입력. cc=dd일 때 body의 내용 실행


동적쿼리문의 적용 (게시판 검색 적용)

1) POJO객체 활용

    ① 검색조건(checkbox)을 나타내는 String배열과 검색어를 나타내는 String값을 필드로 가지는 POJO객체를 생성. (ex:search)

    ② POJO객체에 검색조건과 검색어를 set메서드를 통해 할당해준 후, BoardDao메서드를 경유하여 SqlMaps파일에 넘겨줌.

    ③ Sql문에서 parameterClass=“search”로 받되, 반드시 <typeAlias>태그로 POJO객체를 정의해야 적용이 가능하다.

    ④ <iterate>태그의 property속성에 검색조건을 나타내는 배열을 할당, 인덱스만큼 Sql문이 반복생성되게 한다.

        이때 검색조건으로서 할당된 배열은 Sql문 내에서 변수가 아닌 상수로서 표현되어야 하므로, ##이 아닌 $$를 사용한다.


2) Map객체 활용

    ① 검색조건(checkbox, 배열)의 경우의 수에 따라 검색조건을 나타내는 String값과 검색어를 나타내는 String값을 선언.

    ② Map객체를 생성하여 두 String값의 데이터를 각각의 Key와 Value로써 저장한다.

    ③ BoardDao객체의 메서드를 경유하여 SqlMaps파일에 바로 Map객체를 넘겨주되,

        XML파일에서 Map객체를 인식하지 parameterClass를 “java.util.Map”로 표시하여 넘겨준다.

    ④ 속성값의 동일유무를 판별해주는 <isEqual>태그를 활용, Java코드에서의 if문의 적용과 같은 방식으로

        property에 기준값과 compareValue에 비교값을 넣어 동적쿼리문이 개별적으로 적용될 환경을 구분해준다.