개발자의 삶/JPA

[JPA] Proxy, Lazy & Eager Loading, Cascade, Orphan

Kedric 2022. 2. 24. 14:31
728x90
반응형

## Proxy 프록시

em.find() // DB를 통해 실제 엔티티 객체 조회
em.getReference() // DB 조회를 미루는 가짜(프록시) 엔티티 객체 조회

 

- 프록시 객체를 초기화 할 때 프록시 객체가 실제 엔티티로 바뀌는 것이 아니라

초기화되면 프록시 객체를 통해서 실제 엔티티에 접근 가능.

- 프록시 객체는 처음 사용할 때 한 번만 초기화.

 

- 프록시 ≠ 엔티티.

- instanceOf 사용. (객체와 비교)

- 프록시 객체는 원본 엔티티를 상속받음

- 영속성 컨텍스트에 이미 엔티티가 존재하면 프록시를 따로 반환하지 않음 (getRefer 해도 프록시가 아닌 엔티티 반환)

- 프록시 먼저 호출하고, 엔티티를 호출하면 엔티티도 프록시를 반환함

- 영속성 컨텍스트를 날리면( em.detach(member), em.close(), em.clear() ) 프록시 조회 못함

 

Member member = em.getReference(Member.class, member.getId());

emf.getPersistenceUnitUtil().isLoeaded(member); // 프록시 인스턴스 초기화 여부 확인
Hibernate.initialize(member); // 강제 초기화
member.getClass() // 프록시 클래스 확인 방법

 

 

## Lazy Loading 지연로딩

@ManyToOne(fetch = FetchType.LAZY)
@JoinColoum(name = “TEAM_ID”)
private Team team;


- Member 조회시 team 안들고 오고(팀은 프록시로 들고옴)
- team 가져와서 실제 사용하는 순간 초기화됨

Member member = new Member();
em.find(Member.class, member.getId()); // Member 만 조회, Team은 proxy로 반환

Team team = member.getTeam();
String name = team.getName(); // 이 때 초기화됨.

 

 

## Eager Loading 즉시로딩

@ManyToOne(fetch = FetchType.EAGER)
@JoinColoum(name = “TEAM_ID”)
private Team team;

- join해서 한번에 초기화. 프록시가 아닌 실제 엔티티

Member member = new Member();
em.find(Member.class, member.getId()); // Member, Team 한번에 조회

 

- 가급적 지연로딩 사용 **

- ManyToOne OneToOne > 기본이 즉시로딩 > lazy 설정

- OneToMany ManyToMany > 기본이 지연로딩

 

 

 

## Cascade 영속성 전이

@OneToMany(mappedBy = “parent”, cascade = CascadeType.ALL)
private List<Childe> childList = new ArrayList<>();

// ALL, REMOVE +@

- em.persist(parent); > child도 같이 persist

 

 

## Orphan 고아객체

@OneToMany(mappedBy = “parent”, orphanRemoval = true)
private List<Childe> childList = new ArrayList<>();
Parent parent = new Parent();
Parent findParent = em.find(Parent.class, parent.getId());

findParent.getChildList().remove(0); // chile를 persist 하지 않아도 처리됨

- 원래라면 em 으로 영속화(em.persist) 및 제거(em.remove)하지만, life cycle(생명주기)를 부모가 관리.

- 부모를 제거하면 자식도 같이 제거됨(cascade type remove처럼)

 

 

출처

https://www.inflearn.com/roadmaps/149

728x90
반응형