[Springboot] JPA N+1 문제

송진영·2023년 6월 19일
0

Springboot

목록 보기
7/9

JPA N+1 문제

@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 문제를 해결하기 전과 후의 성능이 확연히 차이가 나는 것을 확인할 수 있다.

profile
못하는 건 없다. 단지 그만큼 노력을 안 할 뿐이다.

0개의 댓글