Pagination 조회 시의 Query tuning , 그리고 N+1
2023. 9. 13. 22:50
Spring
전체 조회시 속도 개선을 위한 쿼리 최적화를 하기 위해 이전 프로젝트에서 했던 것처럼 fetch join을 도입했다. 현재 프로젝트에는 Pagination이 구현되어 있었고, fetch join을 통해 1:N 연관관계인 테이블들을 조인하려는 시도를 했다. 그러나 이렇게 하면 문제가 발생할 수 있다고 한다. 어떤 문제인지, 그리고 해결법은 무엇일지 알아보았다. 📌쿼리 튜닝시 fetch Join을 쓰는 이유 우리는 보통 일대다 , 다대일 연결시 fetchType을 LAZY, 즉 지연로딩으로 설정한다. 이렇게 되면 한쪽 객체를 조회할 때 연관된 객체는 일단 Proxy 객체로 가져온 후 연관 객체가 실제로 필요할 때 select 쿼리를 따로 날려서 가져온다. 이렇게 하면 굳이 필요 없는 객체의 조회를 막을 수 ..
QueryDsl이란? 사용법+ 프젝 코드에 적용하기
2023. 5. 31. 19:45
Spring
QueryDsl이란? 정적 타입(컴파일 시 타입에 대한 정보를 결정)을 이용해서 SQL과 같은 쿼리를 생성할 수 있도록 해 주는 오픈소스 프레임워크 왜쓰는가? JPA를 사용하다 보면 기본 기능으로 해결되지 않는 경우에는 네이티브 쿼리를 사용하게 된다. 그런데 네이티브 쿼리는 문자열을 이어 붙이기 떄문에 오타가 발생하기 쉽고 가독성이 떨어지는 단점이 있다. Querydsl을 사용하면 자동 완성과 같은 IDE의 기능을 사용할 수 있고, 컴파일 시점에 타입이나 문법 오류를 확인할 수 있다. 또한 동적 쿼리도 쉽게 사용할 수 있어서 편리하다. 물론 경우에 따라서 적용 필요성이 다를 수 있기 때문에 프로젝트의 특성에 따라서 적절하게 선택하자 😎장점 문자가 아닌 코드로 쿼리를 작성할 수 있어 컴파일 시점에 문법 오..
[프로젝트] N+1 문제와 QueryDsl
2023. 5. 31. 17:03
Spring
🔎문제 상황 yata프로젝트 중, 1:N 관계가 맺어져 있는 리뷰 전체조회, 게시글 전체조회 시 일대다 관계로 매핑된 테이블의 조회 쿼리까지 함께 날아가는 N+1문제가 발생하였다. 🔎원인 N+1 자체가 발생하는 이유는 한쪽 테이블만 조회하고 연결된 다른 테이블은 따로 조회하기 때문이다. 연관 관계가 설정된 엔티티를 조회할 경우에 조회된 데이터 갯수(n) 만큼 연관관계의 조회 쿼리가 추가로 발생하여 데이터를 읽어오게 된다. 왜 이런 문제가 생기냐면,,, jpaRepository에 정의한 인터페이스 메서드를 실행하면 JPA는 메서드 이름을 분석해서 JPQL을 생성하여 실행하게 된다. JPQL은 SQL을 추상화한 객체지향 쿼리 언어로서 특정 SQL에 종속되지 않고 엔티티 객체와 필드 이름을 가지고 쿼리를 한다..