PostIT

[Spring/MyBatis]스프링 프레임워크 활용한 Mapper 작성 - iBatis와 MyBatis / Annotation과 XML의 차이 본문

Spring/Config

[Spring/MyBatis]스프링 프레임워크 활용한 Mapper 작성 - iBatis와 MyBatis / Annotation과 XML의 차이

shun10114 2016. 8. 27. 22:33

개발 면접을 보면서 Spring 2.0버전에 iBatis를 연결하는 프로젝트를 시험보게 되었다.

Service, Dao, Impl,  Mapper, Mapper.xml 등 5번의 절차를 통해 DB에 접속하게 되었다.
DB도 한번도 사용해보지 못한 Postgre디비를 사용하여 너무 힘이들었다.

면접은 당연히 기술면접이기에 못한것에 대한 불만은 없지만,
이해를 하고 작동시키는 것에서 계속 에러가 나서 멘붕이 왔었다.
그래서 집에와서 Annotation의 환경에서 개발하는 것이 너무나 편하다는 것에 감사하며,
이를 정부 프레임워크에 맞춘 스프링 구조로 바꾸는 것을 학원에서 한 번 한것이 아니라 
직접 한 번은 하고 가야겠다는 생각을 하게 되었다.

그러면서 iBatis와 MyBatis 그리고 스프링에 대한 이해를 좀 할 수 있게 되었으며 
하나씩 코딩하면서 여러가지 찾고 읽어보며 도움을 받고 있다.

먼저, iBatis와 MyBatis의 차이를 이해해보려고 한다.

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에 정의하게 되었다.


ex)
<insert id="insertBlobData" parameterType="LobVo">
insert into test_blob(user_no, user_name, blob_data, clob_data, reg_date)
values(#{userNo}, #{userName}, #{blobData,jdbcType=BLOB}, #{clobData,jdbcType=CLOB}, #{regDate})
</insert>

사용 용어의 변경

SqlMapConfig -> Configuration
sqlMap -> mapper로 변경됨.

네임스페이스 방식의 변경

sqlMap 별로 줄여놓은 이름을 사용할 수 없게 되며 경로를 모두 명시해 주어야 함.
또한 iBatis에서는 namespace가 선택이었지만 MyBatis는 필수 항목이다.


Ex)
iBatis : <sqlMap namespace="Lob">
MyBatis : <mapper namespace="com.altibase.sample.mapper.LobMapper">


참조 :  http://aid.altibase.com/pages/viewpage.action?pageId=7340858



1. Xml로 작성하였을 시, ParameterType, resultSet 등을 지정해주어야 한다.

<resultMap id="userMap" type="com.shun.user.dao.UserVO">

    <id property="account" column="account" />

        <result property="pwd" column="pwd" />

        <result property="regdate"       column="regdate" />

        <result property="grade"       column="grade" />

    </resultMap>

<insert id="userInsert" parameterMap="userMap">

INSERT INTO userVO VALUES(#{signAccount},#{signPwd},now(),1)

</insert>

<select id="userLogin" parameterMap="String">

SELECT pwd from userVO where account=#{logAccount}

</select>

<select id="signAccountCheck" parameterType="String">

SELECT COUNT(*) FROM userVO WHERE account=#{signAccount}

</select>

<select id="loginAccountCheck" parameterType="String">

SELECT COUNT(*) FROM userVO WHERE account=#{logAccount}

</select>


2.Class(Java)로 작성하였을 시, class자체 메소드를 통해 매개변수와 타입을 지정하고 Annotation을 통해 DB와 접속한다.

@Insert("INSERT INTO userVO VALUES(#{signAccount},#{signPwd},now(),1)")

public void userInsert(Map map);


@Select("SELECT pwd from userVO where account=#{logAccount}")

public String userLogin(String logAccount);


@Select("SELECT COUNT(*) FROM userVO WHERE account=#{signAccount}")

public int signAccountCheck(String signAccount);


@Select("SELECT COUNT(*) FROM userVO WHERE account=#{logAccount}")

public int loginAccountCheck(String logAccount);


위 2가지는 결국 같은 결과값을 가져온다.


이 두가지를 일단 이해할 수 있었으며, 처음 설정에서 Service와 Resource 등 많은 변화가 있다 

Annotation에서는 Autowired를 통해 자동할당을 시켜주면되지만 이부분은 차차 공부하면서 이해해봐야 할 것 같다.

Comments