[Spring] Lombok(롬복)이란 ? 설치부터 사용법까지

Lombok 이란?

Java의 라이브러리로 반복되는 메서드를 Anntation을 사용해 자동으로 작성해주는 아주 편리한 라이브러리입니다.

Java에서 보통 Model 클래스나 Entity같은 도메인 클래스 등에는 여러 속성이 존재하고 이들이 갖는 프로퍼티에 대해서 Getter, Setter, 생성자 등을 매번 작성해줘야하지만

Lombok을 이용한다면 어노테이션을 이용하는 것 만으로 자동으로 Getter, Setter, 생성자 등의 코드를 작성해줘 번거로운 과정을 제거해줍니다.

 

인텔리제이 Lombok 설치 및 적용 방법

1. 파일 -> 설정 -> 플러그인 에서 lombok을 검색 후 플러그인을 설치합니다.

 

2. build.gradle의 dependency에 아래 코드를 추가합니다.

dependencies {
	// lombok 라이브러리
	implementation 'org.projectlombok:lombok'
	annotationProcessor 'org.projectlombok:lombok'

	// lombok 테스트 라이브러리
	testImplementation 'org.projectlombok:lombok'
	testAnnotationProcessor 'org.projectlombok:lombok'
}

 

(주의) build.gradle 수정 후 꼭 새로고침 버튼을 클릭해야 적용

 

3. Annotation Processing 설정

파일 -> 설정 -> 빌드,실행,배포 -> 컴파일러 -> 어노테이션 프로세서로 들어가 어노테이션 처리 활성화를 체크해줍니다.

이러면 모든 lombok 설치 및 적용이 완료됩니다.

 

Lombok의 자주사용하는 Annotation

@Getter

@Getter 어노테이션이 붙은 클래스 내 모든 필드의 Getter 메서드 자동 생성

 

@ToString

@ToString 어노테이션이 붙은 클래스의 toString() 메서드를 자동 생성.

@ToString(callSuper = true) 옵션을 사용하면 상속받은 클래스의 정보까지 출력됩니다. (기본값 = false)

주의할 점으로는 @ToString을 붙인 클래스에 순환 참조를 하는 객체 타입 필드가 있다면, 무한 루프가 발생하게 됩니다.

이 상황을 간단하게 예시를 들면, 클래스 A에 @ToString 어노테이션을 붙였는데, A의 멤버 변수에 클래스 B타입이 있고 B의 멤버 변수에 클래스 A타입이 있는 경우가 있습니다.

이때, @ToString(exclude="A")와 같이 명시적으로 해당 필드를 제외시켜줘야합니다.

 

@Setter

@Setter 어노테이션이 붙은 클래스 내 모든 필드의 Setter 메서드 자동 생성

Entity 클래스에서 Setter를 만드는 것은 가급적이면 피하는게 좋습니다. 왜냐하면 Setter의 사용이 Entity의 일관성을 해칠 수 있기 때문입니다.

Entity 클래스에서 Setter를 무분별하게 사용하게 되면, Entity의 인스턴스 값들이 언제 어디서 변하는지 명확히 알 수 없기 때문에, Setter 대신 다른 방법으로 필드에 값을 넣어 주는 것이 좋습니다.

 

⇒ 해결책 : Entity 클래스에선 Builder패턴을 사용하는 것이 가장 좋습니다.

멤버 변수가 많아지더라도 어떤 값을 어떤 필드에 넣는지 코드를 통해 확인할 수 있고, 필요한 값만 집어넣는 것이 가능하기 때문입니다.

 

@Builder

자동으로 해당 클래스에 Builder를 추가해줍니다.

생성자 파라미터로 받아야하는 값이 수없이 많아진다면, 각 값들이 어떤 값을 의미하는 지 이해하기 힘듭니다.

하지만 이를 빌더 패턴으로 구현하면 각 값들은 빌더의 각 값들의 이름이 어떤 값으로 셋팅이 되는지, 각각 무슨 값을 의미하는지 파악하기 쉬워집니다.

따라서 생성자로 설정해야하는 값이 많을 경우 빌더를 쓰는 것이 생성자보다 가독성이 좋습니다.

또한 같은 타입의 다른 변수의 값을 서로 바꿔 넣는 것을 방지할 수 있습니다.

 

@Getter
@Builder
@ToString
public class Article {
    private String title;
    private String content;
    private String author;

    @Builder
    public Article(String title, String content, String author) {
        this.title = title;
        this.content = content;
        this.author = author;
    }
}

 

public class ArticleTest {
    @Test
    void Posts_요청() {
        Article article = Article.builder()
                .title("게시글 제목")
                .content("게시글 내용")
                .author("작가 이름")
                .build();
        System.out.println(article);
    }
}

 

스프링에서는 생성자가 하나만 있을 경우 자동으로 DI(의존관계 주입) Autowired가 붙어 생략가능합니다.

@NoArgsConstructor

@NoArgsConstructor 어노테이션이 붙은 클래스의 기본 생성자를 생성합니다.

 

@AllArgsConstructor

@AllArgsConstructor 어노테이션이 붙은 클래스의 모든 필드 값을 파라미터로 받는 생성자를 생성합니다.

 

@RequiredArgsConstructor

@RequiredArgsConstructor 어노테이션이 붙은 클래스의 fianl 혹은 @NonNull인 필드 값만 파라미터로 받는 생성자를 생성합니다.