kwonslog / how-to-use-jpa

0 stars 0 forks source link

5회 - 쿼리작성 #16

Closed kwonslog closed 1 month ago

kwonslog commented 1 month ago

쿼리작성

쿼리를 작성하는 방법은 다양하지만 네이티브 쿼리를 사용하는 경우에는 처리 과정이 다르다. 데이터베이스에 직접적인 쿼리를 실행하기 때문에 영속성 컨텍스트에 의해 관리 되지 않는다.

만약 네이티브 쿼리의 실행 결과를 영속화 하려면 엔티티를 만들고 수동으로 처리 해야 한다.

네이티브 쿼리의 실행 결과를 다시 영속화 해서 사용하는 경우가 많은지 궁금하다. 거의 일회성으로 사용하지 않을까?

쿼리작성 방법

직관적으로 사용하기 쉬운 방법은 JpaRepository 인터페이스를 사용하는 것이다. @Query 어노테이션을 사용하여 jpql 또는 네이티브 쿼리를 직접 작성 할 수 있다.

연관관계와 JPQL 쿼리

JPQL 을 사용하여 JOIN 할때 연관관계가 설정되지 않은 경우 직접 JOIN 쿼리를 작성하면 된다.

JPQL 패치 조인

지연 로딩 방식(LAZY)은 실제 값을 사용 할때 쿼리를 실행한다. 이때 N+1 문제가 발생 할 수 있다. 패치 조인을 사용하면 연관된 엔티티까지 같이 조회(JOIN)하여 이 문제를 해결한다.

패치 조인은 엔티티간의 연관관계(단방향 또는 양방향) 설정이 필수적이다.

패치 조인은 연관된 테이블을 JOIN하여 쿼리 결과값을 만들고 이 값을 파싱하여 엔티티를 만든다. 결과값의 크기에 따라 메모리 사용량이 증가하기 때문에 필요한 컬럼만 지정하면 효율성을 높일 수 있다.

페이징

spring data jpa 에서 페이징 결과 타입은 org.springframework.data.domain.Page 와 org.springframework.data.domain.Slice가 있다.

특성 Page Slice
전체 페이지 수 계산 아니오
총 항목 수 계산 아니오
페이징 메타데이터 제공
현재 페이지 데이터 제공
다음 페이지 여부 제공
성능 상대적으로 낮음 (총 항목 수 계산 오버헤드) 상대적으로 높음 (총 항목 수 계산 없음)
사용 시기 일반적인 페이징 처리 필요 시 성능이 중요한 경우나 다음 페이지 여부만 필요 시

페이징 처리시 주의할점