작성
·
220
·
수정됨
답변 1
0
안녕하세요. 주호세님, 공식 서포터즈 코즈위버입니다.
JPA는 엔터티 내 콜렉션 필드를 PersistentBag 콜렉션으로 감싸 사용합니다. PersistentBag은 지연로딩 및 객체변경추적 등을 지원하며 JPA의 최적화 및 더티체킹을 지원합니다. 만약 사용자가 엔터티의 콜렉션 필드를 덮어씌울경우 JPA 정상 동작을 보장할 수 없습니다.
PersistentBag으로 감싸기 위해선 콜렉션이 일단 생성(메모리 상)되어있어야 합니다. 즉, new ArrayList<>();가 어딘가에선 반드시 수행된 후 PersistentBag으로 감쌀 수 있습니다. 그러나 JPA가 어느 시점에 엔터티에 접근하여 콜렉션을 PersistentBag으로 감쌀지 사용자가 예측하기 힘듭니다. 그래서 강의에서는 필드에 콜렉션을 선언함과 동시에 초기화도 같이 하도록 안내하고 있습니다.
콜렉션 초기화를 setter 등을 이용하게 될 경우 콜렉션이 메모리에 생성되기 전에 JPA가 먼저 PersistentBag을 만들려고 시도할 수 있어 오류가 날 수 있습니다.
감사합니다.