본문 바로가기

Programing/JVM(Java, Kotlin)

[lombok] mutable 변수에 대한 PMD 에러

lombok으로 참조 데이터 타입중 가변(mutable) 데이터 타입의 경우 발생하는 문제.

String이나 Long인 경우에는 객체의 값을 바꿀 수 없는 불변(immutable) 데이터 타입이다.


문제는 Date나 일반 객체의 경우는 mutable이다.


그런 경우 FindBugs에서는 EI_EXPOSE_REP2, Priority: Low 에러를 낸다.

This code stores a reference to an externally mutable object into the internal representation of the object. If instances are accessed by untrusted code, and unchecked changes to the mutable object would compromise security or other important properties, you will need to do something different. Storing a copy of the object is better approach in many situations.


@Getter / @Setter 의 경우에는 DeepCopy 로직으로 직접 구현한다.

@Builder와 같은 경우에는 build()로 생성된 static 클래스에 의해 만들어지므로 직접 구현이 쉽지 않아 보인다.


아래 링크를 따라가다 @SuppressFBWarnings 어노테이션으로 우선 잡히는 것에서 제거 하긴 했다.


Add a @Builder annotation for the builder pattern. : https://github.com/rzwitserloot/lombok/issues/89


Lombok Builder not generating safe code for mutable (like java.util.Date) type class fields : https://github.com/rzwitserloot/lombok/issues/822

=> @Getter and @Setter on a Date : https://github.com/rzwitserloot/lombok/issues/420


이슈에서는 @Clone 같은 어노테이션을 붙여서 deep copy를 하게 해달라고 요청했지만, 간단 히 구현이 쉽지 않고, 좋은 프로그래밍 모델이 아니라는 이유로 반려되었다.

👤 reinierz   🕗 Feb 01, 2015 at 23:23 UTC

Commenting in a 'WontFix' doesn't do much. We can't just implement clone, it's very hard to do, and it's a really bad programming model, and we don't want to give you a tool that is almost always used badly.

You can tell findbugs to stop generating issues on lombok generated code now though. See:

issue #737

findbugs에게 lombok에서 생성되는 코드라는 것을 알리라는 737 이슈를 참고하라고 한다.


이 이슈에 따르면 아래 어노테이션처럼 쓰라는 것이다.

@ SuppressFBWarnings(justification = "Generated code")