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์ ํต์ฌ ์ฐจ์ด์ 
๊ฐ์ฒด ํ์
๊ฐ๋ณ(mutable)
๋ถ๋ณ(immutable)
ํด๋์ค final
์๋์ค
์
ํ๋ final
๋ช ์์ ์ผ๋ก๋ง
๋ชจ๋ ํ๋ ์๋
Setter
non-final ํ๋์ ์์ฑ
์์ฑ ์ ํจ
์์ฑ์
@RequiredArgsConstructor
@AllArgsConstructor
์์
๊ฐ๋ฅ
๋ถ๊ฐ๋ฅ
5. @Data ์ฌ์ฉ์ ์ง์ํด์ผ ํ๋ ์ด์ ์ ๋์
์ง์ํด์ผ ํ๋ ์ด์
๋ฌด๋ถ๋ณํ Setter ์์ฑ์ผ๋ก ๊ฐ์ฒด ๋ฌด๊ฒฐ์ฑ ์ํ
๊ฐ์ฒด์งํฅ ์ค๊ณ ์์น ์นจํด ๊ฐ๋ฅ์ฑ
๋ชจ๋ ํ๋์ ์ผ๊ด ์ ์ฑ ์ ์ฉ์ผ๋ก ๊ฐ๋ณ ํ๋ ์ ์ด ์ด๋ ค์
๋์
์ ๋ณ์  ์ด๋ ธํ ์ด์  ์กฐํฉ
@Getter
@ToString
@EqualsAndHashCode
public class Product {
    private final Long id;
    private String name;
    
    // ํ์ํ setter๋ง ๋ช
์์  ๊ตฌํ
    public void updateName(String name) {
        this.name = name;
    }
}Builder ํจํด ํ์ฉ
@Getter
@Builder
public class Order {
    private final Long id;
    private OrderStatus status;
    
    // ์ํ ๋ณ๊ฒฝ์ ์ํ ๋ช
์์  ๋ฉ์๋
    public void markAsProcessed() {
        this.status = OrderStatus.PROCESSED;
    }
}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?