BackEnd/Spring Boot

TypeHandler

Raconer 2023. 4. 16. 23:09
728x90

개요

MysqlMybatis로 개발을 진행 하였습니다.
Paging 처리된 List를 불러오는 도중 하나의 Row에 특정 code list를 한번에 불러 왔어야 했습니다.
그러다 보니 Left Join과 Limit을 처리 하면 code list 별로 짤린후 resultMap이 되어 Collection을 사용해도 정확한 Paging 데이터를 가져올수 없었습니다.
그래서 서브쿼리에 GROUP_CONCAT을 사용하여 Code List를 한번에 문자로 받아 왔습니다.
하지만 이는 String으로 넘어 오기 때문에 List Type 으로 각각 쪼갤려면 서버에서 for문을 돌려서 하나하나 split 하여야 했습니다.
이러한 동작을 별도로 하기 전에 TypeHandler를 사용하여 resultMap에서 데이터를 셋팅 하게 할려고 TypeHandler를 만들었습니다.

개발 코드

// TypeHandler를 implements 한다.
// List<Code>는 Return 할려는 데이터 타입이다.
public class SplitCodeStrHandler implements TypeHandler<List<Code>> {
    @Override
    public void setParameter(PreparedStatement ps, int i, List<Code> parameter, JdbcType jdbcType) throws SQLException {
        // Param을 셋팅 한다.
        if (parameter != null) {
            ps.setString(i, parameter.toString());
        }
    }

    @Override
    public List<Code> getResult(ResultSet rs, String columnName) throws SQLException {
        // 결과 값을 가져와 convertListFromStr를 사용하여 데이터를 return 한다.
        String codeList = rs.getString(columnName);
        return this.convertListFromStr(CodeList);
    }

    @Override
    public List<Code> getResult(ResultSet rs, int columnIndex) throws SQLException {
        // 결과 값을 가져와 convertListFromStr를 사용하여 데이터를 return 한다.
        String codeList = rs.getString(columnIndex);
        return this.convertListFromStr(CodeList);
    }

    @Override
    public List<Code> getResult(CallableStatement cs, int columnIndex) throws SQLException {
        // 결과 값을 가져와 convertListFromStr를 사용하여 데이터를 return 한다.
        String codeList = cs.getString(columnIndex);
        return this.convertListFromStr(CodeList);
    }

    // 데이터를 쪼갠후 List에 add 시킨후 Return 한다.
    public List<Code> convertListFromStr(String strList){
        List<Code> codeList = new ArrayList();
        if(strList == null) return codeList;

        String[] codeList = strList.split("\\,");
        Arrays.stream(codeList).forEach(target ->{
            Code temp = Code.findByCode(target);
            if(temp != null){
                codeList.add(temp);
            }
        });

        return CodeList;
    }
}

MyBatis 셋팅


<resultMap id="setDataList" type="DataListType" autoMapping="true">
    <id property="idx" column="idx"/>    
      // GROUP_CONCAT을 사용한 Column이 code_listdlek.
      // TypeHandler에 작성한 Class를 셋팅하면 원하는 방식으로 데이터가 셋팅된다.    
      <result property="codeList" column="code_list"
          typeHandler="com.project.path.handler.type.SplitCodeStrHandler" />
</resultMap>
728x90

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

Request PathVariable Enum Converter  (0) 2023.04.16
Enum 등록된 값 이외에 값 등록시  (0) 2023.04.16
Exception Handler  (0) 2023.04.16
War VS Jar  (0) 2023.04.16
AOP란?  (0) 2023.04.15