Lombok 이란?
자바에서 DTO, VO 등에서 반복적으로 사용되는 코드를 annotation을 통해 쉽게 작성할 수 있게 도와주는 라이브러리
동작 원리
롬복 어노테이션이 붙은 자바 소스를 컴파일할 때 annotation processor로 등록된 lombok processor가
어노테이션을 확인하고 그에 맞는 코드를 자동으로 생성해서 바이트코드로 변환 한다.
사용 방법
- 의존성 설정
- plugin 설정
- compile 설정
설정은 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에 따라 다른 어노테이션이 사용된다.