나무모에 미러 (일반/밝은 화면)
최근 수정 시각 : 2026-07-08 17:57:47

Lombok

롬복(Java)에서 넘어옴


파일:다른 뜻 아이콘.svg  
#!if 넘어옴1 != null
''''''{{{#!if 넘어옴2 == null
{{{#!if 넘어옴1[넘어옴1.length - 1] >= 0xAC00 && 넘어옴1[넘어옴1.length - 1] <= 0xD7A3
{{{#!if ((넘어옴1[넘어옴1.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴1[넘어옴1.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴1[넘어옴1.length - 1] < 0xAC00 || 넘어옴1[넘어옴1.length - 1] > 0xD7A3
은(는)}}}}}}{{{#!if 넘어옴2 != null
, ''''''{{{#!if 넘어옴3 == null
{{{#!if 넘어옴2[넘어옴2.length - 1] >= 0xAC00 && 넘어옴2[넘어옴2.length - 1] <= 0xD7A3
{{{#!if ((넘어옴2[넘어옴2.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴2[넘어옴2.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴2[넘어옴2.length - 1] < 0xAC00 || 넘어옴2[넘어옴2.length - 1] > 0xD7A3
은(는)}}}}}}}}}{{{#!if 넘어옴3 != null
, ''''''{{{#!if 넘어옴4 == null
{{{#!if 넘어옴3[넘어옴3.length - 1] >= 0xAC00 && 넘어옴3[넘어옴3.length - 1] <= 0xD7A3
{{{#!if ((넘어옴3[넘어옴3.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴3[넘어옴3.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴3[넘어옴3.length - 1] < 0xAC00 || 넘어옴3[넘어옴3.length - 1] > 0xD7A3
은(는)}}}}}}}}}{{{#!if 넘어옴4 != null
, ''''''{{{#!if 넘어옴5 == null
{{{#!if 넘어옴4[넘어옴4.length - 1] >= 0xAC00 && 넘어옴4[넘어옴4.length - 1] <= 0xD7A3
{{{#!if ((넘어옴4[넘어옴4.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴4[넘어옴4.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴4[넘어옴4.length - 1] < 0xAC00 || 넘어옴4[넘어옴4.length - 1] > 0xD7A3
은(는)}}}}}}}}}{{{#!if 넘어옴5 != null
, ''''''{{{#!if 넘어옴6 == null
{{{#!if 넘어옴5[넘어옴5.length - 1] >= 0xAC00 && 넘어옴5[넘어옴5.length - 1] <= 0xD7A3
{{{#!if ((넘어옴5[넘어옴5.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴5[넘어옴5.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴5[넘어옴5.length - 1] < 0xAC00 || 넘어옴5[넘어옴5.length - 1] > 0xD7A3
은(는)}}}}}}}}}{{{#!if 넘어옴6 != null
, ''''''{{{#!if 넘어옴7 == null
{{{#!if 넘어옴6[넘어옴6.length - 1] >= 0xAC00 && 넘어옴6[넘어옴6.length - 1] <= 0xD7A3
{{{#!if ((넘어옴6[넘어옴6.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴6[넘어옴6.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴6[넘어옴6.length - 1] < 0xAC00 || 넘어옴6[넘어옴6.length - 1] > 0xD7A3
은(는)}}}}}}}}}{{{#!if 넘어옴7 != null
, ''''''{{{#!if 넘어옴8 == null
{{{#!if 넘어옴7[넘어옴7.length - 1] >= 0xAC00 && 넘어옴7[넘어옴7.length - 1] <= 0xD7A3
{{{#!if ((넘어옴7[넘어옴7.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴7[넘어옴7.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴7[넘어옴7.length - 1] < 0xAC00 || 넘어옴7[넘어옴7.length - 1] > 0xD7A3
은(는)}}}}}}}}}{{{#!if 넘어옴8 != null
, ''''''{{{#!if 넘어옴9 == null
{{{#!if 넘어옴8[넘어옴8.length - 1] >= 0xAC00 && 넘어옴8[넘어옴8.length - 1] <= 0xD7A3
{{{#!if ((넘어옴8[넘어옴8.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴8[넘어옴8.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴8[넘어옴8.length - 1] < 0xAC00 || 넘어옴8[넘어옴8.length - 1] > 0xD7A3
은(는)}}}}}}}}}{{{#!if 넘어옴9 != null
, ''''''{{{#!if 넘어옴10 == null
{{{#!if 넘어옴9[넘어옴9.length - 1] >= 0xAC00 && 넘어옴9[넘어옴9.length - 1] <= 0xD7A3
{{{#!if ((넘어옴9[넘어옴9.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴9[넘어옴9.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴9[넘어옴9.length - 1] < 0xAC00 || 넘어옴9[넘어옴9.length - 1] > 0xD7A3
은(는)}}}}}}}}}{{{#!if 넘어옴10 != null
, ''''''{{{#!if 넘어옴10[넘어옴10.length - 1] >= 0xAC00 && 넘어옴10[넘어옴10.length - 1] <= 0xD7A3
{{{#!if ((넘어옴10[넘어옴10.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴10[넘어옴10.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴10[넘어옴10.length - 1] < 0xAC00 || 넘어옴10[넘어옴10.length - 1] > 0xD7A3
은(는)}}}}}} 여기로 연결됩니다. 
#!if 설명 == null && 리스트 == null
{{{#!if 설명1 == null
다른 뜻에 대한 내용은 아래 문서를}}}{{{#!if 설명1 != null
{{{#!html 해당 라이브러리의 명칭의 유래가 된 인도네시아의 섬}}}에 대한 내용은 [[롬복섬]] 문서{{{#!if (문단1 == null) == (앵커1 == null)
를}}}{{{#!if 문단1 != null & 앵커1 == null
의 [[롬복섬#s-|]]번 문단을}}}{{{#!if 문단1 == null & 앵커1 != null
의 [[롬복섬#|]] 부분을}}}}}}{{{#!if 설명2 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단2 == null) == (앵커2 == null)
를}}}{{{#!if 문단2 != null & 앵커2 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단2 == null & 앵커2 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명3 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단3 == null) == (앵커3 == null)
를}}}{{{#!if 문단3 != null & 앵커3 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단3 == null & 앵커3 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명4 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단4 == null) == (앵커4 == null)
를}}}{{{#!if 문단4 != null & 앵커4 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단4 == null & 앵커4 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명5 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단5 == null) == (앵커5 == null)
를}}}{{{#!if 문단5 != null & 앵커5 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단5 == null & 앵커5 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명6 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단6 == null) == (앵커6 == null)
를}}}{{{#!if 문단6 != null & 앵커6 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단6 == null & 앵커6 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명7 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단7 == null) == (앵커7 == null)
를}}}{{{#!if 문단7 != null & 앵커7 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단7 == null & 앵커7 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명8 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단8 == null) == (앵커8 == null)
를}}}{{{#!if 문단8 != null & 앵커8 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단8 == null & 앵커8 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명9 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단9 == null) == (앵커9 == null)
를}}}{{{#!if 문단9 != null & 앵커9 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단9 == null & 앵커9 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명10 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단10 == null) == (앵커10 == null)
를}}}{{{#!if 문단10 != null & 앵커10 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단10 == null & 앵커10 != null
의 [[#|]] 부분을}}}}}}
#!if 설명 == null
{{{#!if 리스트 != null
다른 뜻에 대한 내용은 아래 문서를}}} 참고하십시오.

#!if 리스트 != null
{{{#!if 문서명1 != null
 * {{{#!if 설명1 != null
해당 라이브러리의 명칭의 유래가 된 인도네시아의 섬: }}}[[롬복섬]] {{{#!if 문단1 != null & 앵커1 == null
문서의 [[롬복섬#s-|]]번 문단}}}{{{#!if 문단1 == null & 앵커1 != null
문서의 [[롬복섬#|]] 부분}}}}}}{{{#!if 문서명2 != null
 * {{{#!if 설명2 != null
: }}}[[]] {{{#!if 문단2 != null & 앵커2 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단2 == null & 앵커2 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명3 != null
 * {{{#!if 설명3 != null
: }}}[[]] {{{#!if 문단3 != null & 앵커3 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단3 == null & 앵커3 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명4 != null
 * {{{#!if 설명4 != null
: }}}[[]] {{{#!if 문단4 != null & 앵커4 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단4 == null & 앵커4 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명5 != null
 * {{{#!if 설명5 != null
: }}}[[]] {{{#!if 문단5 != null & 앵커5 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단5 == null & 앵커5 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명6 != null
 * {{{#!if 설명6 != null
: }}}[[]] {{{#!if 문단6 != null & 앵커6 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단6 == null & 앵커6 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명7 != null
 * {{{#!if 설명7 != null
: }}}[[]] {{{#!if 문단7 != null & 앵커7 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단7 == null & 앵커7 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명8 != null
 * {{{#!if 설명8 != null
: }}}[[]] {{{#!if 문단8 != null & 앵커8 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단8 == null & 앵커8 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명9 != null
 * {{{#!if 설명9 != null
: }}}[[]] {{{#!if 문단9 != null & 앵커9 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단9 == null & 앵커9 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명10 != null
 * {{{#!if 설명10 != null
: }}}[[]] {{{#!if 문단10 != null & 앵커10 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단10 == null & 앵커10 != null
문서의 [[#|]] 부분}}}}}}

Lombok
롬복
파일:Project Lombok Logo.png
공식 명칭 Project Lombok
개발 Project Lombok Team
최초 공개 2009년
프로그래밍 언어 Java
라이선스 MIT 라이선스#
공식 사이트 파일:JAVA_lombok.png 프로젝트 롬복

1. 개요2. 명칭3. 특징4. 동작 방식5. 사용6. 어노테이션
6.1. @Getter6.2. @Setter6.3. @Data6.4. @Builder6.5. @NoArgsConstructor6.6. @AllArgsConstructor6.7. @RequiredArgsConstructor6.8. @EqualsAndHashCode6.9. @ToString6.10. @Slf4j6.11. @Value6.12. @NonNull6.13. @UtilityClass6.14. @SneakyThrows
7. 장점8. 단점9. IDE 지원10. 여담

1. 개요

LombokJava에서 반복적으로 작성해야 하는 보일러플레이트(Boilerplate) 코드를 자동으로 생성해 주는 라이브러리이다.

생성자(Constructor), Getter/Setter, equals(), hashCode(), toString() 등의 메서드를 어노테이션만으로 생성할 수 있으며, 컴파일 시점에 코드를 삽입하는 방식으로 동작한다.

특히 스프링부트 프로젝트에서 Entity, DTO, VO 등을 작성할 때 사실상 필수 라이브러리 중 하나로 사용된다.

Lombok은 소스 코드를 직접 수정하는 것이 아니라 Java 컴파일 과정에서 AST(Abstract Syntax Tree)를 조작하여 필요한 코드를 삽입하는 방식으로 동작한다.

이러한 특성 때문에 실행 시 성능에는 거의 영향을 주지 않으며, 생성된 코드는 일반 Java 코드와 동일하게 컴파일된다.

2. 명칭

Lombok이라는 이름은 인도네시아롬복섬(Lombok)에서 유래하였다. Java가 인도네시아의 자바섬에서 이름을 따온 것처럼, 같은 나라의 섬 이름을 사용한 듯 하다.

3. 특징

4. 동작 방식

Lombok은 Annotation Processor(API)와 컴파일러 내부 기능을 이용하여 컴파일 과정에서 코드를 생성한다.

개발자가 작성한 Java 파일에는 Getter나 생성자가 존재하지 않지만, 컴파일 과정에서 AST(Abstract Syntax Tree)를 수정하여 필요한 메서드를 추가한 뒤 최종 바이트코드(.class)를 생성한다.

따라서 런타임에는 일반 Java 코드와 동일하게 동작하며 별도의 프록시나 리플렉션을 사용하는 것은 아니다.

이 때문에 IDE에서는 Annotation Processing 기능이 활성화되어 있어야 생성된 메서드를 정상적으로 인식할 수 있다.

5. 사용

주로 스프링부트 프로젝트에서 사용되며, Entity, DTO, VO, Request, Response 객체를 작성할 때 많이 활용된다.

이외에도 일반 Java 프로젝트에서도 반복적인 Getter/Setter 작성이나 Builder 패턴 구현을 줄이기 위해 사용된다.

다만 Entity에서는 모든 메서드를 자동 생성하는 @Data보다 필요한 어노테이션만 선택하여 사용하는 것이 권장된다.

6. 어노테이션

6.1. @Getter

클래스 또는 필드에 Getter 메서드를 자동으로 생성한다.

클래스에 선언하면 모든 필드에 대한 Getter를 생성하며, 필드에 선언하면 해당 필드에 대해서만 Getter를 생성한다.
#!syntax java
@Getter
public class Member {
    private String name;
    private int age;
}


컴파일 후
#!syntax java
public String getName() {
    return name;
}

public int getAge() {
    return age;
}


접근 제어자는 기본적으로 public으로 생성되며, AccessLevel 옵션을 이용하여 접근 범위를 변경할 수도 있다.
#!syntax java
@Getter(AccessLevel.PROTECTED)

6.2. @Setter

클래스 또는 필드에 Setter 메서드를 자동으로 생성한다.
#!syntax java
@Setter
public class Member {
    private String name;
}


컴파일 후
#!syntax java
public void setName(String name) {
    this.name = name;
}


불변 객체를 구현하는 경우 Setter 생성을 지양하는 것이 일반적이다.

6.3. @Data

다음 어노테이션을 한 번에 적용하는 복합 어노테이션이다.
#!syntax java
@Data
public class MemberDto {
    private String name;
    private int age;
}


여러 기능을 포함하고 있어 편리하지만 Entity 클래스에서는 예상하지 못한 equals(), hashCode(), toString()이 생성될 수 있으므로 사용을 권장하지 않는 경우가 많다. 특히 양방향 연관관계를 사용하는 JPA Entity에서는 순환 참조가 발생할 가능성이 있다.

6.4. @Builder

빌더 패턴을 자동으로 생성한다. 생성자의 매개변수가 많을 경우 가독성을 높이고 원하는 필드만 선택적으로 초기화할 수 있다는 장점이 있다.
#!syntax java
@Builder
public class Member {
    private String name;
    private int age;
}


사용 예시
#!syntax java
Member member = Member.builder()
        .name("김철수")
        .age(20)
        .build();

6.5. @NoArgsConstructor

매개변수가 없는 기본 생성자를 생성한다.
#!syntax java
@NoArgsConstructor
public class Member {
}


컴파일 후
#!syntax java
public Member() {
}


JPA Entity에서는 프록시 생성을 위해 기본 생성자가 필요하므로 자주 사용된다. AccessLevel을 이용하여 protected 생성자를 만드는 경우도 많다.
#!syntax java
@NoArgsConstructor(access = AccessLevel.PROTECTED)

6.6. @AllArgsConstructor

모든 필드를 매개변수로 받는 생성자를 생성한다. 다만 모든 필드를 초기화할 수 있지만, 필드의 개수가 많아질 경우 생성자의 가독성이 떨어질 수 있다.
#!syntax java
@AllArgsConstructor
public class Member {
    private String name;
    private int age;
}


컴파일 후
#!syntax java
public Member(String name, int age) {
    this.name = name;
    this.age = age;
}

6.7. @RequiredArgsConstructor

final 또는 @NonNull이 선언된 필드만을 매개변수로 하는 생성자를 생성한다.
#!syntax java
@RequiredArgsConstructor
public class MemberController {
    private final MemberService memberService;
}


컴파일 후
#!syntax java
public MemberController(MemberService memberService) {
    this.memberService = memberService;
}


스프링부트에서는 생성자 주입(Constructor Injection)을 구현할 때 가장 많이 사용되는 Lombok 어노테이션이다.

주입 대상이 final로 선언되어 있어 불변성을 유지할 수 있으며, 스프링의 생성자 주입 방식과 가장 잘 어울리는 어노테이션으로 평가받는다. 스프링 프레임워크 4.3 이후에는 생성자가 하나뿐인 경우 @Autowired를 생략할 수 있어 함께 사용되는 경우가 많다.

6.8. @EqualsAndHashCode

equals()hashCode() 메서드를 자동으로 생성한다.
#!syntax java
@EqualsAndHashCode
public class Member {
    private Long id;
    private String name;
}


컴파일 후
#!syntax java
@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (!(o instanceof Member)) return false;
    Member member = (Member) o;
    return Objects.equals(id, member.id)
            && Objects.equals(name, member.name);
}

@Override
public int hashCode() {
    return Objects.hash(id, name);
}


객체 비교나 HashMap, HashSet 등의 컬렉션에서 동일한 객체를 판단할 때 사용된다. JPA Entity에서는 식별자(id)를 기준으로 구현하는 것이 일반적이며, 모든 필드를 포함할 경우 예상하지 못한 동작이 발생할 수 있다.

6.9. @ToString

toString() 메서드를 자동으로 생성한다.
#!syntax java
@ToString
public class Member {
    private String name;
    private int age;
}


컴파일 후
#!syntax java
@Override
public String toString() {
    return "Member(name=" + this.name
            + ", age=" + this.age + ")";
}


출력 예시
#!syntax text
Member(name=김철수, age=20)


양방향 연관관계를 가진 객체에서는 순환 참조가 발생할 수 있으므로 @ToString.Exclude를 이용하여 특정 필드를 제외하기도 한다.

6.10. @Slf4j

SLF4J Logger 객체를 자동으로 생성한다.
#!syntax java
@Slf4j
public class MemberController {
    public void test() {
        log.info("회원 조회");
        log.warn("경고");
        log.error("오류 발생");
    }
}


컴파일 후
#!syntax java
private static final Logger log =
        LoggerFactory.getLogger(MemberController.class);


기존의 코드를 자동으로 생성해 주므로 로깅 코드를 간결하게 작성할 수 있다.

내부적으로는 org.slf4j.Logger 타입의 log 필드를 생성하며, 클래스 이름을 기반으로 LoggerFactory.getLogger()를 호출하는 코드를 자동 생성한다. 이외에도 @Log, @Log4j2, @CommonsLog 등 다양한 로깅 프레임워크용 어노테이션을 제공한다.

6.11. @Value

불변(Immutable) 객체를 생성하기 위한 어노테이션이다. @Getter, @ToString, @EqualsAndHashCode, @AllArgsConstructor 등을 포함하며, 모든 필드를 final로 선언하고 Setter는 생성하지 않는다.
#!syntax java
@Value
public class MemberDto {
    String name;
    int age;
}


컴파일 후
#!syntax java
public final class MemberDto {
    private final String name;
    private final int age;

    public MemberDto(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }
}

6.12. @NonNull

매개변수나 필드가 null이 되는 것을 방지하기 위한 어노테이션이다.

생성자나 메서드의 매개변수에 적용하면 컴파일 시 null 여부를 검사하는 코드를 자동으로 생성하며, null이 전달될 경우 NullPointerException을 발생시킨다.
#!syntax java
public class MemberService {
    public void save(@NonNull String name) {
        System.out.println(name);
    }
}


컴파일 후
#!syntax java
public void save(String name) {
    if (name == null) {
        throw new NullPointerException("name is marked non-null but is null");
    }

    System.out.println(name);
}

6.13. @UtilityClass

유틸리티 클래스를 만들기 위한 어노테이션이다.

클래스를 final로 선언하고 기본 생성자를 private으로 생성하며, 모든 메서드와 필드를 static으로 변경한다.
#!syntax java
@UtilityClass
public class MathUtil {
    public int add(int a, int b) {
        return a + b;
    }
}


컴파일 후
#!syntax java
public final class MathUtil {
    private MathUtil() {
        throw new UnsupportedOperationException();
    }

    public static int add(int a, int b) {
        return a + b;
    }
}

6.14. @SneakyThrows

Checked Exception을 명시적으로 선언하지 않고도 예외를 발생시킬 수 있도록 하는 어노테이션이다.

컴파일 시 예외 처리 코드를 자동 생성하므로 throws 선언이나 try-catch 문을 생략할 수 있다.
#!syntax java
@SneakyThrows
public void readFile() {
    Files.readString(Path.of("test.txt"));
}


컴파일 후
#!syntax java
public void readFile() {
    try {
        Files.readString(Path.of("test.txt"));
    } catch (Throwable t) {
        throw Lombok.sneakyThrow(t);
    }
}


Checked Exception을 숨길 수 있어 편리하지만, 예외의 흐름이 명확하지 않아 과도한 사용은 권장되지 않는다.

7. 장점

8. 단점

9. IDE 지원

Lombok은 대부분의 주요 Java IDE를 지원한다.

다만 IDE에서 Annotation Processing이 비활성화되어 있거나 Lombok 플러그인이 설치되어 있지 않은 경우 생성된 메서드를 인식하지 못해 오류가 표시될 수 있다.

10. 여담