사용자 도구

사이트 도구


java:lombok:pitfall

차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

양쪽 이전 판 이전 판
다음 판
이전 판
java:lombok:pitfall [2017/07/05 00:17]
kwon37xi [lombok.config를 통해 애노테이션 사용금지 및 각종 설정]
java:lombok:pitfall [2022/06/27 16:40] (현재)
kwon37xi [@Builder 를 생성자나 static 객체 생성 메소드에]
줄 29: 줄 29:
 } }
 </code> </code>
-이 경우, IDE가 제공해주는 **리팩토링은 전혀 작동하지 않고, lombok이 개발자도 인식하지 못하는 사이에 생성자의 파라미터 순서를 필드 선언 순서에 맞춰 ''orderPrice,cancelPrice''로 바꿔버린다.** 게다가 이 두 필드는 **동일한 Type 이라서 기존 생성자호출 코드에서는 인자 순서 변경이 없음에도 어떠한 오류도 발생하지 않는다.**+이 경우, IDE가 제공해주는 **리팩토링은 전혀 작동하지 않고, lombok이 개발자도 인식하지 못하는 사이에 생성자의 파라미터 순서를 필드 선언 순서에 맞춰 ''orderPrice,cancelPrice''로 바꿔버린다.** 게다가 이 두 필드는 **동일한 Type 이라서 기존 생성자호출 코드에서는 인자 순서를 변경하지 않았음에도 어떠한 오류도 발생하지 않는다.**
  
 이에 의해, 위의 생성자를 호출하는 코드는 아무런 에러없이 잘 작동하는 듯 보이지만 실제로 입력된 값은 바뀌어 들어가게 된다. 이에 의해, 위의 생성자를 호출하는 코드는 아무런 에러없이 잘 작동하는 듯 보이지만 실제로 입력된 값은 바뀌어 들어가게 된다.
줄 37: 줄 37:
 </code> </code>
  
