Entity 에서 List 를 초기화 해주는 이유

알파로그·2023년 3월 21일
1

Spring Boot

목록 보기
18/57

✏️ 발단

Jump to String Boot 를 공부하면서 궁금증이 생겼다.

내가 알기론 Entity 의 참조 필드를 선언해 줄 때

N : 1 관계에선 new 를 사용해 초기화 해줘야 되는걸로 알고있었는데

private List<Member> members = new List<>();

Jump to Spring boot 에서는 초기화를 하지 않는 방식으로 적혀있다.

private List<Member> members;

두 방법 모두 정상적으로 작동을 하지만 이렇게 초기화를 하지않고, 하고 차이가 무엇인지 궁금했다.

초기화 없이 프로젝트를 실행해봐도 차이점을 채감할 수 없어서 구글링을 해본결과 2가지 이유가 있다고한다.

✏️ 초기화를 해줘야하는 이유

초기화를 해줘야하는 2가지 이유가 있다고 한다.

  1. NPE 방지
  2. 하이버네이트의 오류 방지

📍 NPE - NullPointException

필드에서 new 로 선언해주지 않는다면 List 의 값은 null 이 될테고,

이 때 List 를 조회하는 쿼리가 있다면 NPE 가 발생한다는 의미 같다.


📍 하이버네이트의 오류 방지

  • 하이버네이트는 Entity 를 영속화 할 때 내부에 Collection 이 있다면 하이버네이트가 특별하게 조작한 Collection 으로 변경시킨다.
    • Collection 의 변경감지를 인식하기 위해서
  • 이 경우 개발자가 추후에 new ArrayList 로 초기화를 하게되면,
    하이버네이트가 관리하는 Collection 에서
    개발자가 직접 만든 Collection 으로 변경되어 버린다.
    • 이렇게되면 하이버네이트가 정상 작동되지 않는다.
  • new 로 초기화를 해주는 이유는
    필드에서 애초에 Collection 을 초기화 하고,
    관리중인 Collection 을 추후에 임의로 바꾸는 행위를 막아 하이버네이트의 오류를 방지하기 위함이다.
profile
잘못된 내용 PR 환영

0개의 댓글