보통 DB table을 작성할때 column명에 대문자와 언더바(_)를 한 형태로 작업을 많이한다.
PHOTO_NUM, PHOTO_PROFILE, USER_ID, GROUP_AUTH
이렇게 만들어진 테이블 컬럼은 JAVA에서 불러와서 쓸때 복잡해질 수 있다.
보통 JAVA는 CamelCase형태를 사용한다. 변수에 처음엔 소문자로 시작해, 두번째 단어에 첫글자를 대문자로 작성하는 방식이다.
photoNum, photoProfile, userId, groupAuth
그럼 일일히 sql문을 요청한자료를 map.put에 넣어서 쓰기에도 엄청 번거로운 작업이된다.
//당신은 이렇게 할건가요?
Map map = new HashMap();
Map results = dbtestMP.getPhotoInfo();
map.put("photoNum", results.get("PHOTO_NUM"));
map.put("photoProfile", results.get("PHOTO_PROFILE"));
map.put("userId", results.get("USER_ID"));
map.put("groupAuth", results.get("GROUP_AUTH"));
그렇다고 그냥 가져다 쓸려고 하면, 정해진 약속을 어기는 셈이라 다른 개발자들하고 소통에 문제가 생길 수도 있다.
이럴때 Mybatis Intercepter를 이용하여 결과를 얻기 전 Camelcase type으로 변경해주면 좋을 것이다.
@Intercepts({ @Signature(args = {Statement.class }, method = "handleResultSets", type = ResultSetHandler.class) })
public class MybatisResultHandlerInterceptor implements Interceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
Object preResult = invocation.proceed();
if (preResult instanceof List)
preResult = convert2Camel((List)preResult);
return preResult;
}
private List convert2Camel(List preResult) {
List<Object> list = (List) preResult;
List<Object> result = new ArrayList<Object>();
for(Object data : list) {
if(data instanceof Map){
data = convert2Camel((Map) data);
result.add(data);
}else {
result.add(data);
}
}
return result;
}
private Map convert2Camel(Map preResult) {
Map<String, Object> map = (Map<String, Object>) preResult;
Map<String, Object> result = new HashMap<String, Object>();
Iterator<String> i = map.keySet().iterator();
while(i.hasNext()) {
String key = i.next();
Object value = map.get(key);
key = convert2Camel(key);
result.put(key, value);
}
return result;
}
private String convert2Camel(String preResult) {
if(preResult.indexOf("_")<0 && Character.isLowerCase(preResult.charAt(0))) {
return preResult;
}
boolean changeUpper = false;
int len = preResult.length();
StringBuilder result = new StringBuilder();
for(int i=0; i<len; i++) {
char Char = preResult.charAt(i);
if(Char == '_') {
changeUpper = true;
}else {
if(changeUpper == true) {
result.append(Character.toUpperCase(Char));
changeUpper = false;
}else {
result.append(Character.toLowerCase(Char));
}
}
}
return result.toString();
}
}
이전 포스트에 Intercepter에 대한 설명이 있으므로 끝내겠다.
https://velog.io/@sin8282/Mybatis-Configuration-Intercepter1DB%EC%95%94%ED%98%B8%ED%99%94