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?