@ManyToOne으로 엔티티에 N : 1 연관관계 설정을 해줬을 때 해당 엔티티 조회 시에 N + 1의 쿼리가 발생해서 성능 이슈가 발생
@Entity
@Getter
@ToString
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class CategoryList extends BaseTimeEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
private Product product;
@ManyToOne(fetch = FetchType.LAZY)
private MainCategory mainCategory;
@ManyToOne(fetch = FetchType.LAZY)
private MiddleCategory middleCategory;//중분류
}
첫 번째로, 해당 엔티티의 조인을 불러오는 쿼리문이 1개 발생하고, 그 다음에 쿼리문의 조회된 개수에 해당하는 N개의 쿼리문이 발생해서 성능의 이슈가 발생
nativeQuery로 직접적인 쿼리문을 작성하여 N+1 문제를 해결
@Query(value = "SELECT p.id, p.name, p.price, p.thumbnail, p.description FROM product p \n" +
"where p.name like %:keyword%"
, countQuery = "select count(p.id) from product p " +
"where p.name like %:keyword% and p.description like %:keyword%"
, nativeQuery = true)
Page<IProduct> searchKeyword(@Param("keyword") String keyword, Pageable pageable);
위의 결과, 하나의 쿼리만 발생하는 것을 확인할 수 있다.
N+1 문제를 해결하기 전과 후의 성능이 확연히 차이가 나는 것을 확인할 수 있다.