[Spring] TypeHandler
2021. 5. 7. 17:49ㆍ개발/[Spring]
.회사 데이터베이스에 암호화가 된 데이터를 보았다.
소스를 쭉 보니 MyBatis를 사용한 Mapper 쪽에
<typeHandler = "xxx.xxx.xxx.xxx.MobileSecurityTypeHandler> 라는 것이 존재했었다.
그래서 typeHandler에 대한 내용을 찾아보고 정리를 하게 되었다.
TypeHandler는 무엇일까?
TypeHandler는 myBatis가 PreparedStatement에 파라미터를 설정하고
ResultSet 에서 값을 가져올때마다 적절한 자바 타입의 값을 가져오거나,
INSERT시에 PreparedStatement에 적절한 자바 타입을 값을 set 할때 사용한다.
만약 암호화/복호화 과정을 Java소스에 쓰게 된다면 코드는 분명 너저분해지게 될 것이다.
MyBatis를 쓰고 있다면 나는 TypeHandler를 한번 사용해보는 것을 추천한다.
입맛에 따라 이러한 결과를 XML에서 Control 할 수 있게 된다.
사용 방법
// CustomSecurityTypeHandler.java
public class CustomSecurityTypeHandler implements TypeHandler<String> {
private static StandardPBEStringEncryptor encryptor ;
private StandardPBEStringEncryptor textEncryptor ;
public CustomSecurityTypeHandler(){
encryptor = getTextEncryptor();
}
private StandardPBEStringEncryptor getTextEncryptor() {
if (textEncryptor == null) {
textEncryptor = new StandardPBEStringEncryptor();
textEncryptor.setProvider(new BouncyCastleProvider());
textEncryptor.setSaltGenerator(new ZeroSaltGenerator());
textEncryptor.setAlgorithm("CUSTOM_ALGORITHM");
textEncryptor.setPassword("CUSTOM_PASSWORD");
}
return textEncryptor;
}
@Override
public void setParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType)
throws SQLException {
if (parameter != null)
ps.setString(i, encryptor.encrypt(parameter.replace("-", "")));
}
@Override
public String getResult(ResultSet rs, String columnName) throws SQLException {
return !GenericValidator.isBlankOrNull(rs.getString(columnName)) ? encryptor.decrypt(rs.getString(columnName))
: null;
}
@Override
public String getResult(ResultSet rs, int columnIndex) throws SQLException {
return !GenericValidator.isBlankOrNull(rs.getString(columnIndex)) ? encryptor.decrypt(rs.getString(columnIndex))
: null;
}
@Override
public String getResult(CallableStatement cs, int columnIndex) throws SQLException {
return !GenericValidator.isBlankOrNull(cs.getString(columnIndex)) ? encryptor.decrypt(cs.getString(columnIndex))
: null;
}
}
<!-- exampleMapper.xml -->
<!-- Find member By member ID && password is encrypted -->
<select id = "finderMemberByPK" parameterType="customCommandMap" resultType="customMap">
SELECT * FROM Member WHERE member_id = ${member_id}
</select>
<resultMap type="customCommandMap" id ="customMap">
<id property="memberId" column="member_id"/>
<result property ="memberId" column="member_id/>
<result property ="memberPWD" column="member_pwd typeHandler="경로.CustomSecurityTypeHandler"/>
'개발 > [Spring]' 카테고리의 다른 글
[Spring] 스프링의 IoC & DI (0) | 2020.06.29 |
---|