Lombok 이란?
롬복(Lombok)은 자바 Domain(DTO, VO) 에서 반복적으로 작성되는 getter/setter나 toString, 생성자 코드 등의 소스들을, 어노테이션(Annotation)을 사용하여 생략할 수 있도록컴파일 시점에 자동으로 생성해주는 라이브러리이다.
1. Lombok 설치하기
본 게시글은 아래 설명한 환경을 기반으로 설명하겠다.
IntelliJ IDEA Ultimate 2021.1.2Gradle 6.7Maven 3.6.3참고로
IntelliJ 2020.03이후 버전에서는 기본 Plugin으로 Lombok이 설치되어 있다고 한다.
IntelliJ에서는 Plugin으로 lombok을 지원한다.
File-Settings-Plugins-Marketplace에 lombok을 검색하고 설치해 준다.

2. Dependency 설정하기
lombok plugin을 사용하기 위해서는 dependency에 추가해 주어야만 사용이 가능하다.
Gradle 6.7
// build.gradle
...
dependencies {
// lombok plugin
implementation('org.projectlombok:lombok')
annotationProcessor('org.projectlombok:lombok')
// test 환경
testImplementation('org.projectlombok:lombok')
testAnnotationProcessor('org.projectlombok:lombok')
}
...
Maven 3.6.3
// pom.xml
...
<dependencies>
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>
...
3. Annotation Processing 설정하기
마지막으로 어노테이션 프로세싱 활성화를 해주어야 어노테이션 기반인 lombok을 사용할 수 있다.
File-Settings-Build, Execution, Deployment-Compiler-Annotation Processors 에서 Enable annotation processing 을 체크해준다.

Lombok의 Annotation
@Getter/@Setter
- 어노테이션을 붙인 클래스 멤버 변수들 혹은 특정 변수의
getXXX(),setXXX()메소드를 생성한다. - 기본적으로
public method로 선언된다. @Setter(AccessLevel.PRIVATE)처럼AccessLevel을 통하여 접근권한을 설정할 수 있다. (PRIVATE, PROTECTED 등)@Setter같은 경우는무결성이 보장되어야 하는 클래스나 변수에는 사용을 지양해야 한다.
@ToString
- 어노테이션을 붙인 클래스의
toString()메소드를 생성한다. @ToString(exclude = "password")처럼 특정 필드(변수)를 제외할 수 있다.@ToString(callSuper = true)를 사용하면 상속받은 클래스의 정보까지 출력된다.(default 값은false)@ToString을 붙인 클래스에순환 참조를 하는객체 타입 필드가 있다면,무한 루프가 발생한다.- 클래스 A에 어노테이션을 붙였는데, A의 멤버 변수에 클래스 B 타입이 있고, B의 멤버 변수에 클래스 A 타입이 있을 경우
무한 루프가 발생한다. @ToString(exclude = "A")와 같이 명시적으로 해당 필드를 제외시켜줘야 한다.
- 클래스 A에 어노테이션을 붙였는데, A의 멤버 변수에 클래스 B 타입이 있고, B의 멤버 변수에 클래스 A 타입이 있을 경우
@NonNull
- 어노테이션을 붙인 변수는 반드시 값이 있어야 한다.
- Setter에 null 값이 들어오게 되면
NullPointerException이 발생하게 된다. @NonNull은 불필요하게 branch coverage를 증가시키므로 사용이 권장되지는 않는다.
@NoArgsConstructor
- 어노테이션이 붙은 클래스의
기본 생성자를 생성한다. AccessLevel을 통하여 접근권한을 설정할 수 있다.- 기본값은
public이지만,protected를 사용하여 안전성을 보장해주는 것을 권장한다.
@RequiredArgsConstructor
- 어노테이션이 붙은 클래스의
final혹은@NonNull인 필드만을 포함한 생성자를 생성한다. AccessLevel을 통하여 접근권한을 설정할 수 있다.- 필드에 잘못된 값이 들어가도 에러를 뱉지 않을수도 있기에 사용에 주의가 필요하다.
@AllArgsConstructor
- 어노테이션이 붙은 클래스의 모든 필드를 포함한 생성자를 생성한다.
AccessLevel을 통하여 접근권한을 설정할 수 있다.- 필드에 잘못된 값이 들어가도 에러를 뱉지 않을수도 있기에 사용에 주의가 필요하다.
@EqualsAndHashCode
- 어노테이션이 붙은 클래스에
equals()와hashCode()메소드를 생성한다. exclude를 통하여 특정 필드를 제외시킬 수 있다.equals(): 두 객체의 내용이 같은지를 비교하는 메소드이다.hashCode(): 해당 객체의 해시값을 반환하는 메소드이다.
@Data
@Getter,@Setter,@EqualsAndHashCode,@RequiredArgsConstructor,@ToString을 포함한다.@Data(staticConstructor = "foo")와 같이foo라는static factory method를 생성할 수도 있다.
@Value
- 어노테이션이 붙은 클래스를
불변(Immutable) 클래스로 선언한다. - 모든 필드와 클래스를 기본적으로 private 및 final 로 선언하고, setter 메소드를 생성하지 않는 점을 제외하곤
@Data와 비슷하다.
@Cleanup
close()메소드를 자동으로 호출해주어,close()관련 코드 작성을 최소화 할 수 있다.
@Synchronized
synchronized키워드를 사용할 때 데드락(Deadlock)이 발생하는 경우를 방지하기 위해, 어노테이션이 붙은 메소드가 실행되기 전에 잠글$lock이라는 개인 잠금 필드를 생성한다.lock오브젝트를 자동으로 생성하므로, syschronized를 손쉽게 사용할 수 있게 해준다.
@Builder
빌더 패턴을 사용할 수 있도록빌더 API를 제공한다.private이긴 하지만@AllArgsConstructor를 기본적으로 적용한다.- 클래스보다는
사용자 정의 생성자혹은static 객체 생성 메소드에 사용하는 것을 권장한다. @Singular: Collection 타입에 선언하게 되면 파라미터를 하나씩 추가할 수 있다.
@Log, @Slf4j
- 로그를 남기기 위한 어노테이션이다.
- 어노테이션을 클래스에 선언하면, log 관련 static 메소드를 선언하지 않아도 된다.
마무리
보통 @Getter, @Setter, @ToString, @Builder, @Log 정도를 많이 사용한다고 한다.
그리고
@Data보다는 코드가 길어지더라도 필요한 어노테이션만 선언하는 것을 권장하고 있다
Refer to
[Spring,Java] Lombok Annotation 정리
Lombok이란?
ksshlee.github.io
Stable
projectlombok.org
'IDE' 카테고리의 다른 글
| [IntelliJ] VisualVM 연동 + 사용방법 (0) | 2021.04.18 |
|---|