ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • @EntityGraph
    JPA 2023. 2. 14. 02:05

    연관관계가 있는 엔티티를 조회할 경우 지연 로딩으로 설정되어 있으면 연관관계에서 종속된 엔티티는 쿼리 실행 시 select 되지 않고 proxy 객체를 만들어 엔티티가 적용시킨다.

     

    그 후 proxy 객체를 호출할 때마다 그때그때 select 쿼리가 실행된다.

    위와 같은 연관관계가 지연로딩으로 되어있을 경우 fetch 조인을 사용하여 여러 번의 쿼리를 한번에 해결할 수 있다.

    @EntityGraph는 Data JPA 에서 fetch 조인을 어노테이션으로 사용할 수 있도록 만들어 준 기능이다.

     

    • 엔티티들은 서로 연관되어 있는 관계가 보통이며 이 관계는 그래프로 표현이 가능하다. EntityGraph는 JPA가 어떤 엔티티를 불러올 때 이 엔티티와 관계된 엔티티를 불러올 것인지에 대한 정보를 제공한다.
    • FetchType.LAZY 와 FetchType.EAGER로 연관 엔티티를 가져올 것인지를 결정할 수 있다. 하지만 이 구문은 정적이며 런타임 시 이 설정을 변경하지 못하는 단점이 있다. EntityGraph는 이러한 점을 보완하고 연관 엔티티를 어떻게 로딩할 것인지에 대한 정보를 제공함으로서 엔티티 로딩 속도를 높일 수 있는 장점이 있다.

     

    EntityGraph를 사용하면 데이터베이스에서 엔티티 및 연관된 엔티티를 로드할 때 성능이 향상되고 JOIN 전략을 사용하여 그래프의 정의된 방식으로만 데이터를 검색하기 때문에 데이터베이스의 모든 정보를 한번에 조회할 수 있다.

     

    예시)

    OneToMany 관계는 기본적으로 2개의 쿼리가 발생한다. 하나는 최상위 엔티티를 조회하고 , 다른 하나는 연관된 엔티티를 조회한다.

    한 테이블에서 등록된 정보를 조회하는 경우 모든 고객과 연관된 모든 주문을 조회하면 N+1의 추가적인 쿼리가 발생한다.

    하나는 모든 고객을 조회하고, N은 각 고객의 주문에 대해 검색한다.

     

     

    EntityGraph는 사용하기 쉽고 성능이 향상될 수 있는 이점을 제공하며 런타임에도 데이터를 동적으로 검색할 수 있다.

    이러한 접근 방식(EntityGraph)를 사용하면 데이터베이스 시스템의 과부하를 대폭 줄이고 리소스 사용량을 줄이며, 응답 시간을 단축할 수 있다.

    'JPA' 카테고리의 다른 글

    N+1 Select 문제  (0) 2023.02.14
    JPA Enum Type (@Enumerated, EnumType)  (0) 2023.01.25
    @ManyToMany 사용 시 주의할 점 (List, Set)  (0) 2023.01.25
    JPA의 리턴타입이 Optional인 이유  (0) 2023.01.19
Designed by Tistory.