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?