본문 바로가기

웹 개발

MyBatis TypeHandler

타입 핸들러

MyBatis에서 Select된 Enum의 코드들을 Handler를 통해서 Enum으로 바꾸어준다.

public interface CodeEnum {
    String getCode();
}

핸들러를 적용시키고자 하는 Enum의 인터페이스를 선언

public enum MyType implements CodeEnum {
    CASH("01"),
    CARD("02"),
    POINT("03");

    private String code;

    MyType(String code) {
        this.code = code;
    }

    @Override
    private String getCode(
        return code;
    }
}

인터페이스를 상속받은 Enum 정의

public class CodeEnumTypeHandler<E extends Enum<E>> implements TypeHandler<CodeEnum> {
    private Class<E> type;

    public CodeEnumTypeHandler(Class<E> type) {
        this.type = type;
    }

    @Override
    public void setParameter(PreparedStatement preparedStatement, int i, CodeEnum codeEnum, JdbcType jdbcType) throws
            SQLException {
        preparedStatement.setString(i, codeEnum.getCode());
    }

    @Override
    public CodeEnum getResult(ResultSet resultSet, String s) throws SQLException {
        return getCodeEnum(resultSet.getString(s));
    }

    @Override
    public CodeEnum getResult(ResultSet resultSet, int i) throws SQLException {
        return getCodeEnum(resultSet.getString(i));
    }

    @Override
    public CodeEnum getResult(CallableStatement callableStatement, int i) throws SQLException {
        return getCodeEnum(callableStatement.getString(i));
    }

    private CodeEnum getCodeEnum(String code) {
        try {
            CodeEnum[] enumConstants = (CodeEnum[])type.getEnumConstants();
            return Arrays.stream(enumConstants)
                    .filter(codeEnum -> codeEnum.getCode().equals(code))
                    .findFirst()
                    .orElse(null);
        } catch (Exception e) {
            throw new TypeException(new StringBuilder("Can't make enum object '")
                            .append(type)
                            .append("'\n")
                            .append(e)
                            .toString());
        }
    }
}

TypeHandler 인터페이스를 상속받은 핸들러를 선언
쿼리문을 통해 CodeEnum의 code와 일치하는 enum을 반환하게함

<resultMap id="resultEnum" type="MyDto">
    <result column="type" property="type" typeHandler="com.navercorp.type.handler.CodeEnumTypeHandler"/>
</resultMap>
<select id="selectEnumType" resultMap="resultEnum">
    SELECT type
    FROM test
</select>

'웹 개발' 카테고리의 다른 글

쿠버네티스  (0) 2021.03.14
XSS  (0) 2021.03.14
프록시  (0) 2021.03.14
정적 코드 분석, Static Code Analysis  (0) 2020.09.23
복수 배열 독립 디스크(Redundant Array of Independent Disks, RAID)  (0) 2020.07.10