백엔드/Java

[lombok]@Data 주의사항

개발자K씨 2023. 12. 26. 20:29

Lombok의 @Data 어노테이션은 클래스에 대해 getter, setter, toString(), equals(), hashCode() 메소드 및 기본 생성자를 자동으로 생성해줍니다. 이는 개발자가 이러한 보일러플레이트 코드를 직접 작성하지 않아도 되게 하여, 개발 속도와 가독성을 크게 향상시킵니다. 그러나 사용 시 주의해야 할 몇 가지 사항이 있습니다.

@Data 어노테이션 사용 시 주의점

  1. 무분별한 Setter 사용: @Data는 클래스의 모든 필드에 대해 setter 메소드를 생성합니다. 이는 불변성(Immutability)을 해치고 객체의 상태를 예기치 않게 변경할 수 있어, 특히 멀티스레드 환경에서 문제가 될 수 있습니다.
  2. equals()와 hashCode() 구현: @Data는 이 두 메소드를 모든 필드를 포함하도록 구현합니다. 이는 성능 저하를 일으킬 수 있으며, 특히 순환 참조가 있는 경우에는 스택 오버플로우를 발생시킬 수 있습니다.
  3. 엔티티 클래스에의 사용: JPA와 같은 ORM 프레임워크를 사용할 때, 엔티티 클래스에 @Data를 사용하는 것은 권장되지 않습니다. JPA는 엔티티의 동등성 비교와 프록시 메커니즘에 의존하는데, Lombok이 생성하는 equals()와 hashCode() 구현이 이를 방해할 수 있습니다.
  4. 데이터 전송 객체(DTO) 사용 시 주의: DTO에 @Data를 사용할 때는, 불변성을 유지할 필요가 없는 경우에만 사용해야 합니다. DTO가 변경 가능한 상태를 갖는 경우, 예기치 않은 사이드 이펙트가 발생할 수 있습니다.
  5. API 노출과의 관계: @Data는 모든 필드에 대해 getter와 setter를 생성합니다. 이는 민감한 데이터가 포함된 클래스에 사용될 때 보안 문제를 일으킬 수 있습니다.
  6. 커스텀 로직 추가의 어려움: 자동으로 생성된 메소드에 추가적인 로직을 넣고 싶은 경우, @Data 어노테이션만으로는 한계가 있습니다. 이럴 때는 @Getter, @Setter 등 필요한 부분에만 어노테이션을 적용하는 것이 나을 수 있습니다.

결론

@Data 어노테이션은 매우 편리하고 코드를 간결하게 만들어주지만, 사용 시 그 한계와 부작용을 잘 이해하고 주의해서 사용해야 합니다. 특히, 불변성이 중요하거나 복잡한 비즈니스 로직을 포함하는 클래스에는 더 세밀한 제어가 필요할 수 있으므로, 이 경우에는 @Data보다는 더 명시적인 Lombok 어노테이션들을 선택하는 것이 좋습니다.