본문 바로가기

학원/복기

[MyBatis] 매퍼 바인딩 / package 엘리먼트

매퍼 바인딩

 

XML 기반의 매퍼파일은 SqlSession 객체로 SQL 명령을 제공받아 사용하기 불편하다는 단점이 있다.
때문에 XML 기반의 매퍼파일은 DAO를 만들어줄 때 오타 때문에 오류가 날 가능성이 큰 반면에 인터페이스 기반의 매퍼는 DAO를 만들어줄 때 자동완성 기능으로 오류 날 가능성이 적다.
 
이처럼 인터페이스 기반의 매퍼파일의 가장 큰 장점은 SqlSession 객체로 SQL 명령을 제공받아 사용하기 때문에
DAO를 만드는 것이 더 쉽다는 것이다.
 
대신 XML 기반의 매퍼 파일은 수동 매핑 설정과 동적 SQL 설정에 대한 기능 구현이 편리하다는 장점이 있다.
반대로 인터페이스 기반의 매퍼파일은 수동 매핑 설정과 동적 SQL 설정에 대한 기능 구현이 불편하다.
 
이런 문제점을 해결하기 위해 XML 기반의 매퍼 파일과 Interface 기반의 매퍼파일을 하나의 매퍼로 등록되어 동작하도록 설정할 수 있다. 
이를 매퍼 바인딩(Mapper Binding) 이라고 한다.
 
매퍼 바인딩은 SQL 명령은 XML 기반의 매퍼 파일에 등록하고 DAO 클래스는 Interface 기반의 매퍼 파일을 이용하여 작성하는 것이다.
 
mapper 엘리먼트에는 XML 기반의 매퍼 파일만 등록하여 사용하는 것을 권장한다.

 

[mybatis-config.xml]

<mappers>
	<mapper resource="xyz/itwill/mapper/MyMemberMapper.xml"/>
</mappers>

 


 

예제)

[MyMemberMapper.xml] / [MyMemberMapper.java] 매퍼 파일 생성
 

XML 기반의 매퍼 파일과 Interface 기반의 매퍼 파일로 매퍼 바인딩 처리 하기 위한 방법
 
1. XML 기반의 매퍼 파일에서 mapper 엘리먼트의 namespace 속성값으로 Interface 기반의 매퍼 파일을 작성한다.
 
