본문 바로가기
Back-End/Spring

JPA) @Entitygraph

by 어렵다어려웡 2021. 5. 7.

 

JPA를 사용하다보면 N+1 문제를 자주 마주치게 되는데 그에 대한 해결방안 중 하나인 @EntityGraph

 

처음에 강사님에게 배울때는 3가지정도가 있다고 들었다.

1. Fetch join

2. @Entitygraph

3. @Query에 의한 작성

 

간단하게 사용방법 정도만 포스팅하겠습니다.

 

@Builder
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Table(name = "order_item")
@Getter
@ToString(exclude = "item")
@Entity
public class OrderItem extends BaseEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long orderItemId;

    @Column(nullable = false)
    private int orderCount; // 주문수량

    @Column(nullable = false)
    private int orderItemAmount; // 주문총액

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "item_id")
    private Item item; // item엔티티와 연결

}
public interface OrderItemRepository extends JpaRepository<OrderItem, Long> {

    @EntityGraph(attributePaths = "item", type = EntityGraph.EntityGraphType.LOAD)
    List<OrderItem> findAll();

}

attributePaths => 해당 엔티티에 속한 연관관계로 매핑한 변수명을 지정합니다.

여러개일 경우 배열로 {"item" , "item2"} 이런식으로 작성이 가능합니다.

 

 type => 타입을 결정합니다.

이떄 타입은 LOAD, FETCH 로 2가지가 있는데 둘의 성격이 살짝 다릅니다.

 

1. FETCH

: 지정한 연관관계 엔티티는 Eager로딩으로 불러오고, 그외 연관관계 엔티티들은 자동적으로 LAZY 로딩으로

불러오게 합니다.

 

2. LOAD 

: 지정한 연관관계 엔티티는 Eager로딩을 통해 불러오며, 그외의 엔티티 데이터들은 직접 선언한 FetchType이나

해당 연관관계 어노테이션에서 가지고 있는 FetchType Default 값으로 설정해서 불러옵니다.

 

주의) @Entitygraph 어노테이션은 해당 엔티티가 연관관계를 참조하고 있지 않으면 사용할 수 없다고합니다.

 

작년에 학원에서 배울때는 Fetch Join을 잘 안쓰는 추세라고 말씀하셔서 이 어노테이션만 기억하고 있었는데

직접 검색해서 JPQL에 "join Fetch" 를 사용해보니 이것 또한 마찬가지로 연관관계를 참조하고 있어야

가능한거 같다..