[Spring] @ConstructorProperties는 꼭 필요한가요? (feat.Lombok)
제목이 저런 건 코드 리뷰를 받던 중 이런 질문이 들어왔기 때문이다.
당시 내 코드는 이랬다.
음... 저걸 쓰지 않으면 에러가 나서요... 라고 답할 순 없었기에 적합한 이유를 찾아야 했다. 이유는 lombok 1.16.20 브레이킹 체인지 에서 찾을 수 있었다. 내 lombok 버전은 1.18.18 이었지만 Java8을 쓰고 있었기에 1.16.20 이전의 사용법이 적용된 듯 했다.
그렇다면 나중에 Java9 이상으로 업데이트를 하면 이 코드가 에러가 나겠구나, 싶어 다른 방법을 써보기로 했다. 먼저 해당 어노테이션을 없애기 위해 무슨 역할을 하는지 알아야했다.
@ConstructorProperties
ConstructorProperties 는 생성자의 속성 명칭을 지정해지주는 어노테이션으로 역직렬화를 쓰는 데 이용한다. 역직렬화 문제를 해결하면 되기에 처음엔 이렇게 바꿔주었다.
@NoArgsConstructor
@RequiredArgsConstructor
@Getter
public class PathDto {
private String from;
}
주목해야 할 점은 @NoArgsConstructor 이다. 역직렬화를 위해 빈 생성자가 필요했고, 이에 필드 변수에 final이 사라지는 것이다.
불변객체가 아니라고... 이건 영 아니올시다... 그래서 다른 방법이 없는지 알아보다가 리뷰어분께 SOS를 쳤다.
@Jacksonized
리뷰어분이 준 해답은 Lombok 1.18.0 and Jackson 2.9.6 not working together 에 적혀있듯이 @Jacksonized 를 사용하는 거였다.
The best way to make jackson and lombok play well together is to always make your DTO's immutable, and tell jackson to use the builder to deserialize into your objects
위 인용구를 해석하자면 jackson과 롬복을 조화롭게 쓰는 방법은 DTO를 불변객체로 만들고 builder를 통해 jackson이 역직렬화를 하도록 만드는 것이었다. 그 방법이 @Jacksonized 를 쓰는 거였고.
결과적으로 코드는 이렇게 고쳐졌다.
결론적으로 당장 코드 자체에 문제는 없었지만 차후에 에러가 발생할 가능성이 농후했기에 리팩토링을 하게 된 셈이다. 이것도 몇 년 뒤엔 리팩토링이 필요한 코드가 될 지도 모른다. 앞으론 에러가 나면 버전 이슈 때문일 수도 있는 가능성을 염두에 둬야겠다.