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" 를 사용해보니 이것 또한 마찬가지로 연관관계를 참조하고 있어야
가능한거 같다..
'Back-End > Spring' 카테고리의 다른 글
Spring boot @ControllerAdvice (0) | 2021.05.17 |
---|---|
@QueryProjection 으로 Querydsl 작성 (1) | 2021.05.11 |
Spring Data JPA 와 Postgresql 연동 (0) | 2021.04.21 |
Spring) 게시물 찜하기 기능 구현 - 데이터 전달 (1/2) (0) | 2021.03.30 |
ajax 통신시 URI로 이메일 문자열 보낼시 dot(.) 이하문자삭제 문제 (0) | 2021.03.25 |