[DB]Mybatis ResultMap 사용해보기

Inung_92·2023년 1월 12일
1

DB

목록 보기
2/3
post-thumbnail

ResultMap이란?

ResultMap은 복잡한 결과 매핑(조인 등)을 수행할 때 간편하게 수행이 가능하도록 만들어주기 위해 사용하는 태그


ResultMap 사용

일반적인 쿼리문 사용은 지난 글에서 설치 및 사용을 하면서 알아보았다. 이번에는 조금 더 복잡한 조인을 실행할 때의 ResultMap 사용에 대해서 알아보겠다.
기본문법은 다음과 같다.

<!-- 기본문법 -->
<resultMap type="대상DTO" id="아이디명">
  <!-- 1:1로 DTO의 멤버변수를 매핑-->
  <id column="대상 컬럼명" property="DTO멤버변수명"/>
  <result column="대상 컬럼명" property="DTO멤버변수명"/>
</resultMap>
  • type : java의 객체자료형(DTO)의 이름을 작성
  • id : 본인이 사용할 직관적인 이름 부여
  • id 태그의 column : 테이블 간의 참조키로 활용되는 컬럼명
  • id 태그의 property : 컬럼에 해당하는 DTO의 멤버변수
  • result 태그의 column : 일반 컬럼명
  • result 태그의 property : 컬럼에 해당하는 DTO의 멤버변수

위의 설명한 기본문법을 참고하여 ResultMap을 세팅했다면 아래와 같이 실행할 쿼리문에 ResultMap을 지정해준다.

<select id="select" parameterType="자료형" resultMap="아이디명">
  select * from 테이블명 where 대상컬럼=#{property명}
</select>

기본적인 문법에 대해서 알아보았다면 이제 실제로 사용한 예시를 아래 그림으로 확인해보자.

위 코드에서 사용한 DB 테이블의 구조는 아래와 같다.

news_idxtitlewritercontentregdatehit
PK제목작성자내용등록일조회수

또한 위 테이블과 대응하는 DTO의 코드는 아래를 참고하자.

public class News {
	private int news_idx;
	private String title;
	private String writer;
	private String content;
	private String regdate;
	private int hit;
}

테이블과 DTO 코드를 같이보면 컬럼에 1:1로 대응하는 멤버변수들을 보유하고있다. 이것으로 기본문법에 대입해보면 어떤 위치에 어떠한 값이 입력되어야하는지 감이 올 것이다. 그렇다면 아래와 같이 컬럼명과 동일하지 않은 멤버변수와 매핑을 해야하는 경우를 아래에서 살펴보자. 테이블의 컬럼명은 위와 동일하다고 보고, DTO의 멤버변수 중 하나가 다르다고 가정하겠다.

public class News {
	private int news_idx;
	private String title;
	private String author; //작성자를 writer -> author로 변경
	private String content;
	private String regdate;
	private int hit;
}

이 부분에 대해서 아래 xml 태그를 확인해보자. 해당하는 컬럼에 대해서만 작성을 해보겠다.

 <result column="writer" property="author"/>

위에서 처럼 column에는 테이블의 컬럼명, property에는 DTO의 멤버변수명을 작성해주면 된다. 즉, 테이블의 컬럼명과 DTO의 멤버변수명을 1:1로 대응하게 작성해주면 Mybatis가 내부적으로 매핑을 해준다는 말이다.


ResultMap의 Collection

collection이란?

테이블 간의 1:n의 관계를 가질 때 사용하는 태그

collection은 서브쿼리 형태로 데이터를 가져올 수 있다. 이 말은 내부적으로 서브쿼리문을 실행해주기 때문에 각각의 쿼리문을 작성하여 조합하면 된다는 것이다.

collection 사용

그렇다면 본격적으로 collection을 사용하여 조인하는 방법을 알아보자.
먼저 아래를 보면 collection 사용에 기본적인 문법을 태그로 작성해두었다. 차근차근 알아보자.

<collection
            column="참조컬럼명"
            javaType="패키지.클래스명"
            ofType="DTO명"
            property="적용할 멤버변수명"
            select="조인할매퍼의 쿼리문"
