IronKim / fs-project-board

게시판 만들기 프로젝트. 자바 + 스프링부트와 관련 기술들을 공부한다.
0 stars 0 forks source link

엔티티 equals() 버그 수정 #43

Closed IronKim closed 9 months ago

IronKim commented 9 months ago

각 엔티티 클래스의 equals() 구현에 버그가 있는 것 같다

IronKim commented 9 months ago

버그는 equals(), hashcode() 안에서 각 클래스 필드들을 비교하기 위해 접근할 떄, 직접 접근(direct field access)을 했기 때문이다. jpa 엔티티는 그대로 인스턴스로 만들어 사용하는게 아니라, jpa 구현체 - spring data jpa 에서는 하이버네이트 - 에 의해 프록시 인스턴스로 만들어진다. 때문에 직접 접근을 하면 프록시가 되기 전, 후 인스턴스의 차이로 equals, hashcode 가 제대로 각 필드를 참조하지 못할 수 있다. 하지만 getter 와 같이 메소드를 이용해 필드에 접근하면 프록시 인스턴스가 된 이후에도 명확하게 각 필드에 접근할 수 있기 때문에 entity 안의 equals, hashcode를 구현할 때는 getter를 사용해야 한다.

이를 정리한 기술 블로그가 여럿 있는데, 그 중 유명한 jpa buddy 플러그인을 만드는 회사의 블로그 글을 첨부하니 공부에 참고할 것. 내용이 많은데 getter method로 검색하면 원하는 문서 부분을 좀 더 빨리 찾을 수 있다.

https://jpa-buddy.com/blog/hopefully-the-final-article-about-equals-and-hashcode-for-jpa-entities-with-db-generated-ids