Search

Lombok prefix

태그
Java
Spring
분류
트러블슈팅
생성 일시
2023/08/15 08:39
프로젝트
42PAW

Lombok에는 prefix 기능이 있다?

42 PAW에는 게시글을 줄 때, 로그인 되어있다면 해당 게시글에 대한 좋아요와 스크랩 여부를 판단해 응답에 포함시켜 isReacted와 isScrapped라는 json으로 보내주는 로직이 있다. 해당 기능이 구현되어 있는 상태에서 프론트를 붙이는 작업을 했더니, 데이터를 받으면 isReacted와 isScrapped가 undefined가 발생하는 이슈가 있었다.
나는 당연히 자바에는 undefined라는 값이 없으니 데이터 형식을 잘못 보냈거나, 받을 때 잘못 받았겠다라고 생각을 했었다. 하지만 보내는 DTO나 프론트에서 받는 값에는 전혀 이상이 없었고, 메세지를 까보니 isReacted, isScrapped가 아닌 reacted와 scrapped라는 이름으로 들어가 있었다.
알고보니 Lombok을 사용하면 자체적으로 is라는 prefix를 붙이거나 제거하는 작업을 수행하기 때문에, 응답에 있던 is prefix가 제거되었던 것이다.

is Prefix

Lombok에서는 boolean 타입의 멤버 변수를 Getter와 Setter를 사용할 때 getXXX(), setXXX()가 아닌 isXXX(), setXXX()로 사용한다. 이 때 boolean 변수의 이름이 isNew 처럼 is로 시작하게되면, isIsNew()와 같이 지어져야하고 정상적인 동작이 이루어지지 않기 때문에 is를 떼어내고 isNew()와 setNew()로 작명한다.
위에서 발생한 문제도 Lombok의 이런 메커니즘에 의해 값을 생성할 때 자동적으로 is를 제거하여 저장된 것으로 보인다. 이를 해결하기 위한 방법은 두 가지가 있다.
1.
is를 사용하지 않는 이름으로 변경하기
우리가 선택한 해결책으로, 단순히 하나의 DTO에 들어가는 필드명일 뿐이고 내부 구현에는 해당 사항을 저장하는 부분이 따로 없기 때문에 그냥 reacted와 scrapped로 수정하여 사용했다.
2.
Boolean 타입을 사용하기
boolean이 아니라 Boolean으로 박싱된 타입을 사용하면 위의 is를 떼고 보내는 현상이 없다. 이는 Getter와 Setter에서도 마찬가지이다.
3.
annotation 설정을 바꾸기
사실 이 방법으로는 이 문제의 해결 할 수 없는데, Getter를 사용할 때 boolean 변수 앞에 자동으로 is가 붙는 현상을 해결하는 방법이라 추후 필요할 수도 있을 것 같아 가져왔다.
@Getter public class MyClass { @Accessor(fluent = true) private boolean isNew; }
Java
복사
이와 같이 Accessor 애노테이션의 fluent 옵션을 사용하면, Getter를 isNew가 아니라 getIsNew로 생성하게 된다.

참고