@Singular 어노테이션 트러블슈팅
@Singular
기본적으로 lombok의 @Singular 어노테이션은 언제나 빈 컬렉션을 만들어 추가해주기 때문에 null이 아님을 보장하고, 컬렉션에 단일 객체들을 추가할 수 있는 builder 패턴 메서드들을 추가해준다.
@Singular
private List<Comment> comments;
와 같은 프로퍼티가 있으면
Board.builder()
.id(1)
.title("제목")
.comment(comment1)
.comment(comment2)
.comments(commentList)
.build();
와 같은 식으로 사용할 수 있다.
그런데 유닛 테스트를 돌리던 도중 컬렉션이 null이라 테스트를 실패했는데, 이유는 다음과 같다.
// 잘못된 사용법
Board board = new Board();
// 기본 생성자 사용
// board.setComments(null); // 명시적으로 null 설정 필요
// 올바른 사용법
Board board = Board.builder().title(“제목”).build();
@Singular 어노테이션의 경우 빌더 패턴으로 객체를 생성하는 것이 아니면 무효화된다. 빈 객체를 생성하여 null이 아님을 보장해주는 기능도 작동하지 않는다. 유의해서 사용해야 할 것 같다.
또한 @Singular 어노테이션이 생성하는 컬렉션은 불변 컬렉션이기 때문에 수정이 잦은 우리 프로젝트의 JPA 엔티티에는 사실 맞지 않다. @Builder.default 어노테이션으로 변경하여 null이 아님을 보장했다.
알지 못하는 것은 쓰지도 않는 것을 목표로 하고 있지만은, 안해본걸 해보기 위한 프로젝트에서 바쁜 개발일정까지 더해지니 지키기가 쉽지 않은 것 같다. 그래도 최대한 노력을 해보자.