멤버를 조회할 때 팀도 함께 조회해야될까? 에서 시작하는 이야기
지연로딩
프록시 기초
- getFind()말고 getReference()가 있다.
- 데이터 조회를 미루는 가짜 엔티티 객체 조회한다.
- 프록시가 영속성 컨텍스트를 통해 DB조회 -> 엔티티 생성해서 그 때 값을 조회한다.
프록시 특징
- 처음 한번만 초기화
- 프록시 객체가 실제 엔티티로 바뀌는 것이 아님.
- 비교할 때 instanceof 사용해야 함.
- 이미 영속성 컨텍스트에 엔티티가 있으면 getReference() 를 호출해도 실제 엔티티 반환.
- 중요한건 뭐냐 , 프록시이건 아니건 잘 돌아가도록 해야 함.
프록시 인스턴스의 초기화 여부 확인
PersistenceUnitUtil.isLoaded(Object entity)
프록시 클래스 확인 방법
entity.getClass().getName() 출력(..javasist.. or HibernateProxy…)
프록시 강제 초기화
org.hibernate.Hibernate.initialize(entity);
즉시 로딩과 지연로딩
즉시 로딩
ManyToOne(fetch = FetchType.EAGER)
지연 로딩
ManyToOne(fetch = FetchType.LAZY)
모든 연관관계에 지연로딩을 써라.
왜 ?
- 즉시로딩을 하면 예상하지 못한 SQL 날라감.
- JPQL에서 N+1문제 발생.
- @ManyToOne, @OneToOne은 기본이 즉시 로딩이라 지연 로딩 설정 필요함.
영속성 전이 : CASCADE
- 특정 엔티티를 영속상태로 만들면서 연관 엔티티도 영속상태로 만들고 싶을 때 씀.
• ALL: 모두 적용
• PERSIST: 영속
• REMOVE: 삭제
• MERGE: 병합
• REFRESH: REFRESH
• DETACH: DETACH
고아객체
- 고아 객체 제거: 부모 엔티티와 연관관계가 끊어진 자식 엔티티 를 자동으로 삭제
• orphanRemoval = true
영속성 전이 + 고아객체
CascadeType.ALL + orphanRemoval=true
- 자식 생명주기를 부모가 관리하도록 할 수 있다.
- DDD 에 Aggregate Root 개념을 구현할 때 유용함.