*/Spring

[JPA] 엔티티 equals 메서드 구현 시 주의할 점

sssbin 2024. 11. 8. 21:36

 

개발 진행 중, 프론트 분께 아래와 요청을 받았다.

해당 내용을 확인해보니, Member에 equals 메서드를 이렇게 구현하고 있었다.

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    Member member = (Member) o;
    return Objects.equals(idMember, member.idMember);
}

프린트 찍어보니까

하나는 프록시 객체라서 false를 반환했던 것..!

그래서 하이버네이트 객체의 클래스를 불러오도록 수정해줬다.

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || Hibernate.getClass(this) != Hibernate.getClass(o)) return false;
    Member member = (Member) o;
    return Objects.equals(idMember, member.idMember);
}

하지만 여기서 또 문제가 발생한다.

member의 pk값을 찍으니 null로 출력되었다.

그래서 또 다시 false를 반환했다.

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || Hibernate.getClass(this) != Hibernate.getClass(o)) return false;
    Member member = (Member) o;
    return Objects.equals(this.getIdMember(), member.getIdMember());
}

따라서 엔티티의 getter 메서드를 이용하여 비교해줬다. 이 방식은 필드에 접근하면서 Hibernate가 프록시 객체를 초기화하도록 유도하는 방법이라고 한다.

잘 출력된다. 앞으로 주의하도록 하자.