Lombok 은 편리한 기능을 제공하지만 사용상 주의가 필요합니다.
@AllArgsContructor
public static class Order{
private Long cancelPrice;
private Long orderPrice;
}
// 취소금액 5,000원 , 주문금액 10,000원
Order order = new Order(5000L,10000L);
canlePrice
, orderPrice
순서로 인자를 받는 생성자가 만들어집니다.@AllArgsContructor
public static class Order{
private Long orderPrice;
private Long cancelPrice;
}
//주문금액 : 5,000원, 취소금액 : 10,000원
Order order = new Order(5000L,10000L);
@AllArgsConstructor
,@RequiredArgsConstructor
에 둘다 존재하며, 이에 따라 두 lombok 어노테이션은 사용을 금지하는 것이 좋습니다.@Builder
어노테이션을 붙이는 것을 권장합니다.@AllArgsContructor
public static class Order{
private Long orderPrice;
private Long cancelPrice;
@Builder
private Order(Long orderPrice,Long cancelPrice){
this.orderPrice = orderPrice;
this.cancelPrice = cancelPrice;
}
// 필드 순서를 변경해도 문제 없음
Order order = Order.builder().cancelPrice(5000L).orderPrice(10000L).build();
EqualsAndHashCode
는 상당히 고품질의 equals
,hashCode
메서드를 자동으로 만들어줍니다. @EqualsAndHashCode
어노테이션입니다.@EqualsAndHashCode
public static class Order {
private Long orderId;
private long orderPrice;
private long cancelPrice;
public Order(Long orderId, long orderPrice, long cancelPrice) {
this.orderId = orderId;
this.orderPrice = orderPrice;
this.cancelPrice = cancelPrice;
}
}
Order order = new Order(1000L, 19800L, 0L);
Set<Order> orders = new HashSet<>();
orders.add(order); // Set에 객체 추가
System.out.println("변경전 : " + orders.contains(order)); // true
order.setCancelPrice(5000L); // cancelPrice 값 변경
System.out.println("변경후 : " + orders.contains(order)); // false
@EqualsAndHashCode
의 문제기 보다는 변경가능한 필드에 이를 남발하면서 생기는 문제입니다.@EqualsAndHashCode
사용은 금지합니다.@EqualsAndHashCode(of={"필드명시"})
형태로 동등성 비교에 필요한 필드를 명시하는 형태로 사용합니다.@EqualsAndHashCode.Include
와 @EqualsAndHashCode.Exclude
를 사용하여 명시적으로 사용할 수 있습니다.@EqualsAndHashCode(onlyExplicitlyIncluded = true)
를 사용하는 것도 가능하다.// CanclePrice 필드를 포함하고 OrderPrice 필드를 제외하는 방법
class Order {
private Long canclePrice;
@EqualsAndHashCode.Exclude
private Long orderPrice;
}
// 또는
@EqualsAndHashCode(onlyExplicitlyIncluded = true)
class Order {
@EqualsAndHashCode.Include
private Long canclePrice;
private Long orderPrice;
}
@Data
는 파라미터없는 @EqualsAndHashCode
와 @RequiredArgsConstrctor
를 포함하기때문에 사용을 아에 금지하고, 차라리 다음과 같이 명시하는 것이 좋습니다.@Getter
@Setter
@ToString
public class Order {
// 생성자와 필요한 경우에만 equals, hashCode 직접 작성
}
@Value
는 immutable 클래스를 만들어주는 조합 어노테이션이지만, 이 또한 @EqualsAndHashCode
,@AllArgsConstructor
를 포함합니다.@EqualsAndHashCode
는 불변 클래스라 큰 문제가 되지는 않지만, @AllArgsConstructor
가 문제가 됩니다.@Getter
@ToString
public class Order {
// private final 로 여러 필드 생성
// 생성자와 필요한 경우에만 equals, hashCode 직접 작성
}
@Builder
를 사용하면 객체 생성이 조금 더 명확해지고 쉬워지는데, 이는 기본적으로 @AllArgsConstructor
를 내포하고 있습니다.@Builder
는 가급적 클래스보다는 직접 만든 생성자에 붙이는 것을 권장합니다.@Log
를 통해 각종 Logger 를 자동생성할 수 있습니다.lombok.log.fieldName=logger # 로거 객체 이름을 logger로 변경. 원래는 log
lombok.log.fieldIsStatic=false # 로거를 static이 아닌 필드로 생성
@Sl4j
만 사용하고 나머지는 사용할 수 없게 금지시키는 것도 가능합니다.@NonNull
은 개인적 취향에 가까운데, 불필요하게 branch converage를 증가시킵니다.(즉, 프로젝트 코드 커버리지를 유지하고 싶다면 Null인 상황에서 오류발생과 그렇지 않은 상황에 대한 테스트를 모든 사용처에서 만들어야합니다.)@NonNull
을 사용하지 않고 Guava 의 Preconditions로 null을 검증하고 오류 처리하는 것을 선호합니다.@ToString
,@EqualsAndHashCode
는 Include,Exclude 지정이 가능해졌습니다.