본문 바로가기
공부/Spring

[JPA] 프록시와 연관관계 관리(지연로딩)

by JERO__ 2022. 7. 2.

프록시

  • em.find() : DB를 통한 실제 엔티티 객체 조회
  • em.getReference() : DB조회를 미룬 가짜(프록시) 엔티티 객체 조회
    • 사용되는 시점에 조회함

프록시 특징

  • 실제 클래스를 상속받아 만들어진다. 프록시 객체를 통해 실제 객체에 접근하는 것이다.
  • 처음 사용시 한번만 초기화한다.

즉시로딩과 지연로딩

  1. 지연로딩 : 프록시로 조회 LAZY

  1. 즉시로딩 EAGER
  • Member와 Team을 보통 동시에 사용한다면 사용한다.
  • 프록시를 사용하지 않는다.

즉시로딩 주의

  • 가급적 지연로딩만 사용한다(특히 실무에서)
  • 즉시로딩은 N+1 문제를 일으킨다.
    • OneToMany, ManyToMany은 default가 LAZY이다.
    • ManyToOne, OneToOne은 default가 즉시로딩이다. → LAZY로 설정하자

영속성 전이(CASCADE)와 고아 객체

영속성 전이

특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속상태로 만들고 싶을 때

Child child1 = new Child();
Child child2 = new Child();
Parent parent = new Parent();
parent.addChild(child1);
parent.addChild(child2);

em.persist(parent);  // child까지 한번에 추가
@OneToMany(mappedBy = "parent", cascade = CascadeType.ALL)
private List<Child> childs = new ArrayList<>();

고아 객체 orphanRemoval = true : 게시판의 첨부파일

고아객체 제거 : 부모 엔티티와 연관관계가 끊어진 자식 엔티티를 자동으로 제거

@OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Child> childs = new ArrayList<>();
Child child1 = new Child();
Child child2 = new Child();
Parent parent = new Parent();
parent.addChild(child1);
parent.addChild(child2);

em.persist(parent);  // child까지 한번에 추가
em.flush();
em.clear();

Parent findParent = em.find(Parent.class, parent.getId());
findParent.getChilds().remove(0);
  • 참조하는 곳이 하나일 때 사용
  • 특정 엔티티가 개인 소유할 때 사용
    • 게시판의 첨부파일

'공부 > Spring' 카테고리의 다른 글

[JPA] 쿼리 문법  (0) 2022.07.18
[JPA] 값 타입  (0) 2022.07.02
[JPA] 다양한 연관관계 매핑  (0) 2022.07.02
[JPA] 연관관계 매핑 기초  (0) 2022.07.02
[JPA] 엔티티 매핑  (0) 2022.07.02

댓글