빌더 자동 생성
다수의 필드를 가지는 복잡한 클래스의 경우, 생성자 대신에 빌더를 사용하는 경우가 많은데요. 빌더 패턴을 직접 작성해보면 코딩량이 의외로 상당함을 깨닫게 됩니다. 이 때, @Builder 어노테이션을 사용하면 자동으로 해당 클래스에 빌더를 추가해주기 때문에 매우 편리합니다.
@Builder
public class User {
private Long id;
private String username;
private String password;
@Singular
private List<Integer> scores;
}
컬렉션으로 된 필드에는 @Singular 어노테이션을 선언해주면 모든 원소를 한 번에 넘기지 않고 원소를 하나씩 추가할 수 있습니다.
User user = User.builder()
.id(1L)
.username("dale")
.password("1234")
.score(70)
.score(80)
.build();
// User(id=1, username=dale, password=1234, scores=[70, 80])
로거 자동 생성
클래스마다 일일이 로거를 생성해주는 여간 귀찮은 일이 아닙니다. 이 때, @Log 어노테이션을 사용하면 자동으로 log 필드를 만들고, 해당 클래스의 이름으로 로거 객체를 생성하여 할당해줍니다. @Log 뿐만 아니라, @Slf4j나 @Log4j2 등 다양한 로깅 프레임워크에 대응하는 어노테이션을 제공하오니 참고바랍니다.
@Log
public class LogExample {
// 자동 생성
// private static final java.util.logging.Logger log = java.util.logging.Logger.getLogger(LogExample.class.getName());
public static void main(String... args) {
log.info("TEST");
}
}
Null 체크
@NonNull 어노테이션을 변수에 붙이면 자동으로 null 체크를 해줍니다. 즉, 해당 변수가 null로 넘어온 경우, NullPointerException 예외를 일으켜 줍니다.
@NonNull @Setter
private String id;
obj.setId(null); // NullPointerException 발생
자동 자원 닫기
IO 처리나 JDBC 코딩을 할 때, try-catch-finally 문의 finally 절을 통해서 close() 메소드를 호출하는 게 여간 번거로운 일이 아니었는데요. @Cleanup 어노테션을 사용하면 해당 자원이 자동으로 닫히는 것이 보장됩니다.
@Cleanup Connection con = DriverManager.getConnection(url, user, password);
예외 처리 생략
Checked Exception 때문에 반드시 throws나 try-catch 구문을 통해서 번거롭게 명시적으로 예외 처리를 해줘야할 때 가 있습니다. 이럴 때, @SneakyThrows 어노테이션을 사용하면 명시적인 예외 처리를 생략할 수 있습니다. (호불호가 갈릴 수 있는 기능인 것 같습니다.)
@SneakyThrows(IOException.class)
public void printLines() {
BufferedReader reader = new BufferedReader(...);
for (String line; (line = reader.readLine()) != null; ) {
System.out.println(line);
}
}
동기화
자바의 synchronized 키워드를 메소드에 선언하면 객체 레벨에서 락이 걸려서 여러가지 동기화 관련 문제들이 발생할 수 있습니다. 대신에 @Synchronized 어노테이션을 사용하면 가상의 필드 레벨에서 좀 더 안전하게 락을 걸어줍니다.
@Synchronized
public void hello() {
System.out.println("world");
}
불변 클래스
한 번 생성하면 변경할 수 없는 불변 객체를 만들기 위한 클래스를 선언할 때는 @Data 대신에 @Value 어노테이션을 사용하면 됩니다.
이상으로 유용하지만 많이 알려지지 않은 Lombok의 어노테이션에 대해서 알아보았습니다.
참고
- https://projectlombok.org/features/NonNull
- https://projectlombok.org/features/log
- https://projectlombok.org/features/Cleanup
- https://projectlombok.org/features/SneakyThrows
- https://projectlombok.org/features/Synchronized
- https://projectlombok.org/features/Value
여기서 퍼옴 정리가 잘되어 있어서 https://www.daleseo.com/lombok-useful-annotations/
'프로그램 > 자바' 카테고리의 다른 글
자바로 크로스 도메인 우회처리 (0) | 2021.12.14 |
---|---|
자바로 PWA PUSH 만들기 (0) | 2021.08.06 |
기본 Java 타입과 DB 필드 매핑 (0) | 2021.08.04 |
사용자 정의 컬럼 추가하기 (0) | 2021.05.25 |
3장. Querydsl 입문 (0) | 2021.05.24 |
댓글