괴발개발 개발하다
[ Spring ] 스프링 MyBatis 사용 예시(Mapper 인터페이스, Mapper XML) 본문
Mapper는 SQL과 그에 대한 처리를 지정하는 역할을 수행한다.
스프링에서 MyBatis를 사용하는 경우에는 Mapper를 인터페이스(Mapper 인터페이스+어노테이션) 형태와 XML(Mapper XML) 형태로 작성할 수 있다.
1. Mapper 인터페이스 생성 및 설정
MyBatis-Spring은 Mapper 인터페이스를 이용해서 실제 SQL 처리가 되는 클래스를 자동으로 생성한다.
1) mapper로 사용할 패키지 추가
- src/main/java 경로에 org.pky.mapper 패키지 추가함.
- 해당 패키지에 mapper로 사용할 인터페이스 생성해서 사용하면 됨.
2) root-context.xml 설정
- mapper 패키지에 인터페이스를 생성한다고 해서 스프링은 해당 패키지안의 인터페이스를 mapper로 인식하지 않는다.
- root-context.xml에 추가적인 설정을 통해 패키지에 생성한 인터페이스를 mapper로 인식하도록 만들어야 한다.
가. root-context.xml
- 하단 namespaces를 클릭 후 mybatis-spring 체크
나. 다시 하단에 Source를 클릭한 후 아래의 코드를 추가한다.
- <mybatis-spring:scan> 태그의 base-package 속성은 지정된 패키지의 모든 MyBatis 관련 어노테이션을 찾아서 처리한다.
<mybatis-spring:scan base-package="org.pky.mapper"/>
1-2. Mapper 인터페이스 테스트
- 아직 데이터베이스에 테이블을 생성하지 않은 관계로 테이블 없이도 실행이 되는 SQL문 사용.(select sysdate from dual [현재시간])
1) TimeMapper.java (인터페이스) 생성
root-context.xml에 mapper 역할로 지정한 패키지에 테스트를 위해 사용할 인터페이스 TimeMapper.java를 만들고, 어노테이션을 이용해서 SQL을 메서드에 추가한다.
package org.pky.mapper;
import org.apache.ibatis.annotations.Select;
public interface TimeMapper {
@Select("select sysdate from dual")
String getTime();
}
2) SQL문 작동 테스트를 위해 TimeMapperTests 테스트 클래스 생성
: src/test/java - org.pky.persistence 경로에 생성한다.
package org.pky.persistence;
import org.apache.ibatis.reflection.invoker.GetFieldInvoker;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.pky.mapper.TimeMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import lombok.extern.log4j.Log4j;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
@Log4j
public class TimeMapperTests {
@Autowired
private TimeMapper timeMapper;
@Test
public void testTime1() {
log.info(timeMapper.getTime());
}
}
3) JUnit 테스트 결과 확인
2. Mapper XML
복잡하고 길어지는 SQL문을 사용하는 경우에는 XML문을 사용해야 한다. 앞서 추가한 MyBatis-Spring 라이브러리 경우 Mapper 인터페이스와 XML을 동시에 이용할 수 있다.
Mapper XML을 사용하기 위해 가장 주의해야 할 점은 XML 파일의 위치와 XML 파일에서 지정하는 namespaces 속성이다.
* 인터페이스와 XML을 동시에 사용하는 경우 Mapper 인터페이스 단독으로 사용하였을 때 작성한 어노테이션은 사용하지 않는다.
1) src/main/resources 경로에 org/pky/mapper 경로가 되도록 폴더를 생성하고, TimeMapper 인터페이스와 이름이 동일한 TimeMapper.xml 파일을 생성한다.
2) TimeMapper.xml 파일 설정
- <! DOCTYPE> 태그는 해당 문서가 mapper로서의 역할을 한다고 명시되어 있다. mapper로서 xml을 사용하고 싶으면 반드시 작성되어야 한다.
- <mapper> 태그에서 namespace 속성에 연동시키고자 하는 Mapper 인터페이스명을 경로와 함께 명시해야 함.
<?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">
/*
SQL문 작성하는 곳
*/
</mapper>
2-2. Mapper XML 테스트
1) TimeMapper 인터페이스에 getTime2() 테스트 메서드 추가
package org.pky.mapper;
import org.apache.ibatis.annotations.Select;
public interface TimeMapper {
@Select("select sysdate from dual")
String getTime();
// org.pky.mapper.TimeMapper.getTime2 -> 전체 경로임.
String getTime2();
}
2) TimeMapper.xml 파일에 <select> 태그를 작성하고 실행시키고자 하는 SQL문(현재시간)을 추가한다.
- <mapper> 태그에 id속성은 Mapper 인터페이스에 추가한 메서드명과 동일하게 작성됩니다.
- <mapper>태그에 resultType속성은 연동시킬 메서드에 명시된 반환 타입을 작성한다.
<?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.pky.mapper.TimeMapper">
<select id="getTime2" resultType="string" >
SELECT sysdate FROM dual
</select>
</mapper>
3) TimeMapperTests 클래스에 테스트 코드 추가
package org.pky.persistence;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.pky.mapper.TimeMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import lombok.extern.log4j.Log4j;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
@Log4j
public class TimeMapperTests {
@Autowired
private TimeMapper timeMapper;
@Test
public void testTime1() {
log.info(timeMapper.getTime());
}
@Test
public void testTime2() {
log.info(timeMapper.getTime2());
}
}
4) JUnit 테스트
5) 결과 확인
< 출처 >
https://kimvampa.tistory.com/59?category=800652
'spring' 카테고리의 다른 글
[ Spring ] 스프링 log 레벨 설정 (0) | 2022.07.09 |
---|---|
[ Spring ] 스프링 Log4jdbc-log4j2 추가 및 설정방법 (0) | 2022.07.09 |
[ Spring ] 스프링 MyBatis 라이브러리 추가, SQLSessionFactory 설정 (0) | 2022.07.08 |
[ Spring ] 스프링 JDBC, MYBATIS 차이 (0) | 2022.07.08 |
[ Spring ] 스프링 커넥션 풀 설정(HikariCP) (0) | 2022.07.08 |