이번 포스팅에는 Mapper 인터페이스와 Mapper XML을 비교하다가 알게된 점을 기록하려고 합니다.
일단 root-context.xml에 해당 코드를 추가하도록 하겠습니다.
<!-- root-context.xml -->
<mybatis-spring:scan base-package="org.zerock.mapper"/>
이제 Mapper 인터페이스로 DB에 있는 값을 가져오는 방식과
Mapper.xml로 가져오는 방식을 비교하도록 할텐데요?
1. Mapper 인터페이스 방식
org.zerock.mapper 패키지를 만든 후 BoardMapper.java 파일을 작성합니다.
<!-- BoardMapper.java -->
package org.zerock.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Select;
import org.zerock.domain.BoardVO;
public interface BoardMapper {
@Select("select * from tbl_board where bno > 0")
public List<BoardVO> getList();
}
이제 작성한 코드를 테스트 하겠습니다.
package org.zerock.mapper;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import lombok.Setter;
import lombok.extern.log4j.Log4j;
@RunWith(SpringJUnit4ClassRunner.class) // 현재 테스트 코드가 스프링을 실행하는 역할을 할 것이다 라는 것을 나타냄
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml") // 지정된 클래스나 문자열을 이용해 필요한 객체들을 스프링내에 객체로 등록합니다.
@Log4j
public class BoardMapperTests {
@Setter(onMethod_ = @Autowired)
private BoardMapper mapper;
@Test
public void testGetList() {
mapper.getList().forEach(board -> log.info(board));
}
}
테스트의 결과는 다음과 같습니다.
이렇게 BoardVO의 담겨있는 값들이 잘나오는데 문제는 지금 부터입니다!
2. xml 방식
위의 클래스와 같은 이름의 mapper를 작성하겠습니다.
<!-- BoardMapper.xml -->
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.zerock.mapper.BoardMapper">
<select id="getList" resultType="org.zerock.domain.BoardVO">
<![CDATA[
select * from tbl_board where bno > 0
]]>
</select>
</mapper>
XML에 SQL문이 처리 되었으니 BoardMapper 인터페이스에 있는 어노테이션 sql은 주석처리 하겠습니다.
<!-- BoardMapper.java -->
package org.zerock.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Select;
import org.zerock.domain.BoardVO;
public interface BoardMapper {
// @Select("select * from tbl_board where bno > 0")
public List<BoardVO> getList();
}
마찬가지로 테스트를 실행하도록 하겠습니다.
아까의 mapper 인터페이스와 같은 결과값이 나왔습니다!
본인이 기존에 알고 있던것은
- src/main/java/org/zerock/mapper
- src/main/resouces/org/zerock/mapper
이 두 경로가 일치하고,
<!-- root-context.xml -->
<mybatis-spring:scan base-package="org.zerock.mapper"/>
root-context.xml에서 다음과 같이 base-package를 설정하면
당연히 src/main/java 경로를 탈 줄 알았는데
resources경로여도 패키지명만 같으면 인식 할 줄 몰랐는데
오늘 해보니 경로가 달라도 패키지명만 같으면 된다는걸 깨달은 좋은 경험이 되었습니다.
그리고 알아야 할 것은
Mapper 인테페이스와 Mapper XML 둘 다 한번에 사용하지는 못하고
mapper.xml을 사용할 때는 mapper.java의 sql 어노테이션을 주석처리하거나 삭제하고,
mapper.java를 사용할 때는 해당 sql 태그를 주석처리 or 삭제 해야합니다.