====== Lombok Upgrade ====== * [[java:lombok|Lombok]] 버전업을 할 때는 매우 주의가 필요하다. * 기본 설정값이 버전별로 달라지면서 크게 문제가 된다. ===== Upgrade 과정 ===== * https://projectlombok.org/changelog 에서 **BREAKING CHANGES** 를 필수적으로 확인한다. * 먼저 **현재 Lombok 적용된 소스들을 모두다 delombok** 한다. * 그 뒤에 **Lombok 버전 업후 다시 delombok** 해본다. * 이 둘의 diff 를 보고 서로 달라졌다면 왜 달라졌는지 확인해야 한다. * 그리고 기존 버전에 맞게 설정을 바꾸거나 코드를 직접 작성해 넣는 것이 좋다. ===== 문제된 설정들 ===== ==== 1.16.20 lombok.anyConstructor.addConstructorProperties ==== * ''1.16.20'' : ''lombok.anyConstructor.addConstructorProperties'' 기본값이 ''false''로 변경되었다. * 그 이전 버전에서는 ''@XXXConstructor'', ''@Data'', ''@Value'' 등을 사용할 경우 [[https://docs.oracle.com/en/java/javase/17/docs/api/java.desktop/java/beans/ConstructorProperties.html|@java.beans.ConstructorProperties]] 로 생성자에 생상자 파라미터의 이름을 주입해줬고, [[java:jackson|Java Jackson JSON Library]] 등의 라이브러리가 객체 생성시 이 애노테이션 정보를 통해 객체를 생성했었다. * 이게 기본 ''false''가 되고, **기본 생성자가 없는 상태**에서는 객체를 생성하는 라이브러리들이 객체 생성시 어떤 프라퍼티를 생성자의 어느 파라미터로 넣어야 하는지 알 수가 없기 때문에 올바른 객체 생성이 안된다. * **기본 생성자를 생성하거나** : 이렇게 하면 기본 생성자로 객체 생성 후 reflection 으로 프라퍼티 값 주입 * **스스로 생성자에 @ConstructorProperties 를 붙여주거나** * ''lombok.anyConstructor.addConstructorProperties=true'' 로 설정한다. ==== 1.18.4 Field 에 붙은 annotation 이 setter 로 복사됨 ==== * 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|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 프라퍼티 사용하던 곳은 모두 오류 발생.