SQLSessionFactory를 이용해서 코드를 작성해도 직접Connection을 얻어 JDBC코딩이 가능하지만
편하게 하기위해서는 SQL을 어떻게 처리할 것인지를 별도의 설정을 분리, 자동으로 처리되는 방식을 이용하는것이 좋다.
->MyBatis의 Mapper를 작성해줘야 한다.
Mapper란?
SQL과 그에대한 처리를 지정하는 역할
- MyBatis-Spring을 이용하는경우 - Mapper를 XML과 인터페이스 + 어노테이션의 형태로 작성 할 수있다.
Mapper 인터페이스
interface를 작성해준다.
package org.zerock.mapper;
import org.apache.ibatis.annotations.Select;
public interface TimeMapper {
@Select("SELECT sysdate FROM dual")
public String getTime();
}
Mapper설정
mapper작성 후에는 Mybatis가 동작할대 Mapper를 인식 할 수있도록
root-context.xml에 추가적인 설정을 해 주어야 한다.
<mybatis:scan>이라는 간단한 방식을 이용하도록 하자
root-context.xml 열어서 namespace탭의 mybatis-spring 항목을 체크해준다.
source탭을 눌러
<mybatis-spring:scan base-package="org.zerock.mapper"/>
추가해 준다.
<mybatis-spring:scan> 태그의 base속성은 지정된 패키지의 모든 MyBatis 관련 어노테이션을 찾아서 처리
이렇게 처리하면 자동으로 org.zerock.mapper 패키지를 인식하는 방법
java 설정을 이용한 방법 [jex00]
RootConfig에
@MapperScan(basePackages = {"org.zerock.mapper"})
추가해 준다.
전체코드
package org.zerock.config;
import javax.sql.DataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
@Configuration
@ComponentScan(basePackages = {"org.zerock.sample"})
@MapperScan(basePackages = {"org.zerock.mapper"})
public class RootConfig {
@Bean
public DataSource dataSource() {
HikariConfig hikariConfig = new HikariConfig();
hikariConfig.setDriverClassName("oracle.jdbc.driver.OracleDriver");
hikariConfig.setJdbcUrl("jdbc:oracle:thin:@localhost:1521:XE");
hikariConfig.setUsername("book_ex");
hikariConfig.setPassword("book_ex");
HikariDataSource dataSource = new HikariDataSource(hikariConfig);
return dataSource;
}
@Bean
public SqlSessionFactory sqlSessionFactory() throws Exception{
SqlSessionFactoryBean sqlSessionFactory = new SqlSessionFactoryBean();
sqlSessionFactory.setDataSource(dataSource());
return (SqlSessionFactory) sqlSessionFactory.getObject();
}
}
Mapper 테스트
test/java/org/zerock/persistence 밑에
TimeMapperTests.java를 작성한다.
package org.zerock.persistence;
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 org.zerock.mapper.TimeMapper;
import lombok.Setter;
import lombok.extern.log4j.Log4j;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xmlSSS")
@Log4j
public class TimeMapperTests {
@Setter(onMethod_ = {@Autowired} )
private TimeMapper timeMapper;
@Test
public void testGetTime() {
log.info(timeMapper.getClass().getName());
log.info(timeMapper.getTime());
}
}
정상적으로 실행된다면 스프링 내부에서는 TimeMapper타입으로 만들어진 스프링객체(Bean)가 존재 한다는 뜻.
java설정의 경우
ContextConfiguration을 아래와 같이 변경해 준다.
@ContextConfiguration(classes = {org.zerock.config.RootConfig.class})
XML 매퍼와 같이 쓰기
MyBatis - Spring은 Mapper인터페이스와 XML을 동시에 이용할 수 있다.
XML을 작성해서 사용할때
- XML파일의 위치, XML파일에 저장하는 namespace속성이 중요
- XML파일의 위치 : 1. Mapper인터페이스가 있는곳에 같이 작성 2. src/main/resource구조에 XML을 저장할 폴더를 생성 할 수 있다.
XML파일을 만들땐 Mapper인터페이스와 같은 이름을 사용하자
src/main/resource에
org > zerock> mapper폴더를 만들어준다
TimeMapper.xml파일을 생성한다.
XML파일에는 MyBatis의 XML 매퍼에서 이용하는 태그에 대한 설정이 필요
Mapper 인터페이스와 XML을 같이 이용해 보기 위해 기존의 TimeMapper 인터페이스에 추가적인 메서드를 선언
package org.zerock.mapper;
import org.apache.ibatis.annotations.Select;
public interface TimeMapper {
@Select("SELECT sysdate FROM dual")
public String getTime();
public String getTime2(); //추가된 코드
}
코드를 추가해주고
해석 -> getTime2에는 @Select 와 같이 MyBatis 어노테이션이 존재하지 않고, SQL역시 존재하지 않는다.
왜냐면 이번엔 SQL을 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="org.zerock.mapper.TimeMapper">
<select id="getTime2" resultType="String">
SELECT sysdate FROM dual
</select>
</mapper>
이렇게 작성해 준다.
XML 매퍼를 이용하면 <mapper>태그의 namespace속성 값을 신경써야한다.
MyBatis는 Mapper 인터페이스의 XML을 인터페이스의 이름과 namespace 속성값을 가지고 판단한다.
위와같이 org.zerock.mapper.TimeMapper 인터페이스가 존재하고, XML의 <mapper namespace="org.zerock.mapper.TimeMapper"> 와 같이 동일한 이름이 존재한다면
이를 병합해서 처리한다.
따라서 메서드 선언은 인터페이스에 존재하고 SQL에 대한 처리는 XML을 이용하는 방식이다.
<select>태그의 id 속성값은 메서드의 이름과 동일 해야한다.
또한 <select>태그의 경우 resultType을 가지는데 이 값은 인터페이스에 선언된 메서드의 리턴턴 타입과 동일 해야한다.
이제 최종 확인을 위해 TimeMapperTest클래스를 이용해 테스트를 진행해 보자
TimeMapperTests 파일에
@Test
public void tesGetTime2() {
log.info("getTime2");
log.info(timeMapper.getTime2());
}
코드를 추가해 주고 test를 돌리면
log를 통해 확인할 수있다.
'web' 카테고리의 다른 글
코드로 배우는 스프링 웹프로젝트 -스프링 MVC의 기존 구조 (0) | 2020.10.05 |
---|---|
코드로 배우는 스프링 웹프로젝트 - log4jdbc-log4j2 설정 (0) | 2020.10.01 |
코드로 배우는 스프링 웹프로젝트 - 04 MyBatis와 스프링 연동 (0) | 2020.09.30 |
코드로 배우는 스프링웹프로젝트 -JDBC테스트코드 (0) | 2020.09.29 |
코드로 배우는 스프링웹프로젝트 - 스프링과 Oracle Database연동 (0) | 2020.09.29 |