@Data 애너테이션은 Java에서 Lombok 라이브러리를 통해 사용할 수 있는 매우 강력한 도구입니다. 이 애너테이션을 사용하면 간단하게 getter, setter, toString, equals, hashCode 메서드를 자동으로 생성할 수 있습니다. 이러한 메서드들은 데이터 클래스를 정의하는 데 필수적인 요소이기 때문에 @Data를 통해 간단하게 작성할 수 있습니다. 본 글에서는 @Data의 역할과 사용 시 주의점, 접근 제어 메서드의 커스터마이징 방법에 대해 알아보겠습니다.
@Data의 역할과 사용 시 주의점
@Data는 Lombok의 애너테이션 중 하나로, 클래스에 사용했을 때 여러 메서드를 자동으로 생성합니다. getter와 setter 메서드는 물론, toString, equals, hashCode와 기본 생성자까지 생성되므로 데이터 클래스를 정의할 때 코드가 간결해집니다. 하지만 @Data 애너테이션을 사용할 때 몇 가지 주의할 점이 있습니다.
- 모든 필드에 대해 equals, hashCode가 생성되기 때문에, 민감한 데이터나 필드에 따라 결과가 달라지는 동작이 원하지 않는 경우 커스터마이징이 필요합니다.
- @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 애너테이션은 다양한 접근 메서드를 자동으로 생성합니다. 이를 통해 클래스의 필드를 캡슐화하고, getter와 setter 메서드를 통해 필드에 접근할 수 있습니다. @Data 애너테이션으로 생성되는 메서드들은 다음과 같습니다:
- Getter와 Setter 메서드: 모든 필드에 대해 getter와 setter를 생성합니다.
- toString 메서드: 객체의 필드 값을 문자열로 변환하는 toString 메서드를 생성합니다.
- equals 메서드: 객체의 필드 값이 동일한지 비교하는 equals 메서드를 생성합니다.
- 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의 커스터마이징 방법
equals와 hashCode 메서드는 객체의 동일성과 해시 값을 비교하는 데 필수적입니다. @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 필드만을 기반으로 equals와 hashCode 메서드를 생성하므로, name 필드가 같으면 동일한 객체로 인식됩니다. department나 age는 비교 대상에서 제외됩니다.
해시 코드와 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로, equals와 hashCode에서 제외되어도 무방한 경우입니다. 이 설정으로 id 값과 상관없이 product와 price 필드만으로 객체 동일성을 판단하게 됩니다. 이처럼 @EqualsAndHashCode 애너테이션을 통해 비교할 필드와 제외할 필드를 지정하여 코드의 유연성을 높일 수 있습니다.
참고사이트
- Lombok 공식 사이트: https://projectlombok.org
'JAVA' 카테고리의 다른 글
[JAVA] Lombok 조건부 애너테이션, 어노테이션 (0) | 2024.10.31 |
---|---|
[JAVA] Lombok 로깅 처리 (@Slf4j, @Log 등) (0) | 2024.10.31 |
[JAVA] Lombok 애너테이션, 어노테이션 (@Value, @Singular, @SuperBuilder) (0) | 2024.10.31 |
[JAVA] Lombok Lazy Getter(lazy=true)와 Setter (0) | 2024.10.31 |
[JAVA] Lombok Builder 패턴과 활용 (1) | 2024.10.30 |
[JAVA] Lombok 어노테이션, 애너테이션(Annotation)의 기본 사용법 (0) | 2024.10.30 |
[JAVA] Lombok 환경 설정 (1) | 2024.10.30 |
[JAVA] Lombok 이란? (0) | 2024.10.30 |