[MyMemberXMLMapper.xml] 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="xyz.itwill.mapper.MyMemberMapper">
	<!-- SQL 명령을 등록한 엘리먼트의 속성값을 이용하여 추상메소드 작성 -->
	<!-- => 엘리먼트의 id 속성값으로 추상메소드의 이름 작성 -->
	<!-- => 엘리먼트의 parameterType 속성값으로 추상메소드의 매개변수 자료형 작성 -->
	<!-- => 엘리먼트의 resultType 속성값으로 추상메소드의 반환형 작성 -->
	<insert id="insertMember" parameterType="MyMember">
		insert into mymember values(#{id}, #{name} , #{phone} , #{email})
	</insert>
	
	<update id="updateMember" parameterType="MyMember">
		update mymember set name=#{name}, phone=#{phone}, email=#{email} where id=#{id}
	</update>
	
	<delete id="deleteMember" parameterType="string">
		delete from mymember where id=#{id}
	</delete>
	
	<select id="selectMember" parameterType="string" resultType="MyMember">
		select id, name, phone, email from mymember where id=#{id} 
	</select>
	
	<select id="selectMemberList" resultType="MyMember">
		select * from mymember order by id
	</select>
</mapper>

 
2. XML 기반의 매퍼파일에서 SQL 명령을 등록한 엘리먼트를 Interface 기반의 매퍼 파일에서 같은 형식의 추상 메소드로 선언한다.
엘리먼트의 속성값과 추상메소드의 반환형, 이름, 매개변수 자료형이 동일하도록 작성해야한다.
 
[MyMemberMapper.java]

package xyz.itwill.mapper;

import java.util.List;

import xyz.itwill.dto.MyMember;

public interface MyMemberMapper {
	int insertMember(MyMember member);
	int updateMember(MyMember member);
	int deleteMember(String id);
	MyMember selectMember(String id);
	List<MyMember> selectMemberList();
}

MyMemberDAO 클래스 작성

package xyz.itwill.dao;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import xyz.itwill.dto.MyMember;
import xyz.itwill.mapper.MyMemberMapper;

public class MyMemberDAO {
	private static MyMemberDAO _dao;
	
	private MyMemberDAO() {
		// TODO Auto-generated constructor stub
	}
	
	static {
		_dao=new MyMemberDAO();
	}
	
	public static MyMemberDAO getDAO() {
		return _dao;
	}
	
	//SqlSessionFactory 객체를 생성하여 반환하는 메소드
	private SqlSessionFactory getSqlSessionFactory() {
		String resource="mybatis-config.xml";
		
		InputStream inputStream=null;
		try {
			inputStream=Resources.getResourceAsStream(resource);
		} catch (IOException e) {
			throw new IllegalArgumentException(e);
		}
		
		return new SqlSessionFactoryBuilder().build(inputStream);
	}
	
	//회원정보를 전달받아 MYMEMBER 테이블의 회원정보로 삽입하고 삽입행의 갯수를 반환하는 메소드
	public int insertMember(MyMember member) {
		SqlSession sqlSession=getSqlSessionFactory().openSession(true);
		try {
			return sqlSession.getMapper(MyMemberMapper.class).insertMember(member);
		} finally {
			sqlSession.close();
		}
	}
	
	//회원정보를 전달받아 MYMEMBER 테이블에 저장된 회원정보를 변경하고 변경행의 갯수를 반환하는 메소드
	public int updateMember(MyMember member) {
		SqlSession sqlSession=getSqlSessionFactory().openSession(true);
		try {
			return sqlSession.getMapper(MyMemberMapper.class).updateMember(member);
		} finally {
			sqlSession.close();
		}
	}
	
	//아이디를 전달받아 MYMEMBER 테이블에 저장된 회원정보를 삭제하고 삭제행의 갯수를 반환하는 메소드
	public int deleteMember(String id) {
		SqlSession sqlSession=getSqlSessionFactory().openSession(true);
		try {
			return sqlSession.getMapper(MyMemberMapper.class).deleteMember(id);
		} finally {
			sqlSession.close();
		}
	}

	
	//아이디를 전달받아 MYMEMBER 테이블에 저장된 회원정보를 검색하여 DTO 객체로 반환하는 메소드
	public MyMember selectMember(String id) {
		SqlSession sqlSession=getSqlSessionFactory().openSession(true);
		try {
			return sqlSession.getMapper(MyMemberMapper.class).selectMember(id);
		} finally {
			sqlSession.close();
		}
	}

	//MYMEMBER 테이블에 저장된 모든 회원정보를 검색하여 List 객체로 반환하는 메소드
	public List<MyMember> selectMemberList() {
		SqlSession sqlSession=getSqlSessionFactory().openSession(true);
		try {
			return sqlSession.getMapper(MyMemberMapper.class).selectMemberList();
		} finally {
			sqlSession.close();
		}
	}
}

 


package 엘리먼트

 

package : 특정 패키지에 작성된 모든 Interface 기반의 매퍼 파일을 자동으로 매퍼로 등록하기 위한 엘리먼트
 - name 속성 : Interface 기반의 매퍼 파일이 작성된 패키지를 속성값으로 설정한다.

 

[mybatis-config.xml]

<mappers>
	<!-- xml 기반의 매퍼파일은 pacakge 엘리먼트 사용 불가 -->
	<mapper resource="xyz/itwill/mapper/StudentMapper.xml"/>	
	<mapper resource="xyz/itwill/mapper/MyMemberXMLMapper.xml"/>
		
	<!-- package 엘리먼트를 이용해 생략 가능 -->
	<!-- Interface 기반의 매퍼 파일의 경로를 class 속성값으로 설정 -->
	<!-- <mapper class="xyz.itwill.mapper.MyMemberInterfaceMapper"/> -->
		
	<!-- package 엘리먼트를 이용해 생략 가능 -->
	<!-- 매퍼 바인딩 -->
	<!-- <mapper resource="xyz/itwill/mapper/MyMemberMapper.xml"/> -->
		
	<package name="xyz.itwill.mapper"/>
</mappers>

 

해당 패키지 내에 선언된 인터페이스들은 자동으로 매퍼로 등록된다.

 


typeAriaes 엘리먼트에도 마찬가지로 package 엘리먼트 사용이 가능하다.
 
package 엘리먼트는 특정 패키지에 작성된 모든 클래스에 별칭을 자동으로 등록해준다.
→ 패키지에 작성된 클래스는 패키지를 제외한 클래스 이름을 별칭으로 자동으로 등록해준다.

 

[mybatis-config.xml]

<typeAliases>
	<!-- package 엘리먼트를 이용해 생략 가능 -->
	<!-- <typeAlias type="xyz.itwill.dto.Student" alias="Student"/> -->
	<!-- <typeAlias type="xyz.itwill.dto.MyMember" alias="MyMember"/> -->
		
	<!-- 특정 패키지에 작성된 모든 클래스에 별칭을 자동으로 등록 -->
	<package name="xyz.itwill.dto"/>
</typeAliases>

 

해당 패키지에 선언된 모든 클래스의 별칭을 자동으로 등록해준다