spring util:map 사용 시 key와 value 타입 지정

spring에서 제공해 주는 util:map 기능을 사용하여 xml 파일에 다음과 같이 에러 코드를 정의해 주었다.

<util:map id="loginCheckErrorCodes" map-class="java.util.HashMap">

<entry key="3102" value="NET_ERR_SESSION_NOT_FOUND" />

<entry key="3100" value="NET_ERR_SESSION_TIME_OUT" />

</util:map>


이와 같이 선언하게 되면 key, value 는 String 타입으로 지정되어 HashMap 객체에 저장이 된다.


아이러니한건 스프링 DI 방식을 이용하여 다음과 같이 객체 주입을 해도 예외가 발생되지 않는 다는 것이다.

@Resource(name = "loginCheckErrorCodes")

private Map<Integer, String> loginCheckErrorCodes;


에러가 발생될 것이라 예상을 하게된 이유는 DI로 주입 받는 Map 클래스의 key 타입이 Integer로 되어 있기 때문이다. 자동으로 type conversion이 발생되어 key 타입이 Integer형으로 바뀐것일까?


만약 type conversion으로 인하여 key 타입이 Integer로 변경되었다면  loginCheckErrorCodes.containsKey(3100) 의 코드는 true를 return할까?

결론은 내가 생각한 것과 반대로 false를 return한다.


HashMap 객체의 key 값이 어떻게 들어가 있는지를 확인하기 위해 breakpoint를 이용하여 디버깅 해보았고, 다음과 같이 String 타입의 key가 저장되어 있는 것을 확인할 수 있었다.


  • String type


  • Integer type


결국 loginCheckErrorCodes.containsKey(3100) 코드를 정상적으로 동적시키기 위해 3100을 String 형으로 변환해야 한다는 것인데 불필요한 코드가 추가되는 것 같아 loginCheckErrorCodes 빈이 DI 될 때 key의 타입을 변환시키는 방법이 있는지 찾아봤다.


역시 스프링에는 나의 고민을 해결해 줄 방법이 존재했다.

map 엘리먼트에 key-type, value-type attribute가 존재하는 것이다.


다음과 같이 key-type="java.lang.Integer" attribute를 추가해 주면 key 값이 Integer형으로 변환되어 DI된다.

<util:map id="loginCheckErrorCodes" key-type="java.lang.Integer" value-type="java.lang.String" map-class="java.util.HashMap">

<entry key="3102" value="NET_ERR_SESSION_NOT_FOUND" />

<entry key="3100" value="NET_ERR_SESSION_TIME_OUT" />

</util:map>