JPA 사용 중 복합키를 사용할 일이 있어서 @IdClass에 사용할 PK클래스를 만들고
엔티티에 @EqualsAndHashCode 롬복 어노테이션을 적용하였다.
테스트 코드 실행 시, 아래와 같은 warning 메세지가 나왔다.
warning: Generating equals/hashCode implementation but without a call to superclass, even though this class does not extend java.lang.Object. If this is intentional, add '@EqualsAndHashCode(callSuper=false)' to your type.
대강 해석하자면 'equals/hashCode 를 만드는데 부모클래스를 call 하지 않고, 다른 오브젝트를 확장하진 않는다. 만약 클래스 내부적으로만 사용할것이라면 '@EqualsAndHashCode(callSuper=false)' 를 추가해라' 인데,
callSuper = true : 부모 클래스 필드 값도 동일한지
callSuper = false : 해당 클래스 내 필드 값만 동일한지
실제 코드 상에 적용할 때도 default 값으로 false 가 세팅되어 있지만 명시적으로 false를 적어 넣는것을 말하고 있다.
롬복 자체가 편리하기는 하지만 직접 코드를 작성해주는것이 아닌 어노테이션을 읽고 클래스 파일에 코드를 생성해주기 때문에 의도치 않는 동작을 하는 경우가 발생한다.
(만약 롬복 버전이 달라지면서 defalut 값이 true로 바뀐다면...?)
해당 코드에서는 사용되지 않았지만 '@Data 어노테이션'을 쓰는 것이 아닌 필요한 어노테이션을 골라 사용하되 구현하고자 하는 기능에 맞춰 옵션을 세팅해주는 것이 좋아보인다.
물론 모든 상황에 대비하자는건 아니다. 개발자의 성향에 따라 [warning] 정도는 넘어가기도하고 필자 또한 그런 경우가 꽤 있었다 생각한다. 하지만 하나씩이라도 바꿔나가면 더 좋은 코드, 프로그램이 되리라 생각한다.