Entity의 equals 재정의하기

조현근·2022년 11월 6일
0
post-thumbnail

문제상황

속닥속닥 프로젝트를 진행하면서 도메인 로직 상 Entity의 equals를 재정의해야 할 일이 생겼다. 같은 Member인지 확인할 필요가 생겼는데, IntelliJ에서 제공하는 equals 재정의 기능을 이용해 아무생각 없이 재정의했더니 버그가 발생했다.

문제 해결

왜 이런 문제가 발생했는지 알아보자.
IntelliJ에서 제공하는 equals 재정의 기능에서 아무런 옵션을 주지 않으면 아래와 같이 equals가 재정의된다.

이 메서드를 사용하게 되면 몇가지 문제가 발생한다.

Proxy 객체와 엔티티를 비교하면 getClass() != o.getClass() 비교가 항상 true이다.

논리적으로 같은 엔티티와 프록시 객체일지라도 getClass를 이용해 비교하면 항상 둘은 다르다고 결과가 나온다. 또한 이 방법은 리스코프 치환원칙에도 위배된다. 따라서 !(o instance of Member)을 이용해 타입검사를 해야 한다.

Proxy 객체의 필드에 접근하면 항상 null이 반환된다.

proxy 객체는 필드가 없다. 매개변수로 Proxy 객체가 넘어온다면 proxy.<필드>는 null이 반환되기 때문에 제대로된 검사가 이루어지지 않는다. 따라서 getter를 이용해 프록시 초기화를 시켜주어야 equals 메서드가 정상적으로 동작한다.

제대로 구현된 equals 메서드

IntelliJ에서 제공하는 equals 자동 구현 기능에서 다음 체크박스들을 선택하면 잘 동작하는 equals 메서드를 얻을 수 있다.

profile
안녕하세요!

0개의 댓글