프록시와 연관관계 정리
- 프록시와 즉시로딩, 지연로딩
- 영속성 전이와 고아 객체
객체는 객체 그래프로 연관된 객체들을 탐색하는데 그때 객체가 데이터베이스에 저장되어있어서 연관된 객체를 맘껏 탐색하기는 어려움
-> 이 문제를 해결하기 위해 프록시라는 기술 사용
- 프록시를 사용하면 연관된 객체를 처음부터 DB에서 조회하지 않고, 실제 사용하는 시점에 조회
- 자주 사용하는 객체들은 조인을 사용해서 조회하는 것이 효과적
- JPA는 즉시 로딩과 지연 로딩을 지원
프록시
엔티티를 조회할 때 연관된 엔티티들이 항상 사용되는 것은 아님
-> 한 엔티티를 조회할 때 연관된 엔티티를 같이 조회하는 것은 비효율적
JPA는 이런 문제를 해결하기 위해 엔티티가 실제 사용될 때 까지 조회를 지연하는 방법을 제공 = 지연 로딩
프록시 클래스
- 프록시 클래스는 실제 클래스를 상속받아서 만들어짐 -> 실제 클래스와 겉 모양이 같음
- 사용하는 입장에서는 이것이 진짜 객체인지 프록시 객체인지 구분하지 않고 사용
프록시 객체의 초기화
- 프록시 객체는 실제 사용될 때 데이터베이스를 조회해서 실제 엔티티 객체를 생성 = 프록시 객체의 초기화
프록시의 특징
- 프록시 객체는 처음 사용할 때 한 번만 초기화
- 프록시 객체를 초기화한다고 프록시 객체가 실제 엔티티로 바뀌는 것은 아님
- 프록시 객체가 초기화되면 프록시 객체를 통해서 실제 엔티티에 접근할 수 있음
- 프록시 객체는 원본 엔티티를 상속받은 객체이므로 타입 체크 시에 주의해서 사용
- 영속성 컨텍스트에 찾는 엔티티가 이미 있으면 DB를 조회할 필요가 없으므로 em.getReference()를 호출해도 프록시가 아닌 실제 엔티티 반환
- 초기화는 영속성 컨텍스트의 도움을 받아야 가능 (준영속 상태의 프록시 초기화 시 문제 발생)
식별자
엔티티를 프록시로 조회할 때 식별자 값을 파라미터로 전달하는데 프록시 객체는 이 식별자 값을 보관
프록시 확인
JPA의 PersistenceUnitUtil.isLoaded(Object entity) 메소드를 사용하면 프록시 인스턴스의 초기화 여부를 확인할 수 있음
초기화가 안되어있으면 false, 이미 초기화 되었거나 프록시 인스턴스가 아니면 true 반환
조회한 엔티티가 진짜 엔티티인지 프록시 엔티티인지 확인
클래스명을 출력하면 ..javassist..라 되어있는데 이러면 프록시임 (ex: member.getClass().getName();)
프록시 강제 초기화
하이버네이트의 initialize() 메소드를 사용하면 프록시를 강제로 초기화할 수 있음
-> JPA 표준에는 프록시 강제 초기화 메서드가 없으므로 member.getName()처럼 프록시의 메소드를 직접 호출해서 초기화 시킴
-> JPA 표준은 단지 초기화 여부만 확인
- 즉시 로딩: 엔티티를 조회할 때 연관된 엔티티도 함께 조회 (@ManyToOne(FetchType.EAGER))
- 지연 로딩: 연관된 엔티티를 실제 사용할 때 조회 (@ManyToOne(FetchType.LAZY))
즉, 지연 로딩은 연관된 엔티티를 프록시로 조회하는 것이고 즉시 로딩은 연관된 엔티티를 즉시 조회하는 것
참고
조회 대상이 영속성 컨텍스트에 이미 있으면 프록시 객체를 사용할 이유가 없음
각각의 장단점을 알고 상황에 맞게 쓰기
-> 모든 연관관계에 지연 로딩을 사용한 후 애플리케이션 개발이 어느 정도 완료되면 실제 상황을 보고 꼭 필요한 곳에만 즉시 로딩 사용 (최적화)
영속성 전이
객체를 저장하거나 삭제할 때 연관된 객체도 함께 저장하거나 삭제하는 것
부모 엔티티와 연관 관계가 끊어진 자식 엔티티를 자동으로 삭제하려면 고아 객체 제거 기능을 사용
'Backend > Spring Boot' 카테고리의 다른 글
[자바 ORM 표준 JPA 프로그래밍] 10장 (0) | 2023.05.30 |
---|---|
[자바 ORM 표준 JPA 프로그래밍] 9장 (0) | 2023.05.23 |
[자바 ORM 표준 JPA 프로그래밍] 7장 (0) | 2023.05.23 |
[자바 ORM 표준 JPA 프로그래밍] 6장 (0) | 2023.05.02 |
[Spring Boot] AWS S3 연결이 비공개로 설정되어 있지 않습니다. (0) | 2023.04.24 |