본문 바로가기
JPA

프록시와 연관관계 (즉시로딩, 지연로딩)

by ppirae 2022. 7. 2.

내가 이해한 방향

 

프록시는 가짜 객체다.

실제 클래스를 상속 받아서 만들어지고 실제 클래스와 겉모양이 같다.

 

프록시 객체는 실제 객체의 참조(target)을 보관하고

프록시 객체를 호출하면 프록시 객체는 실제 객체의 메소드를 호출한다.

 

프록시의 특징

  • 프록시 객체는 원본 엔티티를 상속받음, 따라서 타입 체크시 주의해야함 (== 비 교 실패, 대신 instance of 사용)
  •  영속성 컨텍스트에 찾는 엔티티가 이미 있으면 em.getReference()를 호출해도 실제 엔티티 반환
  • 영속성 컨텍스트의 도움을 받을 수 없는 준영속 상태일 때, 프록시를 초기화하면 문제 발생 (하이버네이트는 org.hibernate.LazyInitializationException 예외를 터트림)

즉시로딩과 지연로딩

즉시로딩은 fetch = FetchType.EAGER 를 사용하여

연관된 엔티티를 한꺼번에 함께 조회한다.

 

지연로딩은 fetch = FetchType.LAZY 를 사용하여

연관된 엔티티를 프록시로 조회한다.

 

자주 함께 사용하는 연관 객체는 -> 즉시로딩

그렇지 않다면 -> 지연로딩

 

프록시와 즉시로딩 주의

  • 가급적 지연 로딩만 사용(특히 실무에서)
  • 즉시 로딩을 적용하면 예상하지 못한 SQL이 발생
  • 즉시 로딩은 JPQL에서 N+1 문제를 일으킨다.
  • @ManyToOne, @OneToOne은 기본이 즉시 로딩 -> LAZY로 설정
  • @OneToMany, @ManyToMany는 기본이 지연 로딩

 

실무

  • 모든 연관관계에 지연로딩 사용!
  • 즉시로딩 사용 XX
  • JPQL fetch 조인이나, 엔티티 그래프 기능 사용
  • 즉시로딩은 상상하지 못한 쿼리가 나감

영속성 전이 : CASCADE

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

예) 부모 엔티티를 저장할 때 자식 엔티티도 함께 저장

 

주의

영속성 전이는 연관관계 매핑과 아무 관계가 없음 편리함만 제공할 뿐


고아 객체

부모 엔티티와 연관관계가 끊어진 자식 엔티티를 자동으로 삭제

 

주의

참조하는 곳이 하나일 때만 사용

특정 엔티티가 개인 소유할 때 사용

 


인프런 김영한님의 JPA 기본편을 듣고 작성한 글입니다.

https://inf.run/87Mz

 

자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의

JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., - 강의 소개 | 인프런

www.inflearn.com

 

'JPA' 카테고리의 다른 글

스프링 데이터 JPA 소개  (0) 2022.07.15
API 개발 고급 - 지연 로딩과 조회 성능 최적화  (0) 2022.07.10
상속관계 매핑  (0) 2022.06.29
다양한 연관관계 매핑  (0) 2022.05.16
연관관계의 주인과 주의점  (0) 2022.05.14

댓글