BoardServiceImpl에 관한 간단한 테스트 코드 작성중 아래와 같은 Lombok관련 컴파일 에러를 발견했다. 기본적으로는 책에서 제공하는 코드를 따라가고 있었는데, 처음 마주하는 컴파일 에러이고 또 구글링을 해봐도 관련해서는 생소한 에러인듯 싶어서 정리해본다.
Lombok builder is missing non nullable fields
구글링을 위의 키워드로 검색해보면 대부분 나오는 것은(스택 오버 플로우 등) @NotNull을 필드 위에 선언하고 Builder패턴을 클래스 레벨선언했을 때 보통 해당 에러가 발생한다는 것이다.
그래서 해결책으로는 NotNull을 선언한 필드레벨에 Builder.default와 같은 설정을 추가하는 것이었다. 나의 문제는 해당 BoardDTO에 NotNull은 커녕 별다른 설정을 한게 없는대도 해당 에러가 발생한다는 점이었다.
아래와 같이 replyCount 부분을 Builder에서 작성해주면 또 말끔하게 에러가 사라진다.
(다른 부분은 만진 부분이 전혀 없다.)
애초에 해당에러가 @Notnull 어노테이션과 충돌하기 때문에 발생하는 문제인데,
아무래도 호환성 문제 등이 아닐까 싶은데 이 역시 추정이라 확신할 수는 없다.
컬렉션과 같은 자료구조 등에서는 Null이 자동으로 들어가서 NPE가 터진다고 하는데(스택 오버플로우 등)
기본 자료형에서 왜 이와 같은 오류가 발생하는지는 도무지 알 길이 없다.
원인은 정확히 모르겠으나, 아래와 같이 int 자료형에 @Builder.Default를 선언하고
값 자체를 할당하면 에러 자체는 해결된다.
Lombok 라이브러리의 @Builder 관련하여 설명을 찾아보면 다음과 같다.
If a certain field/parameter is never set during a build session, then it always gets 0 / null / false. If you've put @Builder on a class (and not a method or constructor) you can instead specify the default directly on the field, and annotate the field with @Builder.Default:
@Builder.Default private final long created = System.currentTimeMillis();
위에 명시되어 있듯이, 필드 값이 빌드 세션 중에 값이 제대로 할당이 되지 않는 것 같으면 자료형에 따라 0, null, false가 할당된다는 소리인데.. 그 문제를 어떻게 @Build.Default와 같이 해결되는지 잘 모르겠다.
아래와 같이 replyCount의 자료형을 Long으로 바꾸면 또 문제는 귀신같이 사라진다.
이 파트는 일단은 정말 잘 모르겠는 부분이 많다.
해결은 했지만, 이 문제 자체의 원인을 알아서 해결했다기 보다는 돌려막다보니 해결했다는 인상이 강하다.
기본 자료형 중에서도 Int부분에 대해서만 에러가 난다는게.. 합리적으로 뭔가 납득이 가지 않는다.
clean build도 시도하고 , Build 설정도 확인하는 등 여러모로 시도해봤으나 뚜렷한 원인은 잘 모르겠다.
그래서 그런지 꽤 많이 찝찝하다.
롬복을 이용한 @Builder 패턴의 경우 실무에서 쓰이는 부분이 조금 제한적이라고 듣기도 하였고
사람에 따라 호불호도 많은 영역이며 클래스 레벨에 @Builder를 열어주는 것이 지양해야 한다고 들었다.
이런 부분이 코드의 다이어트에 기여한다할지라도 롬복을 사용하는 것이 반드시 좋은 점이 아닌 이유인거 같기도 하고.. 아무튼 이 부분은 추후 시간이 된다면 또 알아봐야겠다.
혹시 이 글을 읽는 분이 계시다면, 또 해당부분을 알고 계시다면 댓글을 남겨서 정보를 공유해주시면
정말 감사하겠습니다.