프록시
프록시 객체: 실제 엔티티 객체 대신에 데이터베이스 조회를 지연할 수 있는 가짜 객체다.
프록시 객체를 만들어서 조회하기 위해서는 아래와 같이 사용하면 된다.
Member member = em.getReference(Member.class, "member1");
프록시 클래스는 실제 클래스를 상속받아서 만들어진다.
프록시 객체는 실제 클래스의 참조를 보관하고 있기 때문에 프록시 객체의 메소드를 호출하면 실제 객체의 메소드를 호출하게 된다.
프록시 객체의 특징
- 처음 한 번만 초기화된다. (초기화: 영속성컨텍스트에 DB에서 가져온 엔티티 저장하는 작업)
- 영속성 컨텍스트에 이미 찾는 엔티티가 있으면 em.getReference()를 호출해도 실제 엔티티를 반환한다.
프록시 객체는 PK를 보관하고 있기 때문에 team.getId()로 조회해도 프록시를 초기화하지 않는다.
엔티티 접근 방식을 프로퍼티로 설정한 경우에만 해당한다.
Team team = em.getReference(Team.class, "team1");
team.getId();
질문: 연관관계를 설정할 때는 엔티티 접근 방식을 필드로 설정해도 프록시를 초기화하지 않는다. p295
필드 접근 방식(Field Access)
@Entity
public class Order {
@Id // 필드 접근 방식
private Long id;
@ManyToOne // 필드 접근 방식
private Customer customer;
// ...
}
프로퍼티 접근 방식(Property Access)
@Entity
@Access(AccessType.PROPERTY) // 프로퍼티 접근 방식
public class Order {
private Long id;
private Customer customer;
@Id
public String getId(){
return id;
}
@ManyToOne
public Customer getCustomer() {
return customer;
}
public void setCustomer(Customer customer) {
this.customer = customer;
}
// ...
}
즉시 로딩과 지연 로딩
즉시 로딩: 엔티티를 조회할 때 연관된 엔티티도 함께 조회한다.
지연 로딩: 연관된 엔티티를 실제 사용할 때 조회한다.
지연 로딩 활용
추천하는 방법
- 모든 연관관계에 지연로딩을 사용한다.
- 즉시로딩을 사용한다면 컬렉션을 조회할 때는 주의하자.
- 즉시로딩을 사용한다면 컬렉션은 항상 외부조인을 사용하자.
영속성 전이: CASCADE
CASCADE 종류
- ALL : 속성 모두 적용
- PERSIST : 영속성 적용
- MERGE : 병합 적용
- REMOVE : 삭제 적용
- REFRESH
- DETACH
여러 속성을 사용할 수 있다.
고아 객체
부모 엔티티의 컬렉션에서 자식 엔티티의 참조를 제거하면 자식 엔티티는 자동으로 삭제된다.
영속성 전이 + 고아 객체, 생명주기
CASCADE.ALL + orphanRemoval = true 를 동시에 사용하면 자식 엔티티의 저장과 제거를 신경쓰지 않아도 된다.
부모 객체에 자식 엔티티를 등록 -> 자식 엔티티가 자동으로 영속성 컨택스트에 등록된다.
부모 객체에서 자식 엔티티 제거 -> 자식 엔티티가 자동으로 영속성 컨택스트에서 제거된다.
정리
'Coding > computer science' 카테고리의 다른 글
자바 ORM 표준 JPA 프로그래밍 | 10. 객체지향 쿼리 언어 (0) | 2023.11.16 |
---|---|
자바 ORM 표준 JPA 프로그래밍 | 09. 값 타입 (+ 값 타입 컬렉션 최적화 방법) (0) | 2023.10.26 |
자바 ORM 표준 JPA 프로그래밍 | 07. 고급 매핑 (0) | 2023.10.05 |
자바 ORM 표준 JPA 프로그래밍 | 06. 다양한 연관관계 매핑 (0) | 2023.09.18 |
자바 ORM 표준 JPA 프로그래밍 | 05. 연관관계 매핑 기초 (0) | 2023.09.12 |