개발/Java

[Lombok][Warning] 상속받은 클래스에 @Data만 사용하면 Warning이 뜨는 이유

nova_dev 2023. 1. 14. 00:00
반응형

프로젝트를 빌드할 때 종종 보이는 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.
@Data

위 에러가 빌드할 때 종종 에러로 올라오는 것을 보았는데, IntelliJ를 통해 수정하면 @EqualsAndHashCode(callSuper=true) 어노테이션을 붙여주며 해결하지만, 왜 필요한지 한번 알아보자.

예를 들어 아래와 같은 코드가 있다. Person이라는 클래스를 Worker가 상속하고 있고, 해당 클래스에 @Builder 어노테이션을 붙여준다.

@Data
public class Worker extends Person {
        perivate String position;
}

위 케이스에 빌드 시에 @Data만 사용하면 아래와 같은 워닝이 뜬다.

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.
@Data

왜 이런 워닝이 뜰까? 아시다시피, @Data 어노테이션은 아래와 같은 어노테이션을 포함하고 있다.

  • @Data 어노테이션
    • @Getter, @Setter, @ToString, @EqualsAndHashCode, @RequiredArgsConstructor 포함

위와 같이 @Data는 @EqualsAndHashCode를 포함하고 있는데, 만약 상속 구조라면 부모 클래스의 필드를 포함해서 EqualsAndHashCode를 생성할지, 자식 클래스만 대상으로 생성할지 Lombok이 보기에 불분명하기 때문에 우선 callSuper 옵션 값의 default인 false(부모 필드만으로 생성)로 만들긴 하지만 워닝을 띄워준다.

@EqualsAndHashCode(callSuper = true)

위 어노테이션을 붙여주지 않으면, 부모 클래스의 필드는 제외하고 EqualsAndHashCode를 생성해서 발생하는 warning이다.

일반적인 케이스에는 부모 클래스 필드까지 포함해서 EqualsAndHashCode를 생성하기 때문에 위 어노테이션을 붙이는 것이 맞지만, 만약 자식 클래스의 필드만을 포함하고 싶다면 유형에 '(callSuper=false)'를 추가하면 된다.

반응형