Lombok은 Java의 보일러플레이트 코드를 줄여주는 라이브러리입니다. 어노테이션 프로세싱을 통해 컴파일 시점에 코드를 생성합니다.

1. @Getter / @Setter

필드에 대한 getter/setter 메서드를 자동 생성합니다.

Lombok 코드

public class GetterSetterExample {
    @Getter @Setter private int age = 10;
    @Setter(AccessLevel.PROTECTED) private String name;
}

생성되는 코드

public class GetterSetterExample {
    private int age = 10;
    private String name;

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    protected void setName(String name) {
        this.name = name;
    }
}

2. @Getter(lazy=true)

lazy initialization을 지원합니다. 처음 호출될 때만 값을 계산합니다.

@Getter(lazy = true)
private final double[] cached = expensive();

private double[] expensive() {
    // 비용이 큰 연산
    return new double[1000000];
}

3. @NonNull

null 체크 코드를 자동 생성합니다.

Lombok 코드

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

생성되는 코드

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

4. @ToString

toString() 메서드를 자동 생성합니다.

@ToString
public class ToStringExample {
    private String name;
    private int age;
}

참고: Lombok @ToString

5. @EqualsAndHashCode

equals()와 hashCode() 메서드를 자동 생성합니다.

@EqualsAndHashCode
public class EqualsExample {
    private String name;
    private int age;
}

참고: Lombok @EqualsAndHashCode

6. @Data

다음 어노테이션들의 조합입니다:

  • @ToString
  • @EqualsAndHashCode
  • @Getter (모든 필드)
  • @Setter (non-final 필드)
  • @RequiredArgsConstructor
@Data
public class DataExample {
    private final String name;
    private int age;
}

참고: Lombok @Data

7. @Value

@Data의 불변(immutable) 버전입니다. 모든 필드가 private final이 되고, setter는 생성되지 않습니다.

@Value
public class ValueExample {
    String name;
    int age;
}

참고: Lombok @Value

8. @Builder

빌더 패턴을 자동 구현합니다.

@Builder
public class BuilderExample {
    private String name;
    private int age;
}

// 사용
BuilderExample example = BuilderExample.builder()
    .name("John")
    .age(30)
    .build();

참고: Lombok @Builder

9. @RequiredArgsConstructor

final 필드나 @NonNull 필드를 파라미터로 받는 생성자를 생성합니다.

@RequiredArgsConstructor
public class ConstructorExample {
    private final String name;
    @NonNull private String email;
    private int age;  // 포함되지 않음
}

참고: Lombok Constructor Annotations

10. @Cleanup

리소스를 자동으로 정리합니다.

Lombok 코드

public static void main(String[] args) throws IOException {
    @Cleanup InputStream in = new FileInputStream(args[0]);
    @Cleanup OutputStream out = new FileOutputStream(args[1]);
    byte[] b = new byte[10000];
    while (true) {
        int r = in.read(b);
        if (r == -1) break;
        out.write(b, 0, r);
    }
}

생성되는 코드

public static void main(String[] args) throws IOException {
    InputStream in = new FileInputStream(args[0]);
    try {
        OutputStream out = new FileOutputStream(args[1]);
        try {
            byte[] b = new byte[10000];
            while (true) {
                int r = in.read(b);
                if (r == -1) break;
                out.write(b, 0, r);
            }
        } finally {
            if (out != null) {
                out.close();
            }
        }
    } finally {
        if (in != null) {
            in.close();
        }
    }
}

11. @SneakyThrows

checked exception을 unchecked처럼 던질 수 있게 합니다.

@SneakyThrows
public void run() {
    throw new IOException();  // catch 필요 없음
}

사용 사례:

  • 예외가 발생할 가능성이 없는 경우
  • Runnable 등 checked exception을 선언할 수 없는 인터페이스 구현 시

12. @Log / @Slf4j

로거를 자동 생성합니다.

Lombok 코드

@Slf4j
public class LogExample {
    public void doSomething() {
        log.info("Something happened");
    }
}

생성되는 코드

public class LogExample {
    private static final org.slf4j.Logger log =
        org.slf4j.LoggerFactory.getLogger(LogExample.class);

    public void doSomething() {
        log.info("Something happened");
    }
}

지원하는 로거:

  • @Log (java.util.logging)
  • @Log4j / @Log4j2
  • @Slf4j
  • @CommonsLog
  • @JBossLog

13. val

타입 추론과 final을 동시에 적용합니다.

val list = new ArrayList<String>();
// 다음과 동일:
// final ArrayList<String> list = new ArrayList<String>();

14. 유용한 링크

15. 설치 및 설정

Maven

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.30</version>
    <scope>provided</scope>
</dependency>

Gradle

compileOnly 'org.projectlombok:lombok:1.18.30'
annotationProcessor 'org.projectlombok:lombok:1.18.30'

IDE 설정

IntelliJ IDEA:

  1. Settings > Plugins에서 Lombok 플러그인 설치
  2. Settings > Build, Execution, Deployment > Compiler > Annotation Processors에서 “Enable annotation processing” 활성화