lombok-data-and-value-annotations

#java #lombok #tip

Lombok의 @Data와 @Value μ–΄λ…Έν…Œμ΄μ…˜


1. Lombokμ΄λž€?

  • Lombok은 Java μ½”λ“œμ—μ„œ 반볡적으둜 μž‘μ„±ν•΄μ•Ό ν•˜λŠ” λ³΄μΌλŸ¬ν”Œλ ˆμ΄νŠΈ μ½”λ“œ(getter, setter, toString λ“±)λ₯Ό μ€„μ—¬μ£ΌλŠ” 라이브러리

  • 컴파일 μ‹œμ μ— μ–΄λ…Έν…Œμ΄μ…˜μ„ 기반으둜 ν•„μš”ν•œ μ½”λ“œλ₯Ό μžλ™ 생성

2. @Data μ–΄λ…Έν…Œμ΄μ…˜

2.1 κ°œμš”

  • @DataλŠ” λ‹€μŒ μ–΄λ…Έν…Œμ΄μ…˜λ“€μ΄ 합쳐진 볡합 μ–΄λ…Έν…Œμ΄μ…˜

    • @Getter: λͺ¨λ“  ν•„λ“œμ— λŒ€ν•œ getter λ©”μ„œλ“œ 생성

    • @Setter: λͺ¨λ“  non-final ν•„λ“œμ— λŒ€ν•œ setter λ©”μ„œλ“œ 생성

    • @ToString: toString() λ©”μ„œλ“œ 생성

    • @EqualsAndHashCode: equals()와 hashCode() λ©”μ„œλ“œ 생성

    • @RequiredArgsConstructor: ν•„μˆ˜ ν•„λ“œ(final, @NonNull)만 νŒŒλΌλ―Έν„°λ‘œ λ°›λŠ” μƒμ„±μž 생성

2.2 μ˜ˆμ‹œ

import lombok.Data;

@Data
public class User {
    private final Long id;          // finalμ΄λ―€λ‘œ setterκ°€ μƒμ„±λ˜μ§€ μ•ŠμŒ
    private String username;
    private String email;
    private boolean active;
}

2.3 μ£Όμ˜μ‚¬ν•­

  • μˆœν™˜ μ°Έμ‘°

    • toString()μ΄λ‚˜ equals()/hashCode()μ—μ„œ λ‹€λ₯Έ 객체λ₯Ό μ°Έμ‘°ν•˜λ©΄ λ¬΄ν•œ μž¬κ·€κ°€ λ°œμƒν•  수 있음.

    • 이 경우 @ToString.Excludeλ‚˜ @EqualsAndHashCode.Exclude μ‚¬μš©

  • 상속 관계

    • equals()와 hashCode()κ°€ 상속 κ΄€κ³„μ—μ„œ 문제 λ°œμƒ κ°€λŠ₯

3. @Value μ–΄λ…Έν…Œμ΄μ…˜

3.1 κ°œμš”

  • @ValueλŠ” λΆˆλ³€(immutable) 객체λ₯Ό μƒμ„±ν•˜κΈ° μœ„ν•œ μ–΄λ…Έν…Œμ΄μ…˜

    • 클래슀λ₯Ό μžλ™μœΌλ‘œ final둜 λ§Œλ“¦

    • λͺ¨λ“  ν•„λ“œλ₯Ό μžλ™μœΌλ‘œ private final둜 λ§Œλ“¦

    • @Getter 적용

    • @ToString 적용

    • @EqualsAndHashCode 적용

    • @AllArgsConstructor 적용 (λͺ¨λ“  ν•„λ“œλ₯Ό μ΄ˆκΈ°ν™”ν•˜λŠ” μƒμ„±μž 생성)

    • Setter λ©”μ„œλ“œλŠ” μƒμ„±ν•˜μ§€ μ•ŠμŒ

3.2 μ˜ˆμ‹œ

import lombok.Value;

@Value
public class ImmutableUser {
    Long id;              // μžλ™μœΌλ‘œ private final이 됨
    String username;
    String email;
    boolean active;
}

3.3 μ£Όμ˜μ‚¬ν•­

  • μ»¬λ ‰μ…˜μ˜ λΆˆλ³€μ„±

    • λ‚΄λΆ€ μ»¬λ ‰μ…˜μ΄λ‚˜ κ°€λ³€ 객체가 μžˆλŠ” 경우 ν•΄λ‹Ή 객체의 λΆˆλ³€μ„±μ€ 보μž₯λ˜μ§€ μ•ŠμŒ.

    • 좔가적인 방어적 볡사 ν•„μš”

  • 상속 λΆˆκ°€

    • ν΄λž˜μŠ€κ°€ finalμ΄λ―€λ‘œ 상속이 λΆˆκ°€λŠ₯함

4. @Data와 @Value의 핡심 차이점

νŠΉμ„±
@Data
@Value

객체 νƒ€μž…

κ°€λ³€(mutable)

λΆˆλ³€(immutable)

클래슀 final

μ•„λ‹ˆμ˜€

예

ν•„λ“œ final

λͺ…μ‹œμ μœΌλ‘œλ§Œ

λͺ¨λ“  ν•„λ“œ μžλ™

Setter

non-final ν•„λ“œμ— 생성

생성 μ•ˆ 함

μƒμ„±μž

@RequiredArgsConstructor

@AllArgsConstructor

상속

κ°€λŠ₯

λΆˆκ°€λŠ₯

5. @Data μ‚¬μš©μ„ μ§€μ–‘ν•΄μ•Ό ν•˜λŠ” μ΄μœ μ™€ λŒ€μ•ˆ

μ§€μ–‘ν•΄μ•Ό ν•˜λŠ” 이유

  • λ¬΄λΆ„λ³„ν•œ Setter μƒμ„±μœΌλ‘œ 객체 무결성 μœ„ν—˜

  • 객체지ν–₯ 섀계 원칙 μΉ¨ν•΄ κ°€λŠ₯μ„±

  • λͺ¨λ“  ν•„λ“œμ— 일괄 μ •μ±… 적용으둜 κ°œλ³„ ν•„λ“œ μ œμ–΄ 어렀움

λŒ€μ•ˆ

  1. 선별적 μ–΄λ…Έν…Œμ΄μ…˜ μ‘°ν•©

@Getter
@ToString
@EqualsAndHashCode
public class Product {
    private final Long id;
    private String name;
    
    // ν•„μš”ν•œ setter만 λͺ…μ‹œμ  κ΅¬ν˜„
    public void updateName(String name) {
        this.name = name;
    }
}
  1. Builder νŒ¨ν„΄ ν™œμš©

@Getter
@Builder
public class Order {
    private final Long id;
    private OrderStatus status;
    
    // μƒνƒœ 변경을 μœ„ν•œ λͺ…μ‹œμ  λ©”μ„œλ“œ
    public void markAsProcessed() {
        this.status = OrderStatus.PROCESSED;
    }
}
  1. DTOλŠ” @Value μ‚¬μš©

@Value
public class ProductDTO {
    Long id;
    String name;
    double price;
}

6. μ°Έκ³ 


  • https://projectlombok.org/features/Data

  • https://projectlombok.org/features/Value

  • https://www.baeldung.com/lombok-data-annotation

  • https://www.javaquery.com/2020/10/lombok-data-vs-value-annotation.html

Last updated

Was this helpful?