• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

11:50초 질문 입니다.

23.12.04 20:58 작성 23.12.04 20:59 수정 조회수 151

0

[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)

[질문 내용]
@OneToMany 어노테이션 사용시 new ArrayList<>(); 를 관례상 쓰는 이유 외에도 다양한 장점들에 대해 자세히 알 수 있을까요? 감사합니다.

답변 1

답변을 작성해보세요.

0

codesweaver님의 프로필

codesweaver

2023.12.05

안녕하세요. 주호세님, 공식 서포터즈 코즈위버입니다.

JPA는 엔터티 내 콜렉션 필드를 PersistentBag 콜렉션으로 감싸 사용합니다. PersistentBag은 지연로딩 및 객체변경추적 등을 지원하며 JPA의 최적화 및 더티체킹을 지원합니다. 만약 사용자가 엔터티의 콜렉션 필드를 덮어씌울경우 JPA 정상 동작을 보장할 수 없습니다.

PersistentBag으로 감싸기 위해선 콜렉션이 일단 생성(메모리 상)되어있어야 합니다. 즉, new ArrayList<>();가 어딘가에선 반드시 수행된 후 PersistentBag으로 감쌀 수 있습니다. 그러나 JPA가 어느 시점에 엔터티에 접근하여 콜렉션을 PersistentBag으로 감쌀지 사용자가 예측하기 힘듭니다. 그래서 강의에서는 필드에 콜렉션을 선언함과 동시에 초기화도 같이 하도록 안내하고 있습니다.

콜렉션 초기화를 setter 등을 이용하게 될 경우 콜렉션이 메모리에 생성되기 전에 JPA가 먼저 PersistentBag을 만들려고 시도할 수 있어 오류가 날 수 있습니다.

감사합니다.