본문으로 건너뛰기

Lombok

1 Lombok

1.1 dependency

gradle

repositories {
mavenCentral()
}

dependencies {
compileOnly 'org.projectlombok:lombok:1.18.22'
annotationProcessor 'org.projectlombok:lombok:1.18.22'

testCompileOnly 'org.projectlombok:lombok:1.18.22'
testAnnotationProcessor 'org.projectlombok:lombok:1.18.22'
}

2 Annotation

@NonNull

  • 필드와 메소드와 생성자의 파라미터에 적용할 수 있다
  • 롬복이 null을 체크하는 코드를 생성해준다

with Lombok

import lombok.NonNull;

public class NonNullExample extends Something {
private String name;

public NonNullExample(@NonNull Person person) {
super("Hello");
this.name = person.getName();
}
}

Vanilla Java

  • 롬복이 파라미터의 null 체크하는 코드를 생성해준다
import lombok.NonNull;

public class NonNullExample extends Something {
private String name;

public NonNullExample(@NonNull Person person) {
super("Hello");
if (person == null) {
throw new NullPointerException("person is marked non-null but is null");
}
this.name = person.getName();
}
}

@EqualsAndHashCode

  • 레퍼런스
  • 클래스에 @EqualsAndHashCode 애노테이션을 적용하면 롬복이 equals(Object other)hashCode()를 생성해준다
  • 기본적으로 모든 non-static 필드를 이용한다
  • 특정 필드를 지정하고 싶다면 @EqualsAndHashCode.Include 또는@EqualsAndHashCode.Exclude를 필드에 사용한다

of

  • 특정 필드 지정
@EqualsAndHashCode(of = "id", callSuper=false)
public class UserAccount extends BaseTimeEntity {
private Long id;
}

onlyExplicitlyIncluded

  • 특정 필드 지정
@EqualsAndHashCode(onlyExplicitlyIncluded = true, callSuper = false)
public class OpenBankingAccount extends BaseTimeEntity {

private Long id;

@EqualsAndHashCode.Include
private String fintechUseNum;
}

callSuper

  • callSuper 속성을 통해 eqauls와 hashCode 메소드 자동 생성 시 부모 클래스의 필드까지 감안할지의 여부를 설정할 수 있다.
  • 기본 값 false
@EqualsAndHashCode(onlyExplicitlyIncluded = true, callSuper = true)
public class OpenBankingAccount extends BaseTimeEntity {
@EqualsAndHashCode.Include
private Long id;

@EqualsAndHashCode.Include
private String fintechUseNum;
}

@Builder

builderMethodName

  • 빌더 인스턴스를 만드는 메서드의 이름을 지정
  • 기본 값: builder

예시

@Builder(builderMethodName = "testBuilder")
public Person(Long id, String name, Integer age) {
log.info("builderMethodName: testBuilder");
this.id = id;
this.name = name;
this.age = age;
}
Person person1 = Person.testBuilder()
.id(1L)
.age(10)
.name("홍길동")
.build();

buildMethodName

  • @Builder 애노테이션이 붙은 인스턴스를 생성하는 메서드의 이름을 지정
  • 기본 값: build

예시

@Builder(buildMethodName="execute")
public Person(Long id, String name, Integer age) {
log.info("builderMethodName: testBuilder");
this.id = id;
this.name = name;
this.age = age;
}
Person person1 = Person.builder()
.id(1L)
.age(10)
.name("홍길동")
.execute();

builderClassName

  • 빌더 클래스의 이름을 지정
  • 빌더를 여러개 사용할 떄 사용하면 유용하다

예시

@Builder
public Person(String name, Integer age) {
this.name = name;
this.age = age;
}

@Builder(builderClassName = "testBuilder", builderMethodName = "testBuilder")
public Person(Long id, String name, Integer age) {
this.id = id;
this.name = name;
this.age = age;
}
Person person1 = Person.testBuilder()
.id(1L)
.age(10)
.name("홍길동")
.build();

Person person2 = Person.builder()
.name("홍길동2")
.age(20)
.build();

@Builder.Default

  • 빌드 세션에 세팅되지 않은 필드는 0, null, false의 값을 가진다.
  • 필드의 기본값을 지정하고 싶은 경우 @Builder.Default 애노테이션을 필드에 적용한다.
@Builder.Default
private TakeoutOrderStatus takeoutOrderStatus = TakeoutOrderStatus.NEW;

참고

@ToString

참고