Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

공hannah부

자바 ORM 표준 JPA 프로그래밍 CH08 (프록시와 연관관계 관리) 본문

공부/백엔드

자바 ORM 표준 JPA 프로그래밍 CH08 (프록시와 연관관계 관리)

Hannah0226 2023. 7. 17. 01:28

프록시

프록시 기초

  • 프록시 특징
    • 프록시 클래스는 실제 클래스를 상속 받아서 만들어지므로 실제 클래스와 겉 모양이 같다.
    • 프록시 객체는 실제 객체에 대한 참조를 보관한다.
    • 프록시 객체의 메소드를 호출하면 프록시 객체는 실제 객체의 메소드를 호출한다.
  • 프록시 객체의 초기화
    • 실제 사용될 때 데이터베이스를 조회해서 실제 엔티티 객체를 생성하는 것
    • 초기화 과정 분석
      1. 프록시 객체에 member.getName()을 호출해 실제 데이터 조회
      2. 프록시 객체는 실제 엔티티가 생성되어 있지 않으면 영속성 컨텍스트에 실제 엔티티 생성을 요청(→ 초기화)
      3. 영속성 컨텍스트는 데이터베이스를 조회해서 실제 엔티티 객체 생성
      4. 프록시 객체는 생성된 실제 엔티티 객체의 참조를 Member target 멤버 변수에 보관
      5. 프록시 객체는 실제 엔티티 객체의 getName()을 호출해서 결과 반환
  • 프록시의 특징
    • 처음 사용할 때 한 번만 초기화 됨
    • 프록시 객채를 초기화 한다고 프록시 객체가 실제 엔티티로 바뀌는 것은 아님. 프록시 객체가 초기화되면 프록시 객체를 통해 실제 엔티티에 접근할 수 있음
    • 프록시 객체는 원본 엔티티를 상속받은 객체이므로 타입 체크 시에 주의
    • 영속성 컨텍스트에 찾는 엔티티가 이미 있으면 데이터베이스를 조회할 필요 없으므로 em.getReference()를 호출해도 프록시가 아닌 실제 엔티티를 반환
    • 초기화는 영속성 컨텍스트의 도움을 받아야 가능 

 

프록시와 식별자

  • 엔티티를 프록시로 조회할 때 식별자 값을 파라미터로 전달하는데 프록시 객체는 이 식별자 값을 보관한다.
  • 연관관계를 설정할 때는 식별자 값만 사용하므로 프록시를 사용하면 데이터베이스 접근 횟수를 줄일 수 있다.

 

프록시 확인

  • JPA가 제공하는 PersistenceUnitUtil.isLoaded(Object entity) 메소드를 사용하면 프록시 인스턴스의 초기화 여부를 확인할 수 있다.
  • 아직 초기화 되지 않은 프록시는 false, 이미  초기화 되었거나 프록시 인스턴스가 아니면 true를 반환한다.

즉시 로딩과 지연 로딩

즉시로딩

  • 엔티티를 조회할 때 연관된 엔티티도 함께 조회하는 것
  • 하이버네이트는 가능하면 SQL조인을 사용해서 한번에 조회한다.
  • 즉시로딩을 사용하려면 @ManyToOne의 fetch속성을 FetchType.EAGER로 지정한다.

 

지연로딩

  • 연관된 엔티티를 실제 사용할 때 조회하는 것
  • 프록시를 실제 사용할 때 초기화하면서 데이터베이스를 조회한다.
  • 지연로딩을 사용하려면 @ManyToOne의 fetch속성을 FetchType.Lazy로 지정한다.

지연로딩 활용

프록시와 컬렉션 래퍼

  • 컬랙션 래퍼란: 하이버네이트가 엔티티를 영속 상태로 만들 때 엔티티에 컬렉션이 있으면 컬렉션을 추적하고 관리할 목적으로 원본 컬렉션을 하이버네이트가 제공하는 내장 컬렉션으로 변경하는 것

 

JPA 기본 페치 전략

  • @ManyToOne, @OneToMany: 즉시 로딩
  • @OneToMany, @ManyToMany: 지연 로딩
  • 연관된 엔티티가 하나면 즉시로딩을, 컬렉션이면 지연로딩을 사용
  • 추천하는 방법은 모든 연관관계에 지연로딩을 사용하는 것

 

컬렉션에 FetchType.EABER 사용시 주의 점

  • 컬렉션을 하나 이상 즉시 로딩하는 것은 권장 X
  • 컬렉션 즉시 로딩은 항상 외부 조인을 사용한다.
  • @ManyToOne, @OneToOne
    • (optional = false): 내부 조인
    • (optional = true): 외부 조인
  • @OneToMany, @ManyToMany
    • (optional = false): 외부 조인
    • (optional = true): 외부 조인

영속성 전이: CASCADE

-특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태로 만들고 싶을 때 영속성 전이 기능 사용

 

영속성 전이: 저장

  • 부모를 영속화할 때 연관된 자식들도 함께 영속화
  • CascadeType.PERSIST

 

영속성 전이: 삭제

  • CascadeType.REMOVE

고아 객체

  • 고아 객체란?
    • JPA가 부모 엔티티와 연관관계가 끊어진 자식 엔티티를 자동으로 삭제하는 기능

 

  • 고아 객체 제거란?
    • 참조가 제거된 엔티티는 다른 곳에서 참조하지 않는 고아 객체로 보고 삭제하는 기능

 

자바 ORM 표준 JPA 프로그래밍 : 네이버 도서

네이버 도서 상세정보를 제공합니다.

search.shopping.naver.com