[Spring] @OneToMany 리스트에 add 호출 시 NPE 발생

째욘·2024년 11월 23일
0

1. 문제 상황

@OneToMany로 매핑된 reviewImages 리스트에 개별 reviewImage를 add하려다가 NPE(NullPointerException)가 발생했다.

위 코드에서, reviewImages 리스트에 이미지를 추가하려고 했지만, 리스트가 초기화되지 않은 상태에서 add를 호출했기 때문에 NPE가 발생했다.


2. 문제 원인

결국 문제의 원인은 reviewImages 필드가 초기화되지 않은 상태에서 add를 호출했기 때문이다.

@Builder 패턴을 사용해 Review 객체를 생성하면서, List 초기화가 제대로 이루어지지 않아 발생하는 문제였다.

Lombok의 @Builder를 사용하면, 엔티티 정의 시 설정된 List 초기화(= new ArrayList<>())가 적용되지 않는다. 그 결과, reviewImages 필드가 null 상태로 남아 데이터 추가 시 NPE가 발생하는 것이다.


3. 해결 방법

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를 사용하는 방식을 선택했다.

0개의 댓글

관련 채용 정보