백엔드/Spring

[Spring] JPA 프록시

kwang2134 2024. 9. 11. 13:59
728x90
반응형
728x90

JPA 프록시

  • EntityManager의 getReference()를 사용하여 엔티티 객체의 프록시를 반환
  • getReference()는 엔티티의 ID를 기준으로 해당 엔티티의 프록시를 생성
  • 실제 클래스를 상속받아서 만들어짐
  • 프록시 객체는 실제 객체의 참조를 보관
  • 프록시 객체를 호출하면 프록시 객체는 실제 객체의 메소드 호출

프록시 객체 초기화

  • 프록시 객체 반환 시 실제 데이터베이스에 조회 쿼리가 실행되지 않음
  • 프록시 객체를 처음 사용하는 시점 초기화 되며 쿼리가 실행
  • 프록시 객체가 초기화되어도 실제 엔티티 객체로 변경되지는 않음
  • 영속성 컨텍스트에 이미 찾을 엔티티가 존재한다면 getReference()를 사용해도 프록시 대신 실제 엔티티 반환
  • 준영속 상태에서 프록시를 초기화할 시 오류 발생

즉시 로딩 & 지연 로딩

즉시 로딩

  • 엔티티 조회 시 모든 연관 엔티티를 같이 로드하는 방식
  • fetch = FetchType.EAGER 사용
  • 장점
    • 추가적인 쿼리 발생은 없음 
  • 단점
    • 초기 로딩 시 많은 데이터를 함께 로드하여 성능 저하

지연 로딩

  • 엔티티를 조회 시 연관된 데이터가 실제로 필요할 때까지 로드하지 않는 방식
  • 엔티티와 연관된 엔티티는 프록시 객체로 생성됨
  • fetch = FetchType.LAZY 사용
  • 장점
    • 초기 로딩 시 필요한 데이터만 로드하여 성능이 좋음
  • 단점
    • 데이터 접근이 빈번할 경우 추가 쿼리가 발생하여 성능이 저하 -> JPQL의 JOIN FETCH를 사용하여 한 번의 쿼리로 필요한 연관된 데이터를 로드하여 사용

영속성 전이 CASCADE

  • 엔티티 간의 관계에서 특정 작업을 연쇄적으로 수행
  • 데이터베이스 cascade 옵션을 자바 코드에서 사용하는 것
  • 옵션
    • CascadeType.PERSIST: 부모 엔티티가 저장될 때 연관된 자식 엔티티도 자동으로 저장
    • CascadeType.MERGE: 부모 엔티티가 병합될 때 연관된 자식 엔티티도 자동으로 병합
    • CascadeType.REMOVE: 부모 엔티티가 삭제될 때 연관된 자식 엔티티도 자동으로 삭제
    • CascadeType.REFRESH: 부모 엔티티가 새로 고쳐질 때 연관된 자식 엔티티도 자동으로 새로 고침
    • CascadeType.DETACH: 부모 엔티티가 분리될 때 연관된 자식 엔티티도 자동으로 분리
    • CascadeType.ALL: 모든 옵션 적용

자바 ORM 표준 JPA 프로그래밍 - 기본편 강의 | 김영한 - 인프런 (inflearn.com) 강의 내용 참고

728x90