JPA Proxy

반영환·2023년 5월 29일
0

스프링 이모저모

목록 보기
8/12
post-thumbnail

Jpa Proxy

조회 대상

FoodEntityStoreEnttiy 는 N:1 관계로 참조관계에 있다.

/*
Food Entity
*/
package com.jpastudy.ms.domain.Entity;


import lombok.Getter;
import javax.persistence.*;

@Getter
@Entity
@Table(name = "tb_test_food")
public class FoodEntity {

    @Id
    @Column(name="food_id")
    private String foodId;
    private String foodName;
    private String foodCalorie;


    @ManyToOne(fetch = FetchType.LAZY) // 지연 로딩
    @JoinColumn(name = "store_id")
    public StoreEntity storeEntity;

}
/*
Store Entity
*/
package com.jpastudy.ms.domain.Entity;


import lombok.Getter;

import javax.persistence.*;


@Getter
@Entity
@Table(name = "tb_test_store")
public class StoreEntity {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private String storeId;
    private String storeName;
    private String storeNumber;
    private String address;
    

}

Hibernate Proxy

N:1 관계이지만 FoodEntity를 조회할 때 항상 FoodEntity를 조회하기 위해 쿼리를 날릴 필요는 없다.

@Test
    public void proxyTest(){

        FoodEntity foodEntity = em.find(FoodEntity.class,5L); // food_id 값이 5L인 데이터를 찾는다.
        System.out.println(foodEntity.getStoreEntity().getClass());

        em.close();
    }
class com.jpastudy.ms.domain.Entity.StoreEntity$HibernateProxy$w7bUtIS5

FoodEntity 조회시 StoreEntity는 HibernateProxy 객체 형체로 조회되며 StoreProxy 초기화 및 호출시 영속성 컨텍스트를 조회하고

  • 값이 없으면 DB에 쿼리를 날려 실제 값을 얻는다.
  • 값이 있으면 Proxy객체를 통해 실제 객체로 접근한다.

@ManyToOne

지연 로딩 ( 프록시 사용 )

@ManyToOne(fetch = FetchType.LAZY) // 지연로딩
@JoinColumn(name = "store_id")
public StoreEntity storeEntity;

즉시 로딩 ( 프록시 미사용 )

@ManyToOne(fetch = FetchType.EAGER) // 즉시로딩
@JoinColumn(name = "store_id")
public StoreEntity storeEntity;

실무에서 Entity간의 관계는 지연로딩 (fetch = FecthType.LAZY) 설정으로 적용 되어야 한다.

그 이유는 AEnttiy.class 에 BEntity, CEntity 여러개의 연관관계가 매핑되어 있을 경우 즉시 로딩 설정을 하게 되면 (fetch = FecthType.EAGER) 그 연관관계 전체에 대한 쿼리가 나가고 이는 성능 이슈가 발생할 수 있기 때문이다.

즉 어떤 쿼리가 나갈지 모르기 때문이다.

출처

[JPA] 프록시(Proxy)와 엔티티 연관 관계(LAZY, EAGER)

profile
최고의 오늘을 꿈꾸는 개발자

0개의 댓글