본문 바로가기

💻Spring

JPA 프록시 객체 equals의 Override

반응형

개요

사이드 프로젝트 도중, Spring Security를 통해 인가된 회원을 통해 작업을 진행했다.

 

@AuthenticationPrincipal 어노테이션을 이용해 Members 엔티티를 가져와 작업을 처리했었는데

이 @AuthenticationPrincipal은 SpringSecurity에서 프록시 객체로 전달을 했다. 

 

다른 Domain의 테스트 코드를 작성하는 도중 Members의 일부 필드가 프록시로 되어있는경우

완전히 필드가 매핑되어있는 id가 같은 두 엔티티를 equals를 했을 때 false를 반환을 하였다. 

 

회원 1 엔티티

 

회원 2 엔티티

 

나는 이번 사이드 프로젝트의 Members 엔티티에 equals를 재정의 하지 않았었고, 이번에 서비스 코드를 작성하면서 

엔티티 자체를 비교해야 하는 상황이 자주 생겨 그 때마다 id값으로 비교하자니 너무 번거로워진다고 느껴 equals를 재정의하여 사용을 해보기로 했다.

 

본문

JPA에서는 Entity를 equals를 id값을 통해 비교하도록 재정의를 하였고

인텔리제이의 도움을 받아 일반적으로 id값으로만 이용하여 equals와 hashCode를 재정의하면 

위와 같은 코드가 나오지만,

 

프록시 객체의 경우 위의 getClass()를 비교하는부분에서 문제가 된다고 한다. (같은 Class가 아닌 프록시 객체와 원본 객체를 비교하는 경우이기 때문에)

따라서 프록시 객체의 경우 원본 객체를 상속하기 때문에 위 코드를 아래와 같이 수정 할 수 있었다.

결론

객체를 비교하기 위해서는 equals를 Override하고, JPA의 엔티티의 경우 프록시 객체를 가져와 비교하는 경우가 있기 때문에, getClass()를 이용한 비교가 아닌, instance of 를 사용하여 equals를 재정의 하도록 하자. 

반응형