MyBatis resultType이 Map일경우 key를 소문자로 만들기

2017. 6. 28. 10:39framework/MyBatis


MyBatis resultType map 일경우 key 를 소문자로 만들기

 

 

보통 MyBatis 에서 resultType 으로 목록이나 데이터를 조회할 경우 VO 를 많이 사용한다.

 

하지만 VO가 아닌 map을 사용할 경우도 분명히 존재한다.

 

VO는 보통 camelCase 이거나 언더바를 포함한 소문자 명명규칙을 사용한다.

 

Map을 resultType를 선언할 경우에 key 가 대문자로 들어간다 (oracle 등에 한하여)

 

컬럼을 나타내는 변수나 key는 같은 룰을 따르는 것이 좋다고 생각한다.

 

그렇다면 Map의 Key를 camelCase 나 소문자로 변경해 주면 되겠다.

 

 

Map의 key를 소문자로 바꿔는 방법에는 어떤것들이 있을까...

 

고민해 보니 2가지 정도로 좁혀졌다.

 

첫번째는 루프를 돌면서 key를 모두 꺼내고 lowerCase로 치환하고 새로운 Map으로 조합해서 리턴하는 방법이다.

 

두번째는 Map을 상속받는 클래스를 생성하고 put 함수를 가로채 key를 lowerCase로 치환해주는 새로운 Map 객체를 만들어서 사용하는 것이다.

 



 

필자는 후자를 선택했다.

 

이유는 전자정부프레임워크 역시 후자를 택하고 있기 때문에 어느정도 검증된 방법이라 생각했다.

 

전자정부의 EgovMap 을 살펴보면 ListOrderedMap 를 상속받고 camelCase 로 key를 셋팅하도록 되어있다.

 

 

 

ListOrderedMap 을 상속받아 key를 소문자로 만들어 보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import org.apache.commons.collections.map.ListOrderedMap;
import org.apache.commons.lang.StringUtils;
 
public class LowerKeyMap extends ListOrderedMap {
    /** serialVersionUID */
    private static final long serialVersionUID = -7700790403928325865L;
 
    /**
     * key 에 대하여 소문자로 변환하여 super.put
     * (ListOrderedMap) 을 호출한다.
     * @param key
     *        - '_' 가 포함된 변수명
     * @param value
     *        - 명시된 key 에 대한 값 (변경 없음)
     * @return previous value associated with specified
     *         key, or null if there was no mapping for
     *         key
     */
    public Object put(Object key, Object value) {
        return super.put(StringUtils.lowerCase((String) key), value);
    }
}
cs

4# : ListOrderedMap을 상속받는다.

20# : key가 셋팅될 때 lowerCase를 사용하여 소문자로 변경하고 super.put을 호출한다.

 



 

mapper에서 다음과 같이 사용하면 된다.

1
2
3
<select id="selectId" resultType="package.LowerKeyMap">
    SELECT * FROM DUAL
</select>
cs