MyBatis 주요 변경점

본 가이드는 MyBatis와 iBatis의 차이점을 설명한다.

변경된 용어(종합)

iBatis MyBatis 비고
com.ibatis.* org.apache.ibatis.* 패키지 구조 변경
SqlMapConfig Configration 용어변경
sqlMap mapper 용어변경
sqlMapClient sqlSession 구문대체
rowHandler resultHandler 구문대체
resultHandler SqlSessionFactory 구문대체
parameterMap, parameterClass parameterType 속성 통합
resultClass resultType 용어변경
#var# #{var} 구문대체
$var$ ${var} 구문대체
<isEqual> , <isNull> <if> 구문대체

변경사항

패키지 구조 변경

iBatis MyBatis
com.ibatis.* org.apache.ibatis.*

패키지 구조는 변경되었으나 기존에 iBatis 패키지명은 그대로 사용한다.

MyBatis library 별도 제공

Maven Dependency Information 예시

<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.2.2</version>
</dependency>

<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>1.2.0</version>
</dependency>

annotation 도입

  • annotation 을 적극 도입하여 DAO 에 대해서 행하던 sqlMapClient DI 설정을 안해도 된다.
  • spring 2.5 대 부터 annotation 이 도입되어서 설정이 매우 간편해진 것 처럼 무척 간편해졌다.
  • bean id sqlSessionFactory, sqlSessionTemplate 만 지정하면 된다.

rowHandler 대체

  • xml 및 대량 데이터 처리를 위해 사용하였던 rowHandler가 삭제되었다.
  • sqlMapClient 가 없어지고 sqlSession 으로 대체 되었는데, sqlSession 의 API 를 살펴보니 large data 처리용 method 를 제공한다.
  • rowHandler 가 resultHandler 로 바뀌었다.
  • 큰 변화중 하나는 자바 애노테이션을 사용해서 xml을 사용하지 않고 모든것을 자바로만 할 수 있게 되었다. 물론 Configration.xml 도 자바에서 직접 DataSource, Environment 등을 선언해서 클래스화 시킬수 있다.
  • 주의할점은 xml로 Configure를 만들고 환경변수와 property를 클래스로도 만들었다면, 클래스쪽이 나중에 읽어지게 되서 xml로 되어있는 세팅이 자바 클래스에서 선언해놓은것으로 덮어써지게 된다. 혼란을 줄수 있으니 한가지 방법만으로 프로젝트를 구성하는것이 좋을것이다.
  • Configuration configuration = new Con…. 형식으로 선언을 하고 나서는 mapper도 xml이 아니고 configuration.addMapper(UserMapper.class) 형식으로 추가 해야 하기 때문에 어느쪽으로 할것인지 확실하게 결정을 하고 나서 진행해야 한다.

네임스페이스 방식 변경

  • sqlMap 파일별로 줄여놓은 이름을 사용했다면 이제 풀경로로 사용하게 된다.(공식 설명서에서는 혼란을 줄이고 어떤것이 호출되는지 정확하게 알수 있으니 좋다라고 기재)
iBatis MyBatis
<sqlMap namespace=“User”> <mapper namespace=“myBatis.mapper.UserMapper”>

실제 자바쪽에서 호출할때도 길게 호출하여야 한다.

list = session.selectList("myBatis.mappers.UserMapper.getUserList");

이런 경우에 위에서 이야기한 자바 애노테이션 (@Select)을 사용해서 mapper 파일을 xml이 아니고 자바로 만들어놓으면 코드힌트까지 사용해서 편하게 쓸 수 있다.

UserMapper mapper = session.getMapper(UserMapper.class);

list = mapper.selectUserList();

변경되거나 추가된 속성들

