프로젝트 개발 중 기본을 다시 생각하게 되는 이슈를 만나 이렇게 정리하게되었다.
2개의 List 값을 비교하고 동일한 값이 있을 경우 removeAll 메소드를 사용하여 값을 삭제하려고 하였다.
첫번째 List의 경우 Redis cache에서 가져온 값이고 두번째 List의 경우 RDB에서 조회해온 값으로, 두 객체의 값은 동일하였지만 삭제가 되지 않는 이슈가 발생하였다.
주소값이 달라 서로 다른 객체로 판단했기 때문이다.
removeAll의 경우 요소들을 contains메소드로 체크하는데 contains는 Objects.equals로 요소의 포함 여부를 체크한다. equals method는 주소 값이 다른 객체는 서로 다른 객체로 판단하기 때문에 삭제가 이루어 지지 않은 것이었다.

@EqualsAndHashCode 사용
=> of 옵션을 사용하여 id 필드를 명시하여 사용하였다.
권장하는 방법
위에 이슈를 해결하면서 공부한 equalsa와 hashCode에 대해 다시 정리해보려고 한다.
만약 equals()와 hashcode() 중 하나만 재정의 하면 어떻게 될까? 위 예에서도 봤듯이 hashcode()를 재정의 하지 않으면 같은 값 객체라도 해시값이 다를 수 있다. 따라서 HashTable에서 해당 객체가 저장된 버킷을 찾을 수 없다.
반대로 equals()를 재정의하지 않으면 hashcode()가 만든 해시값을 이용해 객체가 저장된 버킷을 찾을 수는 있지만 해당 객체가 자신과 같은 객체인지 값을 비교할 수 없기 때문에 null을 리턴하게 된다. 따라서 역시 원하는 객체를 찾을 수 없다.
마치며
프로젝트를 진행하다 보면 이런 기본적인 내용을 다시 한번 공부하게 되는 시간이 자주 발생하는 것 같다..ㅎ 이렇게라도 기본을 다시 챙기면서 가자..ㅎ
많은 도움이 되었습니다, 감사합니다.