프로젝트를 진행하다가 @Data의 위험성을 느껴 공부한 내용을 정리하고자 합니다.
@Data 어노테이션이란❓
@Data는 Lombok 라이브러리에서 제공하는 어노테이션으로, Java 클래스에 대해 다양한 메서드를 자동으로 생성해 주는 기능을 제공합니다. @Data 어노테이션을 사용하면, 다음과 같은 메서드들이 자동으로 생성됩니다.
1. Getter 메서드
- 클래스의 모든 필드에 대해 get 접두사가 붙은 메서드를 생성합니다.
- 예를 들어, private String name;이라는 필드가 있으면, getName() 메서드가 생성됩니다.
2. Setter 메서드
- 클래스의 모든 필드에 대해 set 접두사가 붙은 메서드를 생성합니다.
- 예를 들어, private String name;이라는 필드가 있으면, setName(String name) 메서드가 생성됩니다.
3. toString() 메서드
- 클래스의 모든 필드를 포함한 toString() 메서드를 생성합니다.
- 이 메서드는 객체의 문자열 표현을 반환합니다.
4. equals() 메서드
- 클래스의 모든 필드를 비교하여 객체의 동등성을 판단하는 equals(Object obj) 메서드를 생성합니다.
5. hashCode() 메서드
- equals()와 함께 사용하는 hashCode() 메서드를 생성합니다.
- 이 메서드는 객체의 해시 코드를 반환합니다.
6. requiredArgsConstrucor 메서드
- final 필드와 @NonNull로 주석이 달린 필드를 포함하여, 인자를 가지는 생성자를 자동으로 생성합니다.
import lombok.Data;
@Data
public class Person {
private String name;
private int age;
}
위와 같은 클래스를 정의하면, lombok은 자동으로 다음과 같은 메서드를 생성합니다.
- getName()
- setName(String name)
- getAge()
- setAge(int age)
- toString()
- equals(Object obj)
- hashCode()
- 생성자(필드가 final로 선언되어 있으면)
@Builder 어노테이션이란❓
빌더 패턴은 복잡한 객체를 단계별로 구성하고 생성하는 디자인 패턴으로, 객체의 생성과 초기화를 유연하게 관리할 수 있게 해 줍니다.
@Builder 어노테이션은 Lombok에서 제공하며, 이 패턴을 자동으로 구현하여, 객체의 속성을 설정한 후 build() 메서드를 호출하여 객체를 생성할 수 있도록 도와줍니다.
빌더 패턴과 @Builder 어노테이션에 대한 자세한 설명은 아래의 포스팅에서 확인 가능합니다.▼
@Data와 @Builder의
프로젝트를 진행하다가 @Data어노테이션과 @Builder를 같이 사용했었습니다.
그런데 @Data에는 위와 같이 Getter, Setter, RequiredArgsConstructor, ToString, HashCode, Value을 지원합니다.
여기서 주목해야 할 점은 Setter입니다. @Data와 @Builder와 함께 사용하는 것은 가능합니다.
그러나 몇 가지 주의사항이 있는데, 이 두 어노테이션의 사용은 일반적으로 문제를 발생시키지 않지만, 특정 상황에서 충돌이나 예상치 못한 동작이 발생할 수 있습니다.
- @Data는 객체의 모든 필드에 대해 Setter 메서드를 자동으로 생성합니다.
- 반면, @Builder 어노테이션은 빌더 패턴을 자동으로 구현하여, 객체를 생성할 때 불변성을 유지하는 것이 일반적입니다. 그러나 @Data와 @Builder를 함께 사용할 경우, 불변성이 깨질 수 있습니다.
- 이는 빌더로 객체를 생성한 후에도 Setter를 통해 필드를 수정할 수 있기 때문에, 객체의 불변성 장점을 상실할 수 있습니다.
따라서 @Data와 @Builder를 함께 사용하는 경우, 컴파일 에러는 발생하지 않지만 데이터의 불변성이 깨질 수 있는 문제점이 존재하기 때문에 다음과 같은 방법으로 해결해야 합니다.
불변 객체 설계
- @Value 사용
- Lombok의 @Value 어노테이션을 사용하여 객체를 불변으로 만들 수 있습니다.
- @Value는 필드를 final로 설정하고,
Setter를 생성하지 않으므로 불변 객체를 보장합니다.
Setter 제거
- @Data 대신 @Getter와 @Setter를 명시적으로 사용하고, @Builder와 함께 사용하되, 객체의 불변성을 유지하려면 객체 생성 후 상태를 변경하지 않도록 주의해야 합니다.
'TIL,일일 회고' 카테고리의 다른 글
[TIL, 일일 회고] 2024.08.11 - MapStruct의 편리함 (0) | 2024.08.11 |
---|---|
[TIL, 일일회고] 2024.08.10 - DTO 사용 시 고려해야 할 주요 문제점과 해결책 (0) | 2024.08.10 |
[TIL, 일일 회고] 2024.08.08 - gitignore (gradle-wrapper.jar &properties) (0) | 2024.08.08 |
[TIL,일일 회고] 2024.08.07 - Spring Cloud Stream이란❓ (0) | 2024.08.07 |
[TIL,일일 회고] 2024.08.06 - 마이크로서비스 아키텍처에서 Spring Cloud Config의 필요성 ✅ (0) | 2024.08.06 |