기존에 조건에 따라 변하는 쿼리를 만들기 위해서 사용되던 태그들이 변경되었다. 조금더 직관적으로 바뀌었고 해당상황(Update, Select)등에 맞춰서 사용할 수 있는 태그들도 추가되었다.

  • parameterMap은 더이상 사용하지 않게 되었다. parameterMap과 parameterClass 대신 parameterType 하나로 사용한다.
  • resultMap은 여전히 남아있지만 resultClass 는 resultType 으로 변경되었다.
  • parameterType과 resultType에는 기본형(int, byte, …. )부터 클래스 명까지 기존처럼 사용할 수 있다.
  • 기존에 procedure를 호출하기 위해 사용하던 <procedure>가 사라지고 statementType 속성이 생겼다. PREPARED, STATEMENT, CALLABLE 중에 하나를 선택할 수 있고 기본값은 PREPARED이다.
  • 파라미터를 매핑하기위해서 사용하던 #var# 형태는 #{var} 로 바뀌었다. $var$ 역시 ${var} 형태로 사용하면 된다.

참고) #{var}와 ${var}의 차이는 prepredStatement의 파라미터로 사용, String 값으로 사용.
order by 같은 경우에 사용하기 위해서는 order by ${orderParam} 처럼 사용해야 한다.
이 방법을 사용하는 경우 MyBatis가 자체적으로 쿼리의 적합성여부를 판단할 수 없기 때문에 사용자의 입력값을 그대로 사용하는 것보다는 개발자가 미리 정해놓은 값 등으로 변경하도록 해서 정확한 값이 들어올 수 있도록 해야 한다.

sqlMap쪽에서 사용하던 typeAlias가 sqlMap이 바뀐 mapper 에서 사용되지 않고 Configration 파일에서 정의하도록 변경되었다.

<typeAliases>
    <typeAlias type="vo.UserVO" alias="User"/>
</typeAliases>

Configration 파일에 위의 형식처럼 Aliase를 정의하면 전체 mapper 에서 사용할 수 있다.

Dynamic Statement의 변화

  • <isEqual> , <isNull> 등의 구문이 <if>로 통합되었다.

<if test=“userID != null”> 형태로 간단하게 사용할 수 있다.
<dynamic> 형태로 해서 where 조건절이나 and , or 를 동적으로 만들던것이 <where>나 update에서 사용할 수 있는 <set> 등으로 변경되었다.

<select id="getUserList" resultType="User>
    SELECT * FROM TR_USER
        <where>
            <if test="isAdmin != null">
                authLevel = '1'
             </if>
          </where>
</select>
  • trim, foreach 태그가 새로 추가

1) trim은 쿼리를 동적생성할때에 쿼리를 연결하기 위해서 컴마(,)를 사용한경우 마지막항목이 조건을 만족하지 못해서 생성된 쿼리 끝에 컴마가 붙어있다던가 하는 경우에 잘라낼 수 있다.
2) foreach는 반복적인 항목을 동적으로 넣을때 사용할 수 있다. ( ex. where 조건절에서 in 을 사용하는 경우)

참고자료

 
egovframework/rte2/psl/dataaccess/ibatis_vs_mybatis.txt · 마지막 수정: 2015/04/14 11:24 (외부 편집기)
 
이 위키의 내용은 다음의 라이센스에 따릅니다 :CC Attribution-Noncommercial-Share Alike 3.0 Unported
전자정부 표준프레임워크 라이센스(바로가기)

전자정부 표준프레임워크 활용의 안정성 보장을 위해 위험성을 지속적으로 모니터링하고 있으나, 오픈소스의 특성상 문제가 발생할 수 있습니다.
전자정부 표준프레임워크는 Apache 2.0 라이선스를 따르고 있는 오픈소스 프로그램입니다. Apache 2.0 라이선스에 따라 표준프레임워크를 활용하여 발생된 업무중단, 컴퓨터 고장 또는 오동작으로 인한 손해 등에 대해서 책임이 없습니다.
Recent changes RSS feed CC Attribution-Noncommercial-Share Alike 3.0 Unported Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki