공부기록/JPA

JPA-프록시

jhs0129 2022. 1. 26. 13:40
320x100
반응형

프록시

실제 클래스를 상속받아서 만들어진 가짜 객체

객체를 DB에서 찾을 때와는 다르게 em.persist()가 아닌 em.getReference()를 이용해서 조회를 한다 메서드명에서 보는거와 같이 무언가(실제 객체)를 참조를 하고 있는 객체이다

프록시 객체는 getXXX()처럼 실제로 처음 사용이 될때 값이 초기화가 된다

이미 영속성 컨텍스트에 찾는 객체가 있으면 실제 엔티티 반환된다

초기화 과정

  1. getXXX()처럼 실제로 사용
  2. 영속성 컨텍스트에 초기화 요청
  3. DB조회
  4. 실제 Entity생성
  5. 실제 객체를 참조하고 있는 target.getXXX()실행

org.hibernate.Hibernate.initialize(프록시객체);을 이용하여 강제로 직접 초기화 할 수 있다

즉시로딩 지연로딩

설정 방법

@XXXToXXX(fetch = FetchType.EAGER) - 즉시로딩

@XXXToXXX(fetch = FetchType.LAZY) - 지연로딩

즉시로딩

해당 객체를 조회하면 참조하는 객체도 같이 JOIN문을 이용하여 한번에 조회

이때 JOIN은 Left outter join(선택적 관계로 적용)이 이용된다

left outer join이 아닌 inner join을 사용을 원한다면 아래 두 코드중 하나를 선택하여 사용하면 된다

  • @ManyToOne(fetch = EAGER, optional = false)
  • @JoinColumn(nullable = false)

지연로딩

해당 객체를 조회하면 fk로 참조하는 객체는 조회하지 않고 나중에 실제로 사용시 조회

이때 참조하는 객체는 프록시 객체로 초기화 되지 않은 상태로 넣어둔다

기본 패치 전략

@XXXToOne - 즉시로딩
@XXXToMany - 지연로딩

영속성 전이

DataBase를 공부할 때 참조 무결성 조건을 지키기 위해서 사용한 on delete cascade와 같다고 생각 하면된다

on delete cascade는 참조되는 테이블에서 행이 삭제되면 참조 무결성 조건을 지키기 위해서 참조하는 테이블의 행도 삭제를 하도록 하는 것이다

이에 맞게 JPA에서는 @OneToMany(cascade = CascadeType.REMOVE)와 같이 cascade를 시켜준다

Cascade 종류

  • ALL: 모두적용
  • PERSIST: 영속
  • REMOVE: 제거
  • MERGE: 병합
  • REFRESH: Refresh
  • DETACH: Detach

REMOVE는 orphanRemoval = true조건을 준것과 동일한데 orphanRemoval는 부모 객체가 삭제 되었을때 자식객체도 같이 제거를 하도록 하는 것이다

참고

자바 ORM 표준 JPA 프로그래밍 - 기본편_김영한 님 강의

https://www.inflearn.com/course/ORM-JPA-Basic

320x100

 

 

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

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

www.inflearn.com

책 - 자바 ORM 표준 JPA 프로그래밍

http://www.kyobobook.co.kr/product/detailViewKor.laf?mallGb=KOR&ejkGb=KOR&barcode=9788960777330

 

자바 ORM 표준 JPA 프로그래밍 - 교보문고

스프링 데이터 예제 프로젝트로 배우는 전자정부 표준 데이터베이스 프레임 | ★ 이 책에서 다루는 내용 ★■ JPA 기초 이론과 핵심 원리■ JPA로 도메인 모델을 설계하는 과정을 예제 중심으로

www.kyobobook.co.kr

 

320x100
반응형