JPA의 AttributeConverter를 사용할 때 주의할 점

Solomon Maeng
2 min readJul 9, 2021

--

AttributeConverter는 커스텀한 Value Object를 데이터베이스에 저장하거나, 데이터베이스에 저장된 값을 커스텀한 Value Object로 자동 변환을 위해서 사용한다.

최근 한 프로젝트를 진행하며, 부끄러운 얘기지만 한가지 실수 했던 점에 대해서 얘기해보려고 한다.

프로젝트에서 포인트 적립이라는 개념을 구현하고 있었는데, 포인트라는 커스텀한 값 객체를 만들어서 포인트 객체가 값에 대한 증가 및 감소 오퍼레이션을 담당하게끔 하였다.

기본적으로 Value Object라는 개념을 Java에서 구현할 때는 Equals와 HashCode를 구현하여 값의 동등성을 보장하고, 값이 변경되어야 한다면, 새로운 객체로 대체할 수 있도록 구현해야 한다.

하지만 나는 Point라는 값 객체를 구현할 때 Equals와 HashCode를 구현하지 않았다…

Value Object의 값의 동등성을 보장하지 않은 채로, AttributeConverter를 사용하였고 다른 도메인에서 Point 객체를 의존하여 JPA로 Persist를 할 때, insert 후에 update 쿼리가 나가서, 매우 당황했다.

찬찬히 원인을 분석하기 위해 DynamicUpdate를 붙여서 Update 시에 어떤 속성이 변경되는지를 알아보았고, Point가 변경이 된다는 것을 알 수 있었다.

JPA에서는 커스텀한 값 객체가 값의 동등성을 보장하지 않기 때문에, 같은 값이 Persist 되어도 트랜잭션이 커밋될 때 insert후에 update 쿼리가 발생하는 것이었다.

코드를 작성할 때, 항상 왜 이렇게 한 건지 남에게 타당성을 가지고 설명하도록 만드는 걸 초점으로 두었던 나인데, 당연한 원칙조차 지키지 않은 채로 구현을 해버려서 이런 상황을 맞이하게 되었다.

AttributeConverter를 사용하는 것 뿐만 아니라, JPA에서는 원래 Equals와 Hashcode를 Entity에서 구현하게끔 가이드하고 있다.

AttributeConverter를 사용할 때, 꼭 Equals HashCode를 구현하자..ㅠ

--

--

No responses yet