이번 포스팅에는 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 삭제 해야합니다.

 

+ Recent posts