이번 포스팅에서는 자주 사용하는 Lombok 어노테이션을 정리해봤습니다.
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
어노테이션은 지양하는게 좋습니다.