성장하는 개발자의 블로그

[Spring Boot] - mybatis 사용하여 한 번에 여러 select 가져오기 본문

Spring Boot

[Spring Boot] - mybatis 사용하여 한 번에 여러 select 가져오기

zxzc1297 2024. 8. 20. 16:07
반응형
import lombok.Data;

import java.util.List;
@Data
public class CustomGroup {
    private int groupSeq;
    private String title;
    private int groupType;
    private int subType;
}

mybatis 를 이용하여 프로젝트 구성 중 한 번에 여러 select 문을 가져와야하는 경우가 생겼다. 물론 여러 mapper 메소드를 이용하여 할 수 있었지만 이렇게 구성해야하는 이유가 있었다. 이유를 나열해보자면,

 

1. 통계 데이터를 위한 임시테이블 활용으로 임시테이블에서 여러 개의 select 문 필요

 

2. 한 트랜잭션 내에서 데이터베이스 왕복 횟수를 줄이기 위함

 

3. 이에 따른 네트워크 비용 감소

 

이러한 이유로 한 프로시저에서 여러 select 를 가져오는 방법을 찾게 됐다. 이 글을 보는 사람들은 자신의 프로젝트에 맞는 방법을 적용하기를 바란다.

 

한 번에 여러 select 를 처리하기 위해서는 저번 resultmap 활용 법 글과 비슷한 방식으로 구성하였다.

 

https://zxzc1297.tistory.com/4

 

[Spring Boot] MyBatis ResultMap 활용하기

mybatis 를 사용하여 개발 도중 단순한 select 해서 나온 결과가 json안의 json 형태의 데이터로 나와야하는 경우가 있었다. 단순하게 말하자면 join을 하여 select한 결과가 그룹 1, 그룹 2 등으로 나누어

zxzc1297.tistory.com

이전 resultmap 활용법 

 

우선 이번에도 기본적인 모델들을 만들어 주었다. 실제 프로젝트에서는 7개의 모델로 8개의 select 를 만들었지만 예시에서는 2개의 모델만을 가지고 2개의 select 를 가져오는 상황을 예시로 정하고 이전 글의 예시를 가져다 쓰기로 정했다.

 

첫 번째 모델

import lombok.Data;

import java.util.List;
@Data
public class CustomGroup {
    private int groupSeq;
    private String title;
    private int groupType;
    private int subType;
}

 

 

두 번째 모델

import lombok.Data;

@Data
public class GroupItems {
    private String itemSeq;
    private String itemType;
    private String itemName;
}

 

 

이후 mapper 인터페이스 에서는 어노테이션을 통한 resultmap 설정을 해줬다.

@ResultMap("groupInfo, itemInfo")
List<List<?>> testMultiSelect(Map<String, Object> data);

 

 

mapper.xml 파일

<?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.test.mapper.main.GroupMapper">

    <resultMap id="itemResultMap" type="com.test.model.main.GroupItems">
        <result property="itemSeq" column="itemSeq"/>
        <result property="itemType" column="itemType"/>
        <result property="itemName" column="itemName"/>
    </resultMap>

    <resultMap id="groupInfo" type="com.test.model.main.CustomGroup">
        <result property="groupSeq" column="groupSeq"/>
        <result property="title" column="title"/>
        <result property="groupType" column="groupType"/>
        <result property="subType" column="subType"/>
    </resultMap>

    <select id="testMultiSelect" statementType="CALLABLE" resultMap="groupInfo, itemInfo">
        <![CDATA[
		    call UP_ITEM_LIST_TEST_R ()
	    ]]>
    </select>


</mapper>

 

 

이러한 방식으로 구성하였다.

 

이 방식에서 주의할점은 프로시저 내의 select 순서가 resultmap의 나열 순서와 같아야한다.

 

이후 가져온 데이터는 list로 가져왔기 때문에 순서대로 맞게 가공하여 화면단에 뿌려주었다.

List<List<?>> result = testService.testMultiSelect();
// 첫번째 
List<CustomGroup> groupInfo = (List<CustomGroup>) result.get(0);
// 두번째
List<GroupItems> itemInfo = (List<GroupItems>) result.get(1);

 

여러 select를 가져오는 방법은 생각보다 간단하였고 예시로는 2개를 하였지만 실제로는 더 많은 select도 가능하다. 자신의 상황에 맞게 코드를 수정하여 사용하길 바란다.

'Spring Boot' 카테고리의 다른 글

[Spring Boot] MyBatis ResultMap 활용하기  (0) 2024.07.16