## 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처럼)
출처
'개발자의 삶 > JPA' 카테고리의 다른 글
[JPA] Persistence Context, Relationship Mapping, Inheritance Mapping, MappedSupperClass (0) | 2022.02.23 |
---|---|
[JPA] Entity Mapping (0) | 2022.02.23 |
[JPA] JPA vs hibernate vs Spring Data JPA (0) | 2022.02.18 |
[JPA] study note (0) | 2022.02.18 |