Lombok이란


Lombok 이란?

자바에서 DTO, VO 등에서 반복적으로 사용되는 코드를 annotation을 통해 쉽게 작성할 수 있게 도와주는 라이브러리

동작 원리
롬복 어노테이션이 붙은 자바 소스를 컴파일할 때 annotation processor로 등록된 lombok processor가 어노테이션을 확인하고 그에 맞는 코드를 자동으로 생성해서 바이트코드로 변환 한다.

사용 방법

설정은 lombok.config 파일에서
세부적인 설정이 가능한데 기본적으로 disable로 설정되어있는 어노테이션은 flagUsage를 ALLOW로 설정해야 사용이 가능해진다.
lombok.---.flagUsage = ALLOW

Lombok annotation

val

lombok.var.flagUsage = ALLOW
위와 같은 설정이 필요하다.

@NonNul

null 값이 될 수 없다는 것을 명시한다.
null이 전달되면 예외를 던지는데 설정을 통해 던져지는 예외를 IllegalArgumentException으로도 설정할 수 있다.
lombok.config 파일에서 lombok.nonNull.exceptionType = IllegalArgumentException
이렇게 설정해주면 IllegalArgumentException으로 catch할 수 있고 NullPointException에 대한 대비책이 될 수 있다.

@Cleanup

try-with-resource 구문과 비슷한 효과를 가진다.
구문이 종료될 때 AutoCloseable 인터페이스의 close()가 호출되는 try-with-resource와 달리 Scope가 종료될 때 close()가 호출된다.

/**
 * 이 메소드가 종료될 때 scanner.close()가 호출된다.
 */
public static void getAndPrint() {
  @Cleanup val scanner = new Scanner(System.in);
  val value = scanner.nextLine();
  System.out.println(value);
}

@Setter / @Getter

필드의 setter/getter를 만든다.
어노테이션의 파라미터로 AccessLevel을 이용해 setter/getter의 접근제한자를 설정할 수 있다.
private final로 선언된 필드는 @Getter의 파라미터 중 lazy를 true로 설정할 수 있는데,
lazy를 true로 설정할 경우 해당 필드의 getter가 호출 될 때 필드의 값을 설정한다.

@ToString

toString() 메소드를 생성한다. @ToString(exclude={“제외할 값”}) 처럼 원하지 않는 속성은 제외할 수 있다.
includeFieldNames로 필드명을 생략할지 포함할지 여부, callSuper로 상위 클래스의 toString()을 호출할지 여부를 설정할 수 있다.

@EqualsAndHashCode

해당 객체의 equals()와 hashCode() 메소드를 생성한다.

@NoArgsConstructor / @AllArgsConstructor / @RequiredArgsConstructor

클래스의 생성자를 만들어준다. 세 종류를 중복해서 사용할 수 있다.
세 가지 어노테이션 모두 객체를 만드는 static 메소드의 이름을 입력받는 staticName, 생성자의 접근제한자를 설정하는 access를 파라미터로 입력할 수 있다.
@NoArgsConstructor - 파라미터가 없는 생성자
@AllArgsConstructor - 모든 필드를 파라미터로 가지는 생성자
@RequiredArgsConstructor - 기본 값이 없고 @NonNull 어노테이션이 붙은 필드를 파라미터로 입력받는 생성자

@Data

@ToString, @EqualsAndHashCode,
@Getter, @Setter, @RequiredArgsConstructor를 합쳐 둔 어노테이션이다.

하지만 세부 설정을 하려면 각각의 어노테이션을 붙여야 한다는 점,
@RequiredArgsConstructor 어노테이션으로 만들어지는 생성자는 다른 생성자가 없을 때에만 만들어진다는 점을 주의해야 한다.

@Value

@Data 어노테이션과 비슷하지만 필드를 변경할 수 없는 ‘불변 객체’가 만들어진다.
필드에 @Wither 어노테이션을 이용하면 with필드명(값) 메소드가 만들어지는데,
이 메소드를 이용하면 값을 변경한 새로운 객체를 만들어준다.
@Value 어노테이션은 val 어노테이션을 사용하기 때문에
val 어노테이션이 사용가능한 상태에서만 @Value 어노테이션도 사용이 가능하다.

@Builder

빌더 패턴을 적용한 객체 생성 메소드/클래스를 만들어준다.
builderClassName 파라미터로 nested(중첩) 빌더 클래스의 이름을 (클래스명Builder가 기본),
builderMethodName으로 빌더 클래스를 반환하는 static 메소드의 이름을 (builder()가 기본),
buildMethodName으로 객체를 반환하는 빌드 메소드의 이름 (build()가 기본)을 설정할 수 있다.

필드에 @Builder.Default 어노테이션을 붙여 기본 값을 설정할 수 있고,
@Singular 어노테이션을 붙여 빈 collection을 자동으로 만들 수 있다.
@Singluar 어노테이션은 파라미터로 builder에서 값을 추가할 때 사용되는 메소드의 이름을 입력받는다.
또,@Singular 어노테이션으로 만들어진 collection은 수정할 수 없다.

@SneakyThrows

메소드 선언부에 사용되는 throws 키워드 대신 사용하는 어노테이션으로 예외 클래스를 파라미터로 입력받는다.
예외 발생 시 Throwable 타입으로 반환한다.

@Syncronized

메소드에 사용되는 어노테이션으로 기본적으로 지원되는 synchronized 키워드보다 더 세세한 설정이 가능한 어노테이션이다.
synchronized 키워드는 static 혹은 instance 단위로 락을 걸지만 @Synchronized 어노테이션은 파라미터로 입력받는 Object 단위로 락을 건다.
파라미터로 아무 것도 입력하지 않으면 어노테이션이 사용된 메소드 단위로 락을 건다.

@Log

클래스 상단에 항상 선언하는 static final log 필드를 자동으로 생성해준다.
지원되는 Logger에 따라 다른 어노테이션이 사용된다.

주의할 점

@Data를 조심!