JAVA

[JAVA] Lombok @Data 애너테이션(어노테이션 Annotation)

인생아 2024. 10. 30. 17:43
반응형

@Data 애너테이션은 Java에서 Lombok 라이브러리를 통해 사용할 수 있는 매우 강력한 도구입니다. 이 애너테이션을 사용하면 간단하게 getter, setter, toString, equals, hashCode 메서드를 자동으로 생성할 수 있습니다. 이러한 메서드들은 데이터 클래스를 정의하는 데 필수적인 요소이기 때문에 @Data를 통해 간단하게 작성할 수 있습니다. 본 글에서는 @Data의 역할과 사용 시 주의점, 접근 제어 메서드의 커스터마이징 방법에 대해 알아보겠습니다.

@Data의 역할과 사용 시 주의점

@Data는 Lombok의 애너테이션 중 하나로, 클래스에 사용했을 때 여러 메서드를 자동으로 생성합니다. gettersetter 메서드는 물론, toString, equals, hashCode기본 생성자까지 생성되므로 데이터 클래스를 정의할 때 코드가 간결해집니다. 하지만 @Data 애너테이션을 사용할 때 몇 가지 주의할 점이 있습니다.

  1. 모든 필드에 대해 equals, hashCode가 생성되기 때문에, 민감한 데이터나 필드에 따라 결과가 달라지는 동작이 원하지 않는 경우 커스터마이징이 필요합니다.
  2. @Data모든 필드에 getter와 setter를 생성하기 때문에, 일부 필드를 read-only로 설정하고 싶다면 @Data 대신 개별 애너테이션을 사용하거나 접근 제어를 따로 설정해야 합니다.

예제 코드

import lombok.Data;

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

위의 예제에서 User 클래스는 @Data 애너테이션을 사용하여 getter, setter, toString, equals, hashCode 메서드를 자동으로 생성합니다. @Data를 사용하면 코드가 간결해져 데이터 클래스 생성에 매우 유용합니다.

@Data가 만드는 메서드와 접근 제어

@Data 애너테이션은 다양한 접근 메서드를 자동으로 생성합니다. 이를 통해 클래스의 필드를 캡슐화하고, gettersetter 메서드를 통해 필드에 접근할 수 있습니다. @Data 애너테이션으로 생성되는 메서드들은 다음과 같습니다:

  1. Getter와 Setter 메서드: 모든 필드에 대해 gettersetter를 생성합니다.
  2. toString 메서드: 객체의 필드 값을 문자열로 변환하는 toString 메서드를 생성합니다.
  3. equals 메서드: 객체의 필드 값이 동일한지 비교하는 equals 메서드를 생성합니다.
  4. hashCode 메서드: 해시 코드를 생성하여 객체의 고유한 값을 반환합니다.

기본적으로 모든 필드에 대해 접근 메서드가 생성되지만, 필요에 따라 특정 메서드만 생성하도록 설정할 수 있습니다.

접근 제어 예제

import lombok.Data;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.Setter;

@Data
public class Product {
    private String name;

    @Setter(AccessLevel.NONE) // 가격을 외부에서 수정 불가능하게 설정
    private double price;

    @Getter(AccessLevel.NONE) // 수량은 외부에서 조회 불가능하게 설정
    private int quantity;
}

위 예제에서 Product 클래스의 price 필드는 setter 메서드를 생성하지 않아 값을 변경할 수 없고, quantity 필드는 getter 메서드를 제공하지 않으므로 값을 읽을 수 없습니다. 이러한 방식으로 @Data 애너테이션과 개별 @Getter@Setter 애너테이션을 결합하여 필요한 필드만 접근 제어할 수 있습니다.

반응형

@Data 사용 시 Equals, HashCode의 커스터마이징 방법

equalshashCode 메서드는 객체의 동일성과 해시 값을 비교하는 데 필수적입니다. @Data 애너테이션은 자동으로 이 메서드들을 생성하지만, 특정 필드만을 비교 대상으로 설정하거나 제외해야 하는 경우에는 Lombok의 @EqualsAndHashCode 애너테이션을 활용할 수 있습니다.

예제 코드 - 특정 필드 커스터마이징

import lombok.Data;
import lombok.EqualsAndHashCode;

@Data
@EqualsAndHashCode(of = {"name"}) // name 필드만을 비교 대상으로 설정
public class Employee {
    private String name;
    private int age;
    private String department;
}

위 예제에서 Employee 클래스는 name 필드만을 기반으로 equalshashCode 메서드를 생성하므로, name 필드가 같으면 동일한 객체로 인식됩니다. departmentage는 비교 대상에서 제외됩니다.

해시 코드와 equals 커스터마이징 예제

import lombok.Data;
import lombok.EqualsAndHashCode;

@Data
@EqualsAndHashCode(exclude = "id") // id 필드는 hashCode 및 equals에서 제외
public class Order {
    private String id; // 데이터베이스 고유 ID
    private String product;
    private double price;
}

Order 클래스에서 id 필드는 데이터베이스 고유 ID로, equalshashCode에서 제외되어도 무방한 경우입니다. 이 설정으로 id 값과 상관없이 productprice 필드만으로 객체 동일성을 판단하게 됩니다. 이처럼 @EqualsAndHashCode 애너테이션을 통해 비교할 필드와 제외할 필드를 지정하여 코드의 유연성을 높일 수 있습니다.

참고사이트

반응형