MyBatis 맛보기

Woozy9ucci·2022년 10월 25일
0

넵넵이 스터디에서 MyBatis 를 사용해 봤다.
아직 익숙하지 않지만 얼마전에 배우기 시작한 JPA와 비교하며 구조를 정리해보면 좋을것같아서 작성한다.

기본 구조는 비슷하다.
Controller -> Service -> Repository (Entity)
Controller -> Service -> Mapper (VO)
위와 같이 DAO 부분에서 유의미한 차이를 보인다.

우선 JPA는 Entity를 사용했지만 Mapper를 사용할 경우 VO를 사용한다.
Entity는 자바객체를 DB 데이터와 비슷한 느낌으로 사용했다면 VO는 오히려 DB간 DTO의 느낌이다.
즉 이것저것 설정해주던 Entity와 다르게 데이터를 실어 나르는 역할이 주된 것 같다.
(DB의 필드를 자바객체로 맵핑해주는)

또 Repository = Mapper + Mapper.xml 와 같은 구조이다.
JPA 사용시 테이블 별로 Repository를 만들어주고 그에 해당하는 Entity를 입력해 줬다면
MyBatis 사용 시 Mapper.xml에 Mapper와 VO를 맵핑해주고 (테이블당) 쿼리문을 직접 작성해 Mapper클래스에서 메소드를 사용할 수 있도록 만들어 준다.
즉 JPA에서는 자동으로 만들어주던 메소드를 우리가 직접 select태그를 설정해 메소드 이름과 맵핑될 resultMap을 설정하여 Mapper클래스에서 사용한다.

우선 둘다 겉만 핥은 입장으로써 장단점이 명확한 것 같다.
JPA는 해줄게 많이 없지만 복잡한 쿼리문이나 관계설정 등의 복잡함이 있다면
MyBatis는 뭔가 조금더 수동인 느낌이지만 세세한 조작을하기에는 훨씬 수월하다는 느낌을 받았다.

둘의 공통점은 SQL을 잘알아야 잘 활용할 수 있다는 점 같다.

<?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="kr.co.nepnep.sample.mapper.BoardMapper">
	
	<resultMap id="boardResultMap" type="kr.co.nepnep.sample.model.BoardVO">
		
		<result column="SEQ" property="seq"/>
		<result column="TITLE" property="title"/>
		<result column="CONT" property="cont"/>
		<result column="REG_DATE" property="regDate"/>
		<result column="REG_USER" property="regUser"/>
		<result column="UPD_DATE" property="updDate"/>
		<result column="UPD_USER" property="updUser"/>
		
	</resultMap>
	
	<select id = "selectOne" resultMap="boardResultMap" parameterType = "Integer">
		SELECT 
			SEQ,
			TITLE,
			CONT,
			REG_DATE,
			REG_USER,
			UPD_DATE,
			UPD_USER
		FROM
			TBL_BOARD
		WHERE SEQ = #{seq}		
	</select>
	
	<select id = "selectList" resultMap="boardResultMap" parameterType = "String">
		SELECT 
			SEQ,
			TITLE,
			CONT,
			REG_DATE,
			REG_USER,
			UPD_DATE,
			UPD_USER
		FROM
			TBL_BOARD
		WHERE 1=1
		AND TITLE LIKE CONCAT('%', #{searchText}, '%')		
	</select>
	
</mapper>

위가 Mapper.xml 파일이다.
이곳에서 어떤 MapperClass와 연결되어있는지 확인하고
VO와 테이블을 맵핑 해준다.
그리고 쿼리문을 메소드로 만드는 작업또한 이곳에서 이루어진다.

@Mapper
public interface BoardMapper {

	BoardVO selectOne(Integer seq);
	
	List<BoardVO> selectList(String searchText);
}

select태그의 id가 곧 메소드가 되는데 리턴타입과 메소드 선언, parameter 설정은 Mapper인터페이스에서 선언해준다.

1개의 댓글

comment-user-thumbnail
2022년 10월 26일

오 마이바티스~~ 좋은글 감사합니다^^

답글 달기