이번 포스팅에서는 자주 사용하는 Lombok 어노테이션을 정리해봤습니다.

자주 쓰는 Lombok Annotations

Annotation 설명
@NonNull Null 값이 될 수 없다는 것을 명시합니다. NullPointerException에 대한 대비책이 될 수 있습니다.
@Cleanup 자동으로 close() 메소드를 호출합니다.
@Getter/@Setter 코드가 컴파일 될 때, Getter/Setter 메소드를 생성합니다.
@ToString toString() 메소드를 생성합니다. @ToString(exclude={"제외할 값"}) 처럼 원하지 않는 속성은 제외할 수 있습니다.
@EqualsAndHashCode 해당 객체의 equals()와 hashCode() 메소드를 생성합니다.
@NoArgsConstructor 파라미터를 받지 않는 생성자를 만들어 줍니다.
@RequiredArgsConstructor 지정된 속성들에 대해서만 생성자를 만듭니다.
@AllArgsConstructor 모든 속성에 대해서 생성자를 만들어 냅니다.
@Data @ToString, @EqualsAndHashCode, @Getter, @Setter, @RequiredArgsConstructor를 합쳐 둔 어노테이션입니다.
@Value 불변 클래스를 생성할 때 사용합니다.
@Builder 빌더 패턴을 사용할 수 있도록 코드를 생성합니다.
@SneakyThrows 예외 발생 시 Throwable 타입으로 반환합니다.
@Syncronized 메소드에서 동기화를 설정합니다.
@Getter(lazy=true) 동기화를 이용해서 최초 한번만 getter를 호출합니다.

주의점

@Data@ToString, @EqualsAndHashCode, @Getter, @Setter, @RequiredArgsConstructor 어노테이션의 묶음 입니다.

JPA같은 ORM을 사용 중이시라면, 조심하셔서 사용하셔야 됩니다.
ORM은 객체와 객체가 관계를 가지는 조합으로 테이블 간의 연관관계를 표현합니다. 아래와 같은 경우 부모 객체자식 객체toString()에서 문제가 생깁니다.

public class Member {
  private String id;
  private String pw;

  private Address addr;

  @Override
  public String toString() {
    return "Member [id=" + id + ", pw=" + pw + ", addr=" + addr + "];
  }
}

public class Address {
  private String zipcode;
  private Member member;

  @Override
  public String toString() {
    return "Address [zipcode=" + zipcode + ", member=" + member + "]";
  }
}

Member 객체의 toString()을 호출하면 Address 객체의 toString()이 호출 되면서, 다시 Member 객체의 toString()을 호출하며, 무한 반복이 됩니다.

따라서, include/exclude 속성을 이용해서 toString() 작성 시에 포함하거나, 빼야 하지만 @Data는 설정이 불가능합니다.

그러므로 코드가 길어져도 @Data 어노테이션은 지양하는게 좋습니다.