달력

072010  이전 다음

최근 스프링을 사용하는 고객이 다음과 같은 문제를 올렸다: Long 타입이 oracle에 integer로 맵핑되는 문제

DTO 객체에서 Long으로 정의한 필드 값이 insert나 update할 때 integer 처럼 들어간다는 것이었다.


확인해보니 integer 처럼이 아니라 Integer로 들어가게 되어 있었다. 동료가 문제를 찾았는데 내가 그 코드를 확인해보니 문제가 없었다. :) 로컬에 서로 첨부한 소스 버전이 달랐다. 구글링을 해보니 쉽게 버그 리포팅을 찾을 수 있었다: SPR-4840

 javaTypeToSqlTypeMap.put(long.class, new Integer(Types.INTEGER));
javaTypeToSqlTypeMap.put(Long.class, new Integer(Types.INTEGER));  

2.5.3 버전에서 버그를 찾은 Pavel Marinchev은 수정할 코드까지 제시했다:

  javaTypeToSqlTypeMap.put(long.class, new Integer(Types.BIGINT));
 javaTypeToSqlTypeMap.put(Long.class, new Integer(Types.BIGINT));

StatementCreatorUtils 클래스 소스를 보면 정적 블럭으로 초기화하는 코드 중에 이를 볼 수 있다. 아쉽게도 해당 버그에 대한 테스트 코드[각주:1]는 찾을 수 없었지만, 2.5.5 ChangeLog에서 변경사항을 찾을 수 있었다:
* BeanPropertySqlParameterSource uses specific integer/decimal SQL types by default now (e.g. TINYINT, BIGINT, DOUBLE)

spring.jar 라는 jar 파일만 보면 버전을 알 수 없다. Manifest를 열어보니 2.5.4 임을 확인할 수 있었다. 이럴 때는 번거롭더라도 Maven을 사용하여 라이브러리를 명시적으로 관리하는 것이 이점이 있어 보인다. 일민형이랑 채팅하다가 'jar 버전 테스트를 해야 한다'는 말에 바로 테스트를 추가하기로 했다. 권남님한테 배운 것인데 SpringVersion 클래스를 이용하면 매우 쉽게 테스트 작성이 가능했다.

assertEquals("2.5.6", SpringVersion.getVersion());

참고로 2.5.6 과 2.5.4 버전에서 위에 언급한 코드 차이를 보여주는 부분을 첨부한다.


  1. 스프링은 종종 이슈/버그에 대해 별도의 테스트 메소드를 만들어두기도 한다. 매우 훌륭한 프랙티스인데 조만간 관련 글을 쓸 것이다. [본문으로]
Posted by 영회