Lombok이란 Java 라이브러리로 반복되는 메서드 작성을 줄여주는 코드 다이어트 라이브러리이다.
롬복 (Lombok)을 이용하면 보일러플레이트 코드* (Boilerplate Code)의 절감을 도모할 수 있다. 롬복을 이용하려면 의존관계를 빌드 스크립트에 추가한다.
* 보일러플레이트 코드란 프로그래밍 언어에서 상용구 코드를 말한다. 예를 들어 자바에서는 클래스의 getter, setter 메서드가 있다. 이런 메서드는 꼭 필요하지만 코드의 길이를 길어지게 하고 개발자에게 의미 없는 노동을 강요한다는 단점이 있다.
💡 Lombok의 단점 및 주의사항
롬복 라이브러리는 개발자마다 호불호가 나뉠 수 있어 프로젝트나 성향에 따라 사용하는 것이 좋다. 또한 API 설명과 내부 동작을 어느정도 숙지하고 사용해야 한다.
예들 들어,@Data
어노테이션이나@toString
어노테이션으로 자동 생성되는toString()
메서드는 순환 참조 또는 무한재귀호출 문제로 인해 StackOverflowError가 발생할 수 있다.
@Getter
와 @Setter
@Getter
와 @Setter
어노테이션을 작성하면 어노테이션 프로세서에 의해 getter와 setter가 자동으로 생성된다. 개발 시 어노테이션을 부여하고 필드를 정의하기만 하면 된다.
@Getter(AccessLevel.PRIVATE)
과 같이 접근 제한자를 설정할 수 있다.
특정 필드에서 getter, setter 생성을 막고 싶다면 필드에 @Getter(AccessLevel.NONE)
을 붙여주면 해당 필드는 lombok이 메소드를 생성하지 않는다.
@Getter
@Setter
public class Person {
String name;
}
롬복에서는 로컬 변수의 타입을 val
로 설정할 수 있다. 꽤 긴 타입명도 val
세 글자로 통일할 수 있으며 자동 생성되는 타입에는 final
이 부여된다.
참고로 자바 10부터 로컬 변수 타입 추론을 이용할 수 있어 var
를 사용할 수 있다. 단, 자바 10의 var
로 정의된 변수는 롬복에서 val
로 정의한 것과 달리 final
로 한정되지 않는다.
@AllArgsConstructor
: 모든 필드에 대한 생성자를 자동으로 생성한다. 필드에 @NonNull
어노테이션이 있다면 생성자 내에서 null-check 로직을 자동으로 생성한다. 하지만 없다면 null이 들어와도 객체가 생성된다.
@NoArgsConstructor
: 파라미터가 없는 기본 생성자를 생성한다. 사용 시 주의할 사항
1. 필드들이 final로 생성되어 있는 경우에는 필드를 초기화할 수 없기 때문에 생성자를 만든 수 없고 에러가 발생한다.
이 때는 @NoArgsConstructor(force = true) 옵션을 이용해 final 필드를 0, false, null 등으로 강제 초기화시켜 생성자를 만들 수 있다.
2. @NonNull
같이 필드에 제약조건이 설정되어 있는 경우, 생성자 내 null-check 로직이 생성되지 않는다. 후에 초기화를 진행하기 전까지 null-check 로직이 발생하지 않는 점을 염두하고 코드를 개발해야 한다.
@RequiredArgsConstructor
: 추가 작업을 필요로하는 필드에 대한 생성자를 생성한다. 초기화되지 않은 모든 final 필드, @NonNull
로 마크된 필드들에 대한 생성자를 자동으로 생성한다.
@ToString
어노테이션 사용 시 아래와 같은 함수를 생성해 준다. exclude
속성을 사용하면 특정 필드를 toString() 결과에서 제외시킬 수도 있다.
@ToString(exclude = "password")
public class BoardCategoryLombok {
private String category_id;
private String category_name;
private Date regdate;
private int board_cnt;
private int seq;
@Override
public String toString() {
final StringBuffer sb = new StringBuffer("BoardCategoryBean{");
sb.append("category_id='").append(category_id).append('\'');
sb.append(", category='").append(category_name).append('\'');
sb.append(", regdate=").append(regdate);
sb.append(", board_cnt=").append(board_cnt);
sb.append(", seq=").append(seq);
sb.append('}');
return sb.toString();
}
}
@EqualsAndHashCode
어노테이션을 이용해 equals()
, hashCode()
메서드를 생성할 수 있다.
callSuper 속성을 통해 메소드 자동 생성 시 부모 클래스의 필드까지 감안할지 안 할지에 대해서 설정할 수 있다. callSuper = false가 디폴트값이며, 자신 클래스의 필드 값들만 고려한다.
@Data
@Getter
, @Setter
, @RequiredArgsConstructor
, @ToString
, @EqualsAndHashCode
한번에 설정해주는 어노테이션이다.