콘텐츠로 건너뛰기

JPA datetime 오류

JPA에서는 persistence context 라는 개념이 있어서, 사실상 DB와 Application 사이에 하나의 proxy가 더 존재한다. 캐시나 관리 등의 측면에서 장점도 분명이 있지만, mybatis와 같이 direct로 데이터를 주고 받을 때와 다르게 data의 sync가 맞지 않으면 곤란한 경우가 발생한다. 그 중에 하나가 datetime 문제이다.

위처럼 시간에 대한 역순을 출력하게 되면, 당연히 foo3, foo2, foo1의 출력을 기대하게 된다. 하지만 결과는 다음과 같다.

분명 쿼리는 created_at desc임에도 불구하고, 데이터는 asc 정렬로 표기된다. 그런데 rollback=false로 설정하여 DB 데이터를 확인해보면,

datetime에 대한 값이 milli-sec 단위는 잘려서 들어간다. 즉, desc ordering을 하더라도, 값이 동일하기 때문에 foo1, foo2, foo3으로 select 결과가 나온다. 다만, jpa에서는 persistence context에 해당 값들이 milli-sec 잘리지 않은 채로 캐시되어 있기 때문에, 정작 결과값은 desc ordering이 되지 않은 것처럼 출력이 된다. 실제로 각 save사이에 1초 sleep을 주게 되면, 원하는 값이 출력된다.

mysql에서 datetime(3) 또는 datetime(6) 으로 지정하면 괜찮아지긴한다. 다만, persistence context와 db의 값 sync가 맞지 않는 것만으로도 mybatis에 비해서 버그에 대한 노출은 더 많아졌다고 생각된다.

ref.

http://kwonnam.pe.kr/wiki/java/jpa/datetime
http://stackoverflow.com/questions/13344994/mysql-5-6-datetime-doesnt-accept-milliseconds-microseconds

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다