본문 바로가기

개발/BACK

Mapper XML MyBatis resultMap 사용하기 ( List 불러오기, 반복문 없이)

728x90

나는 현재까지 개발하면서 ResultMap의 존재를 몰랐다.

그래서 1 : N 의 구조나 N : N 의 구조에서 데이터를 가지고 올 때, 

Service Layer에서 항상 for문을 돌려서 DB에 여러번 접근하는 것으로 해결거나 DB 조인을 이용해 왔다.

(예를들어, 수강생이 신청한 여러개의 수강과목의 정보를 불러올 때) 

 

하지만 ResultMap의 경우, VO에 List 형태로 변수만 선언해주면 한번의 DB접근으로 해당 데이터들을 

모두 가져올 수 있고, 또 보기에도 소스가 깔끔해 보였다.

 


 

[다음 예제를 보자]

 

 

 

이런 구조의 테이블에서

나는 한 학생에 대한 정보, 학생이 수강한 과목 정보를 가져오려고 한다.

해당 예시는 물론 DB 내에서 처리하면 쉽게 가져올 수 있지만, ResultMap의 예제를 보여주기 위해 이처럼 구현하겠다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
public class StudentVO {
 
    private List<SubjectVO> subjectList;  //Subject List
    private long no;  //학번
    private String name; //이름
}
 
public class SubjectVO {
    private long subjectNo;  //과목번호
    private long no; //학번
    private long subjectName; //과목명
}
cs
 
다음과 같이 각각의 VO를 생성해준다.StudentVO를 보면 SubjectVO로 이루어진 List 변수가 하나 존재한다.
우리는 저 List에다가 해당 학생의 수강과목 정보를 한 번의 DB 접근으로 받아 올 수 있다.

 

먼저 학번을 입력받아 해당 학생의 정보를 조회하는 SQL 문은 다음과 같다.
1
2
3
<select id="studentWithSubject" resultMap="test">
SELECT no, name FROM student WHERE no = #{no}
</select>
cs

 

해당 SQL문을 실행하고 난 이후, 명시되어 있는 resultMap 명인 test로, 조회한 데이터가 바인딩 된다.

 

1
2
3
4
5
6
7
8
9
    <resultMap id="test" type="StudentVO">
        <result property="no" column="no"/>
        <result property="name" column="name"/>
        <collection property="subjectList" column="{no = no}" ofType="subjectVO" select="selectSubject" />    
    </resultMap>
 
    <select id="selectSubject" resultType="subjectVO">
        SELECT subjectNo, no, subjectName FROM subject WHERE no= #{no}
    </select>
cs

여기서 resultMap 태그의 id 값이 아까 select 태그에서 resultMap속성과 값이 같아야 한다.

 

그리고 내부의 result 태그에, 이전 SQL문에서 가져온 필드값을 매핑해주면 StudentVO에 해당 데이터가 매핑된다.

 

ResultMap을 사용하여 데이터를 바인딩하려면 모든 데이터를 result 태그에 명시해주어야 한다.

 


 

collection 태그는 전달받은 [no] 값을 컬럼값에 넣어주어, 전달해준 no에 해당하는 수강과목 정보를 모두 조회한다.

 

property속성에는 SubjectVO에 명시해준 리스트 변수 subjectList 를 입력해주면 된다.

 

이런 방식으로 이중, 삼중으로 된 ResultMap을 사용할 수 있어서 편리하다.

해당 예제는 아주 간단한 예제이기 때문에, ResultMap 사용필요성을 못 느끼지만, 

List 형식으로 조회되는 데이터가 많아 질 경우, 그 데이터는 모두 VO안에 List로 묶여 있어서 

데이터를 식별하는 것도 용이하고, 무엇보다 편리해서 앞으로 자주 사용할 것 같다.

728x90