SQLSessionFactory를 이용해서 코드를 직접 작성하더라고 직접 Connection 객체를 얻어서 JDBC 코딩이 가능합니다. 하지만 좀 더 편하게 작업하기 위해선 SQL을 어떻게 처리할 것인지를 별도의 설정을 분리해주고, 자동으로 처리되는 방식을 사용하는 것이 좋습니다. 이를 실현시키기 위해선 MyBatis의 Mapper라는 존재가 필요합니다.
여기서 말하는 Mapper는 SQL과 그에 대한 처리를 지정하는 역할을 수행합니다. 스프링에서 MyBatis를 사용하는 경우에는 Mapper를 인터페이스(Mapper 인터페이스 + 어노테이션) 형태와 XML(Mapper XML) 형태로 작성할 수 있습니다.
MyBatis-Spring Mapper 인터페이스를 이용해서 실제 SQL 처리가 되는 클래스를 자동으로 생성합니다.
1에선 mapper인터페이스를 넣을 패키지를 만들었습니다. 그 안에 인터페이스를 생성한다고 해서 스프링은 해당 패키지안의 인터페이스를 mapper로 인식하지 않습니다. root-context.xml에 추가적인 설정을 통해 패키지에 생성한 인터페이스를 mapper로 인식하도록 만들어야 합니다.
2-1. root-context.xml 창을 열어 하단 namespaces를 클릭 후 뜨는 목록에서 mybatis-spring을 체크하여 추가
2-2. 다시 하단에 Source를 클릭한 후 아래의 코드를 추가
- <mybatis-spring:scan> 태그의 base-package 속성은 지정된 패키지의 모든 MyBatis 관련 어노테이션을 찾아서 처리합니다.
<mybatis-spring:scan base-package="자신이 mapper 인터페이스를 담을 패키지 지정"/>
Mapper 인터페이스를 생성하고 설정하였습니다. 아직 데이터베이스에 테이블을 생성하지 않은 관계로 테이블 없이도 실행이 되는 SQL문(select now() form dual / 현재시간)을 사용하는 것을 목표로 하겠습니다.
root-context.xml에 mapper역할로 지정한 패키지에 테스트를 위해 사용할 인터페이스 TimeMapper.java를 생성
- 클래스가 아니라 인터페이스를 만들어야 합니다.
인터페이스에 아래의 코드를 추가
- 어노테이션을 이용해서 SQL을 메서드에 추가합니다.
@Select("SELECT now() FROM dual")
public String getTime();
SQL문이 작동하는지 테스트를 위해서 "src/test/java" => "com.test.persistence" 경로에 TimeMapperTests 클래스를 생성
아래의 테스트 코드를 추가
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
public class TimeMapperTests {
@Autowired
private TimeMapper timeMapper;
@Test
public void testGetTime() {
System.out.println(timeMapper.getTime());
}
}
JUnit을 통해서 테스트 진행
결과 확인
Mapper 인터페이스만으로도 충분히 SQL문을 편리하게 처리가 가능합니다. 하지만 복잡하고 길어지는 SQL문을 사용하는 경우에는 XML문을 사용해야 합니다. 앞서 추가한 MyBatis-Spring 라이브러리 경우 Mapper 인터페이스와 XML을 동시에 이용할 수 있습니다.
Mapper XML을 사용하기 위해 가장 주의해야 할 점은 XML 파일의 위치와 XML 파일에서 지정하는 namespaces 속성입니다
* 인터페이스와 XML을 동시에 사용하는 경우 Mapper 인터페이스 단독으로 사용하였을 때 작성한 어노테이션은 사용하지 않습니다.
XML 저장 위치 :
1. Mapper 인터페이스가 저장된 곳에 xml파일을 저장시켜도 됩니다.
2. 'src/main/resource' 위치에 Mapper 인터페이스가 저장된 패키지명을 폴더 경로로 만들어줍니다.
XML 파일명 :
XML 파일을 만들 때 정해진 규칙은 없습니다. 그렇지만 가능하면 Mapper 인터페이스와 같은 이름을 이용하여 가독성을 높여주는 것이 좋습니다.
인터페이스 경로가 'com.test.mapper'이기 때문에 'src/main/resource' 경로에 com/test/mapper 경로가 되도록 폴더를 생성
생성한 경로에 TimeMapper 인터페이스와 이름이 동일한 TimeMapper.xml파일을 생성
아래의 코드를 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="com.vam.mapper.TimeMapper">
</mapper>
TimeMapper 인터페이스에 getTime2() 메서드를 추가
TimeMapper.xml 파일에 <select>태그를 작성하고 실행시키고자 하 는 SQL문을 추가
<select id="getTime2" resultType="string">
SELECT now() FROM dual
</select>
@Test
public void testGetTime2() {
System.out.println(timeMapper.getTime2());
}
Junit테스트를 진행
결과 확인
MyBatis를 통해서 SQL문을 실행하기 위해선 두 가지 방법이 있습니다. 첫 번째 방법은 인터페이스와 어노테이션 사용이고 두 번째 방법은 인터페이스와 XML 사용입니다. 첫 번째 장점은 인터페이스 파일 한 가지만 사용함으로써 매우 편리하게 SQL문을 실행시킬 수 있습니다. 하지만 길고 복잡한 SQL문은 사용할 수 없다는 단점이 있습니다. 길고 복잡한 SQL문을 사용할 할 경우 XML을 사용하는 두 번째 방식을 사용해야 합니다.
XML방식을 사용하여야 할 때는 '파일 생성 위치'와 xml파일에서 작성하는 'namespace'속성을 주의하여 작성해야 합니다. 제대로 된 위치와 제대로 된 namespace속성을 작성하지 못할 시엔 반드시 에러가 발생하기 때문입니다.