field 에 붙은 annotation 이 setter 로 복사되는데, 평상시에는 이게 큰 문제가 없으나 필드가 is
로 시작하는 boolean 일 경우 문제 발생소지가 있음.
애초에 boolean 필드에는 is 를 안 붙이고 true/false 를 나타낼법한 형용사를 사용하는게 좋다.
이유는 booean isSomething;
필드는 Lombok 이 something
이라는 프라퍼티로 간주하고 getter/setter 는 사실상 setSomething/isSomething
으로 생성되는데, 문제는 isSomething
필드를 직접 읽는 일부 라이브러리는 프라퍼티를 isSomething
으로 해석해버림. 그런데 getter/setter 에 isSomething()/setSomething()
은 Java Bean 표준상 프라머티가 something
이다.
즉, 일부 라이브러리(
Java Jackson JSON Library)가 필드와 getter/setter 두가지 모두로 프라퍼티를 판단할 경우 프라퍼티가 2개가 되면서 어느 것을 기준으로 개발자가 property 를 사용했는지 판단하기 힘들어짐.
이 때 annotation 이 필드(isSomething
프라퍼티)와 메소드(something
)에 둘다 적용되면서 두 프라퍼티 중 하나는 잘못 작동하게 된다.
실제 문제 발생 예)
@JsonProperty("isSomething") boolean isSomething;
// 기존에는 이 필드와 Lombok이 생성한 ''boolean isSomething()'' 메소드 때문에
// 프라퍼티가 JSON 필드가 두 개로 생성됨.
// 그런데 이 JSON을 사용하는 개발자가 something 프라퍼티를 사용했다.
// 버전업 이후 아래와 같이 setter 에도 애노테이션이 복제됨.
@JsonProperty("isSomething")
boolean setSomething(boolean sohmething) {
...
}
// 이로인해 Jackson 라이브러리는 setSomething/isSomething getter/setter 가 생성한
// ''something'' 프라퍼티를 json 필드로 만들지 않고 삭제해버림.
// something 프라퍼티 사용하던 곳은 모두 오류 발생.