@OneToMany로 매핑된 reviewImages 리스트에 개별 reviewImage를 add하려다가 NPE(NullPointerException)가 발생했다.
위 코드에서, reviewImages 리스트에 이미지를 추가하려고 했지만, 리스트가 초기화되지 않은 상태에서 add를 호출했기 때문에 NPE가 발생했다.
결국 문제의 원인은 reviewImages 필드가 초기화되지 않은 상태에서 add를 호출했기 때문이다.
@Builder 패턴을 사용해 Review 객체를 생성하면서, List 초기화가 제대로 이루어지지 않아 발생하는 문제였다.
Lombok의 @Builder를 사용하면, 엔티티 정의 시 설정된 List 초기화(= new ArrayList<>())가 적용되지 않는다. 그 결과, reviewImages 필드가 null 상태로 남아 데이터 추가 시 NPE가 발생하는 것이다.
Lombok의 @Builder.Default를 사용해서 해결했다.
이 어노테이션을 사용하면, @Builder 패턴으로 객체를 생성할 때도 기본값이 적용된다.
즉, reviewImages 필드가 항상 빈 리스트로 초기화된 상태를 유지할 수 있다.
Lombok 공식 문서 중,
@Builder will ignore the initializing expression entirely. If you want the initializing expression to serve as default, add @Builder.Default. If it is not supposed to be settable during building, make the field final.
@Builder는 초기화 표현을 완전히 무시해. 초기화하고 싶으면, @Builder.Default를 사용해. 아니면 final를 쓰던가.
final 같은 경우는, final로 선언된 컬렉션 필드가 다른 리스트로 교체되지 않는다는 가정 하에 문제 없을 것 같다. final로 선언해도 컬렉션 내부 요소는 수정이 가능하기 때문이다. (add, remove 등)
하지만 앞으로의 상황에 대한 유연성을 위해 @Builder.Default를 사용하는 방식을 선택했다.