개발/Spring

Spring에서 @Data 어노테이션

피터JK 2025. 2. 5. 09:29
728x90

Spring Boot 개발 시 보일러플레이트 코드를 줄이기 위해 Lombok을 많이 사용합니다.
그중 @Data 어노테이션은 자주 사용되지만, 주의해서 사용해야 할 부분도 있습니다.
이번 포스팅에서는 @Data 어노테이션의 기능과 사용법, 그리고 JPA와 함께 사용할 때의 주의사항을 정리해보겠습니다.


📌 @Data 어노테이션이란?

@Data는 Lombok에서 제공하는 어노테이션으로, 클래스에 선언하면 다음 기능을 자동으로 생성해줍니다.

✅ @Data의 주요 기능

  1. Getter 메서드 (@Getter)
    • 모든 필드에 대한 get 메서드 자동 생성
  2. Setter 메서드 (@Setter)
    • final이 아닌 모든 필드에 대한 set 메서드 자동 생성
  3. toString() (@ToString)
    • 모든 필드를 포함하는 toString() 메서드 자동 생성
  4. equals() 및 hashCode() (@EqualsAndHashCode)
    • 모든 필드를 비교하는 equals() 및 hashCode() 메서드 자동 생성
  5. 기본 생성자 (@RequiredArgsConstructor)
    • final 또는 @NonNull 필드를 포함하는 생성자 자동 생성

📌 @Data 사용법

간단한 DTO를 만들 때 @Data를 사용하면 매우 편리합니다.

import lombok.Data;

@Data
public class User {
    private String name;
    private int age;
}

위 클래스를 작성하면 자동으로 다음과 같은 코드가 생성됩니다.

public class User {
    private String name;
    private int age;

    public String getName() { return name; }
    public void setName(String name) { this.name = name; }

    public int getAge() { return age; }
    public void setAge(int age) { this.age = age; }

    @Override
    public String toString() {
        return "User(name=" + name + ", age=" + age + ")";
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        User user = (User) o;
        return age == user.age && Objects.equals(name, user.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
}

위와 같이 Lombok이 자동으로 코드를 생성해주므로 개발자가 직접 작성할 필요가 없습니다.


📌 @Data 사용 시 주의할 점

1. 모든 필드에 대한 getter와 setter가 자동 생성됨

  • 필드 값을 변경하면 안 되는 경우 @Data 대신 @Value(불변 객체)를 사용하는 것이 좋습니다.

2. 모든 필드를 equals() 및 hashCode()에서 사용

  • 특정 필드만 비교하고 싶다면 @EqualsAndHashCode(exclude = "필드명")을 사용할 수 있습니다.

3. JPA 엔티티에서 사용 시 주의

  • @Data는 @ToString을 포함하므로, @OneToMany, @ManyToOne 관계가 있을 경우 무한 루프가 발생할 수 있습니다.
  • JPA 엔티티에서는 @Getter, @Setter를 개별적으로 사용하는 것이 좋습니다.

📌 JPA 엔티티에서는 @Data 대신 @Getter, @Setter 사용

import lombok.Getter;
import lombok.Setter;
import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
@Getter
@Setter
public class User {
    @Id
    private Long id;
    private String name;
}
  • @Data 대신 @Getter, @Setter만 사용하면 불필요한 toString(), equals(), hashCode() 메서드 생성이 방지되어 JPA에서 안전하게 사용할 수 있습니다.

📌 결론

  • 간단한 DTO(데이터 전송 객체)에는 @Data 사용 가능
  • JPA 엔티티에는 @Getter, @Setter 개별 사용 권장
  • 불변 객체가 필요하면 @Value 사용

Lombok의 @Data는 코드량을 줄이고 유지보수성을 높이는 강력한 도구이지만, JPA와 함께 사용할 때는 신중한 접근이 필요합니다. 필요에 따라 @Getter, @Setter, @EqualsAndHashCode 등을 개별적으로 적용하는 것이 더 안전할 수 있습니다.

🚀 Spring 프로젝트에서 Lombok을 잘 활용하여 더욱 효율적인 개발을 해보세요!

728x90