Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

괴발개발 개발하다

[ Spring ] 스프링 MyBatis 사용 예시(Mapper 인터페이스, Mapper XML) 본문

spring

[ Spring ] 스프링 MyBatis 사용 예시(Mapper 인터페이스, Mapper XML)

괴발새발개발자 2022. 7. 9. 01:33

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][05-2]MyBatis 사용(Mapper 인터페이스, Mapper XML)

개인 공부 후 자료를 남기기 위한 목적이기에 내용 상에 오류가 있을 수 있습니다. git주소(Oracle DB) : https://github.com/sjinjin7/blog_study git주소(MySQL DB) : https://github.com/sjinjin7/..

kimvampa.tistory.com