Logo

[자바] 알아두면 유용한 Lombok 어노테이션

이번 포스팅에서는 많이 알려지지는 않았지만 알아두면 유용한 Lombok 어노테이션에 대해서 알아보겠습니다.

빌더 자동 생성

다수의 필드를 가지는 복잡한 클래스의 경우, 생성자 대신에 빌더를 사용하는 경우가 많은데요. 빌더 패턴을 직접 작성해보면 코딩량이 의외로 상당함을 깨닫게 됩니다. 이 때, @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 때문에 반드시 throwstry-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의 어노테이션에 대해서 알아보았습니다.

참고