/>
  • column : collection의 컬럼은 테이블간의 참조가되는 컬럼을 지정
  • javaType : 말 그대로 자바의 자료형, 패키지 경로까지 입력
  • ofType : 반환받을 자료형을 의미함
  • property : 서브쿼리 결과를 저장할 멤버변수명
  • select : 서브쿼리를 실행하는 매퍼의 쿼리문

다른 것들은 크게 어려운 부분이 없을 것이라 생각된다. 다만, property와 select는 조금 헷갈릴 수도 있을 것이다.

먼저 property는 DB 테이블과 1:1대응하는 DTO의 멤버변수가 아니다. 이 말은 property에 들어가야하는 멤버변수는 서브쿼리의 결과를 받을 특정 멤버변수가 되는 것이다. 그게 기존의 것이 될 수도 있고, 새로운 것이 될 수도 있다는 말이다.

다음으로 select는 조인할 때 실행되어야하는 서브쿼리의 대상이 되는 쿼리문을 이야기한다. 자세한 것은 아래 예제를 보면서 추가적으로 설명하겠다.

위 그림을 보면 ResultMap을 통해 매핑을 완료해주었다. 그 다음은 ResultMap 태그 안에 collection을 작성한다. 다음 그림을 보자.

그림을 보면 위에서 설명한 기본적인 문법이 나열되어있는 것이 보일 것이다. 아래의 테이블의 참조관계를 보면서 그림을 본다면 무슨 내용인지 이해가 될 것이다.

부모 테이블

news_idxtitlewritercontentregdatehit
PK제목작성자내용등록일조회수

자식 테이블

comments_idxnews_idxmsgauthorwritedate
PKFK내용작성자등록일

news_idx가 두 테이블을 연결하는 컬럼이다. 그렇기 때문에 collection의 column으로 사용이 되는 것이다. 그럼 다음은 DTO를 한번 들여다보자.

public class News {
	//컬럼과 1:1로 대응하는 멤버변수
	private int news_idx;
	private String title;
	private String writer;
	private String content;
	private String regdate;
	private int hit;
    
    //조인(서브쿼리) 결과를 받을 멤버변수
	private List<Comments> commentsList;
}

보이는 것처럼 컬럼명과 동일하지 않고 아예 동떨어진 녀석이 보인다. commentsList는 조인의 결과를 담을 변수이기 때문에 컬럼과 1:1 대응하지 않는다. 그럼 자세히 풀어서 설명을 해보겠다.

  • javaType : commentsList를 java.util.List 자료형으로 선언
  • ofType : commentsList의 제너릭이 Comments형이기 때문에 Comments로 지정
  • property : 서브쿼리의 결과가 담겨질 멤버변수명
  • select : 서브쿼리는 Comments의 MapperFile에서 실행하기 때문에 해당 쿼리문의 id를 지정

그렇다면 서브쿼리문은 어떻게 되어있는지 보자.

이렇게 서로 다른 MapperFile에 작성된 쿼리문을 호출하는 것이 collection의 select 태그이다. 그렇다면 마지막으로 최종적으로 적용된 상태를 보면서 마무리하자.

조금은 복잡할 수 있다. 다만 각 태그들이 DB, DTO 그리고 서브쿼리와 어떻게 매핑이 되는지 이해하기 위해서는 한번씩 둘러보길 권장한다.


마무리

오늘은 mybatis로 조인을 하는 방법에 대해서 알아보았다. 실습을 할 때는 크게 양이 많지 않아보였는데 설명을하려고하니 내용이 조금 번잡하다는 생각이 들지만 잘 읽어주길 바란다.

혹시 잘못된 개념이 있거나 추가할 사항이 있으면 댓글로 남겨주시면 감사하겠습니다.👊🏽

참고

https://gitseok.tistory.com/entry/MyBatis-resultMap-collection-%EC%82%AC%EC%9A%A9%EB%B2%95-1N-select
https://yeonyeon.tistory.com/131

profile
서핑하는 개발자🏄🏽

0개의 댓글