Lombok은 Java 개발자에게 자동화된 코드를 제공하여 반복 작업을 줄여주는 생산성 향상 도구로, 특히 특정 필드에만 적용되는 조건부 애너테이션, 체이닝 메서드, JSON 파싱과의 호환성 등 세부적인 필드 제어에 유용합니다. 이번 글에서는 조건부 애너테이션 사용과 필드 제어, 체이닝 메서드 구현, Lombok과 JSON 파싱 라이브러리 호환성에 대해 알아보겠습니다.
특정 필드에만 Lombok 애너테이션 적용하기
Lombok은 클래스 전체에 애너테이션을 적용할 수 있지만, 특정 필드에만 선택적으로 애너테이션을 적용할 수도 있습니다. 이는 민감 정보를 보호하거나 특정 필드만 읽기 전용으로 설정할 때 유용합니다.
예를 들어, 비밀번호 필드와 같은 민감한 정보는 Getter만 제공하고, Setter는 제공하지 않도록 설정할 수 있습니다.
import lombok.Getter;
import lombok.Setter;
public class User {
@Getter
private String username;
@Getter
private String email;
@Getter
@Setter
private String role;
@Getter // Setter는 제공하지 않아 읽기 전용 필드로 설정
private String password;
public User(String username, String email, String role, String password) {
this.username = username;
this.email = email;
this.role = role;
this.password = password;
}
}
위 코드에서는 password 필드에 대해서는 Getter만 생성하여, 민감한 정보를 보호할 수 있습니다. 반면, role 필드에는 Getter와 Setter를 모두 제공하여 읽기와 쓰기가 가능합니다. 이를 통해 필드 별 제어가 가능해지며, 코드를 더욱 유연하게 관리할 수 있습니다.
@Accessors를 이용한 체이닝 메서드 구현
@Accessors(chain=true) 애너테이션은 체이닝 메서드를 구현할 수 있도록 합니다. 일반적으로 Setter 메서드는 void 타입을 반환하지만, 체이닝 메서드에서는 Setter가 객체 자체를 반환하여 연속적인 메서드 호출을 가능하게 합니다.
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
@Getter
@Setter
@Accessors(chain = true)
public class Product {
private String name;
private double price;
private int quantity;
public static void main(String[] args) {
Product product = new Product()
.setName("Laptop")
.setPrice(1200.50)
.setQuantity(5);
System.out.println("Product Name: " + product.getName());
System.out.println("Price: $" + product.getPrice());
System.out.println("Quantity: " + product.getQuantity());
}
}
@Accessors(chain=true)를 사용하여 setName, setPrice, setQuantity 메서드를 연속해서 호출할 수 있습니다. 이렇게 하면 가독성이 높아지고 코드가 간결해져 특히 빌더 패턴 대체로 유용합니다.
Lombok과 JSON 파싱 라이브러리의 호환성
JSON 파싱을 위해 Java에서는 주로 Jackson이나 Gson 라이브러리를 사용합니다. Lombok의 애너테이션과 JSON 파싱 라이브러리를 함께 사용할 때, 특히 필드 접근 제어가 필요한 경우 Lombok의 설정을 통해 데이터 직렬화/역직렬화를 유연하게 조정할 수 있습니다.
Jackson과의 호환성
Jackson은 기본적으로 Getter/Setter 메서드를 통해 직렬화와 역직렬화를 수행하므로, Lombok의 @Getter, @Setter를 그대로 사용할 수 있습니다. 그러나, @JsonProperty를 Lombok과 함께 사용하여 JSON 키 이름을 제어할 수도 있습니다.
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class Employee {
@JsonProperty("employee_name")
private String name;
@JsonProperty("employee_id")
private int id;
@JsonProperty("employee_age")
private int age;
}
위 코드에서 @JsonProperty는 JSON 키를 제어하기 위해 사용됩니다. JSON 직렬화 라이브러리가 이 애너테이션을 인식하여 name 필드를 employee_name이라는 키로 직렬화합니다. 이를 통해 JSON 구조와 객체 필드 이름이 다른 경우에도 유연한 데이터 매핑이 가능합니다.
Gson과의 호환성
Gson을 사용할 때도 Lombok은 호환이 잘되지만, @Expose 애너테이션을 활용하여 특정 필드만 직렬화하도록 설정할 수 있습니다.
import com.google.gson.annotations.Expose;
import com.google.gson.Gson;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class Order {
@Expose
private String product;
@Expose
private double price;
private String internalCode; // 직렬화 제외
public static void main(String[] args) {
Order order = new Order();
order.setProduct("Book");
order.setPrice(15.99);
order.setInternalCode("B123");
Gson gson = new Gson();
String json = gson.toJson(order);
System.out.println(json);
}
}
위 코드에서 @Expose 애너테이션이 없는 internalCode 필드는 직렬화에서 제외됩니다. Lombok과 Gson을 함께 사용할 때 @Expose를 통해 민감한 데이터를 보호하거나 특정 필드만 JSON 데이터에 포함할 수 있습니다.
참고사이트
- Lombok 공식 사이트: https://projectlombok.org
- Jackson 데이터 바인딩: https://github.com/FasterXML/jackson
- Gson GitHub: https://github.com/google/gson
'JAVA' 카테고리의 다른 글
[JAVA] Map 인터페이스와 구현체 (1) | 2024.11.02 |
---|---|
[JAVA] Map 개요 (0) | 2024.11.02 |
[JAVA] Lombok 성능 최적화와 메모리 관리 (0) | 2024.11.02 |
[JAVA] Lombok 커스텀 애너테이션(어노테이션) 생성 및 활용 (0) | 2024.10.31 |
[JAVA] Lombok 로깅 처리 (@Slf4j, @Log 등) (0) | 2024.10.31 |
[JAVA] Lombok 애너테이션, 어노테이션 (@Value, @Singular, @SuperBuilder) (0) | 2024.10.31 |
[JAVA] Lombok Lazy Getter(lazy=true)와 Setter (0) | 2024.10.31 |
[JAVA] Lombok @Data 애너테이션(어노테이션 Annotation) (1) | 2024.10.30 |