- JPAQueryFactory만 있으면 Querydsl을 사용할 수 있다. extends/implements를 다 제거해도 된다.
- 동적 쿼리는 BooleanExpression
성능 개선 - Select
exist 메서드 금지
SQL.exist는 조건에 맞는 값을 찾으면 바로 종료, SQL.count는 조건에 맞는 값을 찾아도 모두 스캔
Querydsl의 exists는 실제로 count() > 0 으로 실행된다. => exists를 직접 구현해야 한다. => limit 1로 조회 제한
cross join 회피
묵시적 join으로 cross join 발생(Hibernate 이슈라서 Spring Data JPA도 동일하게 발생!) => 명시적 join으로 inner join 발생
Entity 보다는 Dto를 우선
- Entity 조회 시 Hibernate 캐시, 불필요한 컬럼 조회, OneToOne에서 N+1 쿼리가 터지는 등 단순 조회 기능에서 성능 이슈 요소가 많다.
- Entity 조회 => 실시간으로 Entity 변경이 필요한 경우
- Dto 조회 => 고강도 성능 개선 or 대량의 데이터 조회가 필요한 경우
조회 컬럼 최소화
select 컬럼에 Entity 자제
Group By 최적화
order by null을 직접 구현해서 적용한다.
커버링 인덱스
쿼리를 충족시키는데 필요한 모든 컬럼을 갖고 있는 인덱스
select/where/order by/group by 등에서 사용되는 모든 컬럼이 인덱스에 포함된 상태
NoOffset 방식과 더불어 페이징 조회 성능을 향상시키는 가장 보편적인 방법
JPQL은 from 절의 서브쿼리를 지원하지 않는다 => Querydsl에서도 지원하지 않는다.=> Cluster Key(PK)를 커버링 인덱스로 빠르게 조회하고, 조회된 key로 SELECT 컬럼들을 후속 조회한다.
성능 개선 - Update / Insert
일괄 update 최적화
무분별한 DirtyChecking을 확인해야 한다.
- DirtyChecking : 실시간 비즈니스 처리, 실시간 단건 처리 시
- Querydsl.update : 대량의 데이터를 일괄 Update 처리 시
JPA로 Bulk Insert는 자제한다
마무리
1. 상황에 따라 ORM / 전통적 Query 방식을 골라 사용할 것
2. JPA / Querydsl로 발생하는 쿼리 한번 더 확인하기
'공부 기록 > 영상 후기' 카테고리의 다른 글
[10분 테코톡] 코일의 Web Socket (0) | 2023.04.09 |
---|---|
[10분 테코톡] 디디의 Redis (0) | 2023.04.09 |
MAC주소, IP주소, Port번호가 식별하는 것 (0) | 2023.04.05 |
공유기의 IP주소는 왜 192.168.0.1이 되었을까요? | 쉽게보는 IT 상식, 디모의 테크 노트 (0) | 2023.04.05 |
인터럽트와 시스템 콜을 설명합니다! 당연히 유저 모드, 커널 모드도 설명해야겠죠? 그런데 이 모든게 프로그래밍 언어와 무슨 상관이냐구요?? 상관있죠! 왜 상관있냐면요..! (0) | 2023.04.05 |