@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이 아님을 보장했다.
 
알지 못하는 것은 쓰지도 않는 것을 목표로 하고 있지만은, 안해본걸 해보기 위한 프로젝트에서 바쁜 개발일정까지 더해지니 지키기가 쉽지 않은 것 같다. 그래도 최대한 노력을 해보자.