Lombok이란 Java의 라이브러리로 반복되는 메소드를 Annotation을 사용해서 자동으로 작성해주는 라이브러리다. 보통 DTO나 Model, Entity의 경우 여러 속성이 존재하고 이들이 가지는 프로퍼티에 대해서 Getter나 Setter, 생성자 등을 매번 작성해줘야 하는 경우가 많은데 이러한 부분을 자동으로 만들어주는 라이브러리라고 할 수 있다.
또한 DTO와 같이 자주 변경되는 클래스의 경우 멤버 변수가 추가되거나 없어질 때마다 Getter, Setter, 생성자 등을 수정해줘야 하는 경우가 발생한다. 이러한 경우에도 Lombok을 이용하면 단순히 프로퍼티를 추가하고 삭제하는 것만으로도 충분하다.
Lombok을 이용해서 작성한 코드는 컴파일 과정에서 Annotation을 이용해서 코드를 생성하고 이런 결과물이 .class에 담기게 되는 것이다.
귀찮은 과정을 줄여주고 반복되는 코드 작성을 대신 해준다는 점에서 많은 개발자들이 선호하는 라이브러리이지만 호불호가 갈리는 라이브러리이기도 하므로 팀 프로젝트에 도입하는 경우 주의해야 한다.
또한 단순히 Annotation을 이용해서 코드를 작성해주는 라이브러리이므로 각 API가 어떤식으로 작동하는지 숙지한 채로 사용하는 것이 좋다. 다른 라이브러리와 충돌이 발생할 수도 있고 내가 원하지 않는 방식으로 작동할 수도 있기 때문이다.
어노테이션 기반의 코드 자동 생성을 통한 생산성 향상
코드 가독성 및 유지보수성 향상
Getter, Setter 외에 빌더 패턴이나 로그 생성 등 다양한 방면으로 활용 가능
@Getter @Setter
@Getter와 @Setter를 클래스 이름 위에 적용시키면 모든 변수들에 적용이 가능하고, 변수 이름 위에 적용시키면 해당 변수들만 적용 가능하다.
@Getter
public class Member{
private String id;
@Setter
private String name;
}
@AllArgsConstructor는 모든 변수를 사용하는 생성자를 자동완성 시켜주는 어노테이션이다.
@Getter
@AllArgsContructor
public class Member{
private String id;
private String name;
/* AllArgsContructor를 통해 아래와 같은 생성자를 자동 생성할 수 있다.
public Member(String id, String name){
this.id = id;
this.name = name;
}
*/
}
@NoArgsConstructor는 어떠한 변수도 사용하지 않는 기본 생성자를 자동완성 시켜주는 어노테이션이다.
@Getter
@NoArgsContructor
public class Member{
private String id;
private String name;
/* NoArgsContructor를 통해 아래와 같은 생성자를 자동 생성할 수 있다.
public Member(){}
*/
}
@RequiredArgsConstructor는 특정 변수만을 활용하는 생성자를 자동완성 시켜주는 어노테이션이다. 생성자의 인자로 추가할 변수에 @NonNull 어노테이션 또는 변수에 final로 선언해서 의존성을 주입받을 수 있다.
@EqualsAndHashCode 어노테이션을 활용하면 클래스에 대한 equals 함수와 hashCode 함수를 자동으로 생성해준다.
@RequiredArgsContructor
@EqualsAndHashCode(of={"id", "name"}, callSuper=false)
public class Member extends Common{
@NonNull
private String id;
private final String name; // final 선언
}
위의 @EqualsAndHahsCode(of={"id", "name"}) 로 설정하여 id와 name이 동일하다면 같은 객체로 인식하도록 해주고, 또한 Common 을 상속하고 있는데, 상위 클래스의 경우 적용시키지 않기 위해 callSuper=false로 해주었다.
@ToString 어노테이션을 활용하면 클래스의 변수들을 기반으로 ToString 메소드를 자동으로 완성시켜 준다. 출력을 원하지 않는 변수에 @ToString.Exclude 어노테이션을 붙여주면 출력을 제외할 수 있다. 또한 상위 클래스에 대해도 toString을 적용시키고자 한다면 상위 클래스에 @ToString(callSuper = true) 를 적용시키면 된다.
@ToString
public class Member extends Common{
@ToString.Exclude
private String id; // id는 toString에서 제외
private final String name; // final 선언
}
@Data 어노테이션을 활용하면 @ToString, @EqualsAndHashCode, @Getter, @Setter, @RequiredArgsConstructor를 자동완성 시켜준다.
@Builder 어노테이션을 활용하면 해당 클래스의 객체의 생성에 Builder패턴을 적용시켜준다. 모든 변수들에 대해 build하기를 원한다면 클래스 위에 @Builder를 붙이면 되지만, 특정 변수만을 build하기 원한다면 생성자를 작성하고 그 위에 @Builder 어노테이션을 붙여주면 된다.
@NoArgsContructor
@Getter
//@Builder // 모든 변수를 초기화 하는 builder 생성시 클래스 레벨에 선언
public class Member extends Common{
private String id;
private String name;
private String phone;
// 특정 변수만을 초기화 하려면 특정 생성자에 선언
@Builder
public Member(String id, String name){
this.id = id;
this.name = name;
}
/*
@Builder 선언시 Lombok에 의해 빌더생성을 위한 다음의 코드가 생성됨.
public static Member.MemberBuilder builder() {
return new Member.MemberBuilder();
}
public static class MemberBuilder {
private String id;
private String name;
MemberBuilder() {
}
public Member.MemberBuilder id(final String id) {
this.id = id;
return this;
}
public Member.MemberBuilder name(final String name) {
this.name = name;
return this;
}
public Member build() {
return new Member(this.id, this.name);
}
public String toString() {
return "Member.MemberBuilder(id=" + this.id + ", name=" + this.name + ")";
}
}
*/
}
빌더를 생성했다면 아래와 같이 사용하면 된다.
public class MemberController{
public ResponseEntity init(){
// 빌더 패턴을 이용한 객체 생성
Member member = Member.builder()
.id("hong")
.name("홍길동")
.build();
return ResponseEntity.ok(member);
}
}