-이 문제는 ''@AllArgsConstructor''와 ''@RequiredArgsConstructor''에 둘다 존재하며, 이에 따라 이 두 lombok 애노테이션은 사용을 금지하는 것이 좋다.+이 문제는 ''@AllArgsConstructor''와 ''@RequiredArgsConstructor''에 둘 다 존재하며, 이에 따라 이 두 lombok 애노테이션은 사용을 금지하는 것이 좋다.
  
 대신, 생성자를 (IDE 자동생성등으로) 직접 만들고 필요할 경우에는 직접 만든 생성자에 [[https://projectlombok.org/features/Builder|@Builder]] 애노테이션을 붙이는 것을 권장한다. 파라미터 순서가 아닌 이름으로 값을 설정하기 때문에 리팩토링에 유연하게 대응할 수 있다. 대신, 생성자를 (IDE 자동생성등으로) 직접 만들고 필요할 경우에는 직접 만든 생성자에 [[https://projectlombok.org/features/Builder|@Builder]] 애노테이션을 붙이는 것을 권장한다. 파라미터 순서가 아닌 이름으로 값을 설정하기 때문에 리팩토링에 유연하게 대응할 수 있다.
줄 56: 줄 56:
 System.out.println(order); System.out.println(order);
 </code> </code>
 +
 +==== 필드에 붙은 애노테이션이 생성자 쪽으로 전달 안됨 ====
 +  * 필드에 애노테이션이 있을 경우 자동으로 생성자로 전달이 안 되어 문제가 될 수 있다.
 +  * 특히 ''@Data'',''@AllArgs...'' 등을 사용하면 이를 잊어버리는 경우가 부지기수 이다.
 +  * ''%%@XXXArgsConstructor(onConstructor=@__(@원하는애노테이션))%%'' 를 사용할 경우 생성자의 각 인자에 애노테이션이 붙는게 아니라 생성자 자체에 애노테이션이 붙는다.
 +    * [[https://projectlombok.org/features/experimental/onX|onX]]
  
 ===== 무분별한 @EqualsAndHashCode 사용 자제 ===== ===== 무분별한 @EqualsAndHashCode 사용 자제 =====
줄 111: 줄 117:
 public class Order { public class Order {
 ... ...
-    // 생성자와 equals, hashCode 직접 작성+    // 생성자와 필요한 경우에만 equals, hashCode 직접 작성
 } }
 </code> </code>
줄 125: 줄 131:
 public class Order { public class Order {
    // private final 로 여러 필드 생성    // private final 로 여러 필드 생성
-    // 생성자와 equals, hashCode 직접 작성+    // 생성자와 필요한 경우에만 equals, hashCode 직접 작성
 } }
 </code> </code>
줄 137: 줄 143:
 (생성자 부분에 예시 나옴) (생성자 부분에 예시 나옴)
  
 +또한 ''@Builder''에 클래스와 메소드 이름을 지정하는 기능을 통해 명확하게 어떤 역할을 하는 빌더인지를 메소드 이름으로 표현해주는 것이 좋다.
 ===== @Log ===== ===== @Log =====
 [[https://projectlombok.org/features/log|@Log]] 를 통해 각종 Logger 를 자동생성 할 수 있다. [[https://projectlombok.org/features/log|@Log]] 를 통해 각종 Logger 를 자동생성 할 수 있다.
줄 164: 줄 170:
  
 ===== @ToString, @EqualsAndHashCode 필드명 지정시 오타 문제 ===== ===== @ToString, @EqualsAndHashCode 필드명 지정시 오타 문제 =====
 +
 +**Lombok 1.18.0 부터 @ToString, @EqualsAndHashCode에 대해 필드, 혹은 메소드에 Include, Exclude 지정이 가능해졌다.** 따라서 아래 문제가 모두 해소 된다.
 +
 [[https://projectlombok.org/features/ToString|@ToString]] 과 [[https://projectlombok.org/features/EqualsAndHashCode [[https://projectlombok.org/features/ToString|@ToString]] 과 [[https://projectlombok.org/features/EqualsAndHashCode
-|@EqualsAndHashCode]]에서는 파라미터로 특정 필드를 지정해서 처리 대상에 포함시키거나 제외시킬 수 있다.+|@EqualsAndHashCode]]에서는 파라미터로 특정 필드를 지정해서 처리 대상에 포함시키거(**of**)나 제외(**exclude**)시킬 수 있다.
  
 헌데 문제는 이게 필드 이름을 String으로 지정한다는 점이다. 이로 인해 IDE 에서 필드명을 리팩토링할 때 올바로 반영이 안되거나, 아주 단순한 오타가 나도 눈치를 못 챌 수 있다. **보통 오타등으로 인해 잘못된 필드가 지정되면 Compile 시점에 warning이 출력된다. 하지만 warning일 뿐, error가 아닌지라 그마저도 모르고 넘어갈 가능성이 높다.** 헌데 문제는 이게 필드 이름을 String으로 지정한다는 점이다. 이로 인해 IDE 에서 필드명을 리팩토링할 때 올바로 반영이 안되거나, 아주 단순한 오타가 나도 눈치를 못 챌 수 있다. **보통 오타등으로 인해 잘못된 필드가 지정되면 Compile 시점에 warning이 출력된다. 하지만 warning일 뿐, error가 아닌지라 그마저도 모르고 넘어갈 가능성이 높다.**
줄 171: 줄 180:
 현재 버전에서는 이를 error로 격상시킬 방법이 없다. 컴파일러 옵션 ''-Werror''를 주면 warning시에도 오류를 내며 컴파일을 멈추는데, 또 다른 문제는 lombok과 관계없는 다른 너무 많은 경우에 대해서 에러를 내버린다.(java 8 현재 ''-Xlint''를 통한 옵션 미세 조정이 제대로 작동을 안함. javac 버그로 보임) 현재 버전에서는 이를 error로 격상시킬 방법이 없다. 컴파일러 옵션 ''-Werror''를 주면 warning시에도 오류를 내며 컴파일을 멈추는데, 또 다른 문제는 lombok과 관계없는 다른 너무 많은 경우에 대해서 에러를 내버린다.(java 8 현재 ''-Xlint''를 통한 옵션 미세 조정이 제대로 작동을 안함. javac 버그로 보임)
  
 +이 문제는 [[https://wiki.jenkins.io/display/JENKINS/Log+Parser+Plugin|Jenkins Log Parser Plugin]] 으로 어느정도 해결 가능하다.
  
- +[[java:lombok:field_exist_verify|Lombok Field 지정이 올바른지 검사]] 에 관련 방법을 정리해두었다.
 ===== 실무 프로젝트에서는 보수적으로 사용 ===== ===== 실무 프로젝트에서는 보수적으로 사용 =====
-개인 Toy 프로젝트가 아닌 실무 프로젝트에서는 가급적 [[https://projectlombok.org/features/GetterSetter|@Getter, @Setter]], [[https://projectlombok.org/features/ToString|@ToString]] 만 사용하고 그 외의 것들 사용은 자제하거나 매뉴얼을 철저히 읽어보고서 보수적으로 사용한다.+개인 Toy 프로젝트가 아닌 실무 프로젝트에서는 가급적 [[https://projectlombok.org/features/GetterSetter|@Getter, @Setter]], [[https://projectlombok.org/features/ToString|@ToString]] 만 사용하고 그 외의 것들 사용은 자제하거나 매뉴얼을 잘 읽어보고서 보수적으로 사용한다.
  
-''@EqualsAndHashCode''는 Immutable 필드만 명시적으로 지정서 자제해서 사용하거나 가급적 코드를 직접 만든다.+''@EqualsAndHashCode''는 Immutable 필드만 명시적으로 지정하면서 자제해서 사용하거나 가급적 IDE 코드 제너레이션등을 통해 코드를 직접 만든다.
  
 특히 Experimental 기능은 사용하지 말고, IDE 지원이 확실치 못하고 문법 파괴적인 [[https://projectlombok.org/features/val|val]]도 사용하지 않는 것이 좋을 것 같다. 특히 Experimental 기능은 사용하지 말고, IDE 지원이 확실치 못하고 문법 파괴적인 [[https://projectlombok.org/features/val|val]]도 사용하지 않는 것이 좋을 것 같다.
줄 185: 줄 194:
  
 예를들어, 프로젝트 최상단 디렉토리에 ''lombok.config'' 파일을 만들고 다음과 같이 지정하면 ''@Data'', ''@Value'', ''val'', ''@NonNull'', ''@AllArgsConstructor'', ''@RequiredArgsConstructor'' 등의 사용이 금지된다. 예를들어, 프로젝트 최상단 디렉토리에 ''lombok.config'' 파일을 만들고 다음과 같이 지정하면 ''@Data'', ''@Value'', ''val'', ''@NonNull'', ''@AllArgsConstructor'', ''@RequiredArgsConstructor'' 등의 사용이 금지된다.
 +
 +억지로 사용할 경우 컴파일 오류가 발생한다.
  
 <code> <code>
줄 191: 줄 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.cleanup.flagUsage=error
 +lombok.sneakyThrows.flagUsage=error
 +lombok.synchronized.flagUsage=error
 +# experimental 전체 금지
 +lombok.experimental.flagUsage=error
 +
 # 기타 각종 사용해서는 안되는 기능들을 모두 나열할 것. # 기타 각종 사용해서는 안되는 기능들을 모두 나열할 것.
 </code> </code>
  
 상세한 설정 옵션은 각 애노테이션 매뉴얼 페이지 하단에 자세히 나와 있다. 상세한 설정 옵션은 각 애노테이션 매뉴얼 페이지 하단에 자세히 나와 있다.
java/lombok/pitfall.1499183235.txt.gz · 마지막으로 수정됨: 2017/07/05 00:17 저자 kwon37xi