문서의 선택한 두 판 사이의 차이를 보여줍니다.
양쪽 이전 판 이전 판 다음 판 | 이전 판 | ||
java:lombok:pitfall [2017/07/05 00:08] kwon37xi [실무 프로젝트에서는 보수적으로 사용] |
java:lombok:pitfall [2022/06/27 16:40] (현재) kwon37xi [@Builder 를 생성자나 static 객체 생성 메소드에] |
||
---|---|---|---|
줄 29: | 줄 29: | ||
} | } | ||
</ | </ | ||
- | 이 경우, IDE가 제공해주는 **리팩토링은 전혀 작동하지 않고, lombok이 개발자도 인식하지 못하는 사이에 생성자의 파라미터 순서를 필드 선언 순서에 맞춰 '' | + | 이 경우, IDE가 제공해주는 **리팩토링은 전혀 작동하지 않고, lombok이 개발자도 인식하지 못하는 사이에 생성자의 파라미터 순서를 필드 선언 순서에 맞춰 '' |
이에 의해, 위의 생성자를 호출하는 코드는 아무런 에러없이 잘 작동하는 듯 보이지만 실제로 입력된 값은 바뀌어 들어가게 된다. | 이에 의해, 위의 생성자를 호출하는 코드는 아무런 에러없이 잘 작동하는 듯 보이지만 실제로 입력된 값은 바뀌어 들어가게 된다. | ||
줄 37: | 줄 37: | ||
</ | </ | ||
- | 이 문제는 '' | + | 이 문제는 '' |
대신, 생성자를 (IDE 자동생성등으로) 직접 만들고 필요할 경우에는 직접 만든 생성자에 [[https:// | 대신, 생성자를 (IDE 자동생성등으로) 직접 만들고 필요할 경우에는 직접 만든 생성자에 [[https:// | ||
줄 56: | 줄 56: | ||
System.out.println(order); | System.out.println(order); | ||
</ | </ | ||
+ | |||
+ | ==== 필드에 붙은 애노테이션이 생성자 쪽으로 전달 안됨 ==== | ||
+ | * 필드에 애노테이션이 있을 경우 자동으로 생성자로 전달이 안 되어 문제가 될 수 있다. | ||
+ | * 특히 '' | ||
+ | * '' | ||
+ | * [[https:// | ||
===== 무분별한 @EqualsAndHashCode 사용 자제 ===== | ===== 무분별한 @EqualsAndHashCode 사용 자제 ===== | ||
줄 98: | 줄 104: | ||
* 막상 개발을 하다보면 온전히 Immutable 필드를 대상으로만 '' | * 막상 개발을 하다보면 온전히 Immutable 필드를 대상으로만 '' | ||
* [[java: | * [[java: | ||
+ | |||
+ | 나는 위와 같은 이유로 [[https:// | ||
===== @Data 사용금지 ===== | ===== @Data 사용금지 ===== | ||
줄 109: | 줄 117: | ||
public class Order { | public class Order { | ||
... | ... | ||
- | // 생성자와 equals, hashCode 직접 작성 | + | // 생성자와 |
} | } | ||
</ | </ | ||
줄 123: | 줄 131: | ||
public class Order { | public class Order { | ||
// private final 로 여러 필드 생성 | // private final 로 여러 필드 생성 | ||
- | // 생성자와 equals, hashCode 직접 작성 | + | // 생성자와 |
} | } | ||
</ | </ | ||
줄 135: | 줄 143: | ||
(생성자 부분에 예시 나옴) | (생성자 부분에 예시 나옴) | ||
+ | 또한 '' | ||
===== @Log ===== | ===== @Log ===== | ||
[[https:// | [[https:// | ||
줄 147: | 줄 155: | ||
자세한 것은 아래 '' | 자세한 것은 아래 '' | ||
- | 나는 (라이브러리성이 아닌) 일반 서비스에서는 Logger를 field 변수로 만들 필요 없이 static final로 하는 것을 선호한다. 그래야 static method에서도 호출 가능하기 때문이다. | + | 나는 (라이브러리성이 아닌) 일반 서비스에서는 Logger를 field 변수로 만들 필요 없이 static final로 하는 것을 선호한다. 그래야 |
===== @NonNull 사용 금지 ===== | ===== @NonNull 사용 금지 ===== | ||
줄 162: | 줄 170: | ||
===== @ToString, @EqualsAndHashCode 필드명 지정시 오타 문제 ===== | ===== @ToString, @EqualsAndHashCode 필드명 지정시 오타 문제 ===== | ||
+ | |||
+ | **Lombok 1.18.0 부터 @ToString, @EqualsAndHashCode에 대해 필드, 혹은 메소드에 Include, Exclude 지정이 가능해졌다.** 따라서 아래 문제가 모두 해소 된다. | ||
+ | |||
[[https:// | [[https:// | ||
- | |@EqualsAndHashCode]]에서는 파라미터로 특정 필드를 지정해서 처리 대상에 포함시키거나 제외시킬 수 있다. | + | |@EqualsAndHashCode]]에서는 파라미터로 특정 필드를 지정해서 처리 대상에 포함시키거(**of**)나 제외(**exclude**)시킬 수 있다. |
헌데 문제는 이게 필드 이름을 String으로 지정한다는 점이다. 이로 인해 IDE 에서 필드명을 리팩토링할 때 올바로 반영이 안되거나, | 헌데 문제는 이게 필드 이름을 String으로 지정한다는 점이다. 이로 인해 IDE 에서 필드명을 리팩토링할 때 올바로 반영이 안되거나, | ||
줄 169: | 줄 180: | ||
현재 버전에서는 이를 error로 격상시킬 방법이 없다. 컴파일러 옵션 '' | 현재 버전에서는 이를 error로 격상시킬 방법이 없다. 컴파일러 옵션 '' | ||
+ | 이 문제는 [[https:// | ||
- | + | [[java: | |
===== 실무 프로젝트에서는 보수적으로 사용 ===== | ===== 실무 프로젝트에서는 보수적으로 사용 ===== | ||
- | 개인 Toy 프로젝트가 아닌 실무 프로젝트에서는 가급적 [[https:// | + | 개인 Toy 프로젝트가 아닌 실무 프로젝트에서는 가급적 [[https:// |
- | '' | + | '' |
특히 Experimental 기능은 사용하지 말고, IDE 지원이 확실치 못하고 문법 파괴적인 [[https:// | 특히 Experimental 기능은 사용하지 말고, IDE 지원이 확실치 못하고 문법 파괴적인 [[https:// | ||
줄 183: | 줄 194: | ||
예를들어, | 예를들어, | ||
- | 또한 '' | + | |
+ | 억지로 사용할 경우 컴파일 오류가 발생한다. | ||
< | < | ||
config.stopBubbling = true | config.stopBubbling = true | ||
줄 189: | 줄 202: | ||
lombok.value.flagUsage=error | lombok.value.flagUsage=error | ||
lombok.val.flagUsage=error | lombok.val.flagUsage=error | ||
+ | lombok.var.flagUsage=error | ||
lombok.nonNull.flagUsage=error | lombok.nonNull.flagUsage=error | ||
lombok.allArgsConstructor.flagUsage=error | lombok.allArgsConstructor.flagUsage=error | ||
lombok.requiredArgsConstructor.flagUsage=error | lombok.requiredArgsConstructor.flagUsage=error | ||
- | lombok.log.fieldIsStatic=false | + | lombok.cleanup.flagUsage=error |
+ | lombok.sneakyThrows.flagUsage=error | ||
+ | lombok.synchronized.flagUsage=error | ||
+ | # experimental 전체 금지 | ||
+ | lombok.experimental.flagUsage=error | ||
# 기타 각종 사용해서는 안되는 기능들을 모두 나열할 것. | # 기타 각종 사용해서는 안되는 기능들을 모두 나열할 것. | ||
</ | </ | ||
+ | 상세한 설정 옵션은 각 애노테이션 매뉴얼 페이지 하단에 자세히 나와 있다. |