사용자 도구

사이트 도구


java:lombok:upgrade

문서의 이전 판입니다!


Lombok Upgrade

  • 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 등을 사용할 경우 @java.beans.ConstructorProperties 로 생성자에 생상자 파라미터의 이름을 주입해줬고, Java Jackson JSON Library 등의 라이브러리가 객체 생성시 이 애노테이션 정보를 통해 객체를 생성했었다.
  • 이게 기본 false가 되고, 기본 생성자가 없는 상태에서는 객체를 생성하는 라이브러리들이 객체 생성시 어떤 프라퍼티를 생성자의 어느 파라미터로 넣어야 하는지 알 수가 없기 때문에 올바른 객체 생성이 안된다.
  • 기본 생성자를 생성하거나 : 이렇게 하면 기본 생성자로 객체 생성 후 reflection 으로 프라퍼티 값 주입
  • 스스로 생성자에 @ConstructorProperties 를 붙여주거나
  • lombok.anyConstructor.addConstructorProperties=true 로 설정한다.

1.18.4 Field 에 붙은 annotation 이 setter 로 복사됨

  • field 에 붙은 annotation 이 setter 로 복사되는데, 평상시에는 이게 큰 문제가 없으나 필드가 is로 시작하는 boolean 일 경우 문제 발생소지가 있음.
  • 이유는 booean isSomething; 필드는 Lombok 이 something 이라는 프라퍼티로 간주하고 getter/setter 는 사실상 setSomething/isSomething으로 생성되는데, 문제는 isSomething 이라는 것을 직접 읽는 프레임워크는 프라퍼티를 isSomething으로 해석해버림. 그런데 getter/setter 에 isSomething()/setSomething()은 Java Bean 표준상 프라머티가 something 이다.
  • 즉, 일부 라이브러리(Java Jackson JSON Library)가 필드와 getter/setter 두가지 모두로 프라퍼티를 판단할 경우 어느 것을 기죽으로 개발자가 property 를 사용했는지 판단하기 힘들다.
  • 이 때 annotation 이 필드(isSomething 프라퍼티)와 메소드(something)에 둘다 적용되면서 두 프라퍼티 중 하나는 잘못 작동하게 된다.
java/lombok/upgrade.1656314752.txt.gz · 마지막으로 수정됨: 2022/06/27 16:25 저자 kwon37xi