롬복(Lombok) 어노테이션(Annotation)
롬복 어노테이션 (Lombok Annotation)
Lombok Library는 코드를 줄여 가독성을 높여주는 라이브러리입니다.
@Getter
자동으로 getValue() 혹은 isValue()와 같은 접근자 메소드를 생성합니다.
- 변수 타입 별 메소드 종류
- boolean 타입인 경우 → isValue()
- boolean 타입이 아닌 경우 → getValue()
- 옵션
- lazy: 처음 호출될 때 값을 한 번 계산하고 그 이후 Cache를 사용하는 접근자로 설정
- Example: @Getter(lazy=true)
- lazy: 처음 호출될 때 값을 한 번 계산하고 그 이후 Cache를 사용하는 접근자로 설정
Class에 선언된 경우 Class 내 선언된 모든 필드에 대해서 접근자 메소드를 생성합니다.
Example
// 선언부
public class User {
@Getter
private String name;
...
@Getter
private boolean dispatchStatus;
...
}
// 사용부
String employeeName = user.getName();
boolean dispatchStatus = user.isDispatchStatus();
@Setter
자동으로 setValue()와 같은 설정자 메소드를 생성합니다.
Class에 선언된 경우 Class 내 선언된 모든 필드에 대해서 설정자 메소드를 생성합니다.
Example
// 선언부
public class User {
@Setter
private String name;
...
@Setter
private boolean dispatchStatus;
...
}
// 사용부
user.setName("홍길동");
user.setDispatchStatus(true);
@AllArgsConstructor
자동으로 모든 필드의 값을 파라미더로 전달받는 생성자를 생성합니다.
Example
// 선언부
@AllArgsConstructor
public class User {
@MonNull
private String name;
...
private boolean dispatchStatus;
...
}
// 사용부
User user = new User("홍길동", ..., true);
@NoArgsConstructor
자동으로 파라미더가 없는 기본 생성자를 생성합니다.
Example
// 선언부
@NoArgsConstructor
public class User {
private String name;
...
private boolean dispatchStatus;
...
}
// 사용부
User user = new User();
@RequiredArgsConstructor
자동으로 final이나 @NonNull인 필드 값만 파라미터로 전달받는 생성자를 생성합니다.
Example
// 선언부
@AllArgsConstructor
public class User {
@MonNull
private String name;
...
private boolean dispatchStatus;
...
}
// 사용부
User user = new User("홍길동");
@ToString
자동으로 필드의 toString 메소드를 생성합니다.
Class에 선언된 경우 Class 내 선언된 모든 필드에 대해서 toString 메소드를 생성합니다.
- 옵션
- exclude: 특정 필드에 대해서 toString 메소드를 생성하지 않도록 선언
Example
// 선언부
@AllArgsConstructor
@ToString(exclude = "dispatchStatus")
public class User {
private String name;
...
private boolean dispatchStatus;
...
}
// 사용부
User user = new User("홍길동", true);
System.out.println(user);
// 출력 결과
User(name=홍길동, dispatchStatus=true)
@NonNull
자동으로 선언된 필드와 메소드 파라미터에 대해 Null Check 로직을 생성합니다.
다만 Lombok 어노테이션을 이용하여 생성한 메소드나 생성자가 아닌 직접 코딩하여 생성한 메소드와 생성자에 대해서는 @NonNull의 효과가 적용되지 않습니다.
Example
// 사용한 경우
public ExampleFunction(@NonNull User user) {
this.name = user.getUserName();
}
// 사용하지 않은 경우
public ExampleFunction(User user) {
if(user == null) {
throw new NullPointerException("~~~");
}
this.name = user.getUserName();
}
@Cleanup
사용 중인 자원이 자동으로 닫히도록(→ close()) 합니다.
@Cleanup 사용하지 않은 경우 'try-catch-finally' 문의 finally 절에서 항상 close() 메소드를 선언하는 수고를 덜 수 있습니다.
Example
@Cleanup Connection con = DriverManager.getConnection(url, user, password);
@EqualsAndHashCode
자동으로 자바 빈의 equals, hashCode 메소드를 생성합니다.
- 옵션
- callSuper: 자동 생성시 부모 클래스의 필드까지 감안할 것인지 설정
- callSuper=true: 부모 클래스 필드 값도 동일한지 체크
- callSuper=false (Default): 부모 클래스 필드 값 고려하지 않고 자신 클래스의 필드 값만 동일한지 체크
- callSuper: 자동 생성시 부모 클래스의 필드까지 감안할 것인지 설정
Example
// 선언부
@EqualsAndHashCode(callSuper=true)
public class User extends Employee {
private String userName;
private String userPhone;
}
// 사용부
User user1 = new User();
user1.setUserId("000001");
user1.setUserName("홍길동");
user1.setUserPhone("010-0000-0000");
User user2 = new User();
user2.setUserId("000000");
user2.setUserName("홍길동");
user2.setUserPhone("010-0000-0000");
user1.equals(user2);
// if 'callSuper=true' then false
// else if 'callSuper=false' then true
@Data
자동으로 아래 어노테이션들을 한번에 설정해주는 어노테이션입니다.
- @Getter
- @Setter
- @RequiredArgsConstructor
- @ToString
- @EqualsAndHashCode
Example
@Data
public class User {
...
}
@Value
한 번 생성하고 난 뒤, 변경할 수 없는 불변의 값을 지닌 객체를 생성할 때 사용하는 어노테이션입니다.
유사한 어노테이션으로 @Data가 있으며, 둘의 차이는 값의 불변 여부입니다.
Example
@Value
public class User {
...
}
@Builder
빌더는 다수의 필드를 가지는 복잡한 클래스의 경우 생성자 대신 사용하는 경우가 많습니다.
이러한 빌더를 자동으로 선언한 클래스에 추가하는 기능입니다.
추가적으로 @Singular 어노테이션을 컬렉션으로 된 필드에 선언시 모든 원소를 한 번에 입력하지 않고 개별적으로 하나씩 추가하여 선언할 수 있습니다.
Example
// 선언부
@Builder
public class User {
private String userName;
private String userPhone;
@Singluar
private List<Integer> userGrade;
}
// 사용부
User user = User.builder()
.userName("홍길동")
.userPhone("010-0000-0000")
.userGrade("A")
.userGrade("B")
.build();
// 결과
User(userName="홍길동", userPhone="010-0000-0000", userGrade=["A", "B'])
@Log
자동으로 Log 필드를 만들고 선언한 클래스의 이름으로 로거 객체를 생성 및 할당합니다.
@Log 외에도 @Slf4j, @Log4j2와 같은 다양한 어노테이션도 있습니다.
Example
// 사용한 경우
@Log
public class ExampleClass {
public static void main(String... args) {
log.info("Test Log");
}
}
// 사용하지 않은 경우
public class ExampleClass {
public static void main(String... args) {
private static final java.util.logging.Logger log = java.util.logging.Logger.getLogger(LogExample.class.getName())
log.info("Test Log");
}
}
References
- https://projectlombok.org/features/
- https://melonicedlatte.com/2021/07/18/182600.html
- https://www.daleseo.com/lombok-popular-annotations/