Repository navigation
Commit 7c95288
fix: 납부자 목록 조회의 filesort 제거 - #142
#142에서 인덱스를 (enrollment_year DESC, name) 순서로 맞췄지만 정렬 비용은
그대로 남아 있었다. 원인은 두 가지다.
1. ORDER BY가 두 곳에서 지정됨
findAllByNameContaining()의 @query에 ORDER BY가 하드코딩된 상태에서
PageRequest에도 Sort를 넘기고 있었다. Spring Data는 @query에 ORDER BY가
있으면 Pageable의 Sort를 지우지 않고 뒤에 이어붙이기 때문에 실제 SQL은
`order by enrollment_year desc, name asc, enrollment_year desc, id asc`가
되고, 정렬 키가 인덱스와 어긋나 매 조회마다 filesort가 발생했다.
덤으로 하드코딩된 키가 항상 앞에 오는 탓에 criteria 파라미터는 무시됐고,
엔티티에 없는 이름을 넣으면 HQL이 깨져 500이 났다.
@query에서 ORDER BY를 걷어내고 정렬 생성을 resolveSort() 한 곳으로 모았다.
criteria는 화이트리스트로 받아 알 수 없는 값이면 기본 정렬로 떨어진다.
2. 검색어가 없어도 LIKE '%%'를 태움
SearchCondition.search의 기본값이 ""라 목록 첫 진입에도 술어가 붙었다.
한 건도 걸러내지 못하면서 선행 와일드카드로 인덱스 접근만 막는다.
검색어가 비어 있으면 술어 없이 findAll(pageable)로 보낸다.
응답의 행 순서는 바뀌지 않는다. 기존에도 뒤에 붙던 id asc가 동점 처리
역할을 하고 있어 최종 정렬 결과는 동일하고, 정렬 방법만 filesort에서
인덱스 순서 스캔으로 바뀐다.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>1 parent da4a161 commit 7c95288
2 files changed
Lines changed: 38 additions & 4 deletions
File tree
- src/main/kotlin/site/billilge/api/backend/domain/payer
- repository
- service
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
13 | 13 | | |
14 | 14 | | |
15 | 15 | | |
16 | | - | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
17 | 19 | | |
18 | 20 | | |
19 | 21 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
65 | 65 | | |
66 | 66 | | |
67 | 67 | | |
68 | | - | |
69 | | - | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
70 | 103 | | |
71 | | - | |
72 | 104 | | |
73 | 105 | | |
74 | 106 | | |
| |||
0 commit comments