| name | jpa-mysql-tuning-skill |
| description | JPA/Hibernate + MySQL 성능 튜닝 스킬. JPA/Hibernate(Spring Boot) 환경에서 MySQL 쿼리가 느린 경우, N+1 문제 해결, EXPLAIN 분석, 인덱스 설계, Fetch 전략, 배치 처리, OSIV 설정 등 모든 JPA+MySQL 성능 관련 작업에 사용한다. "N+1 쿼리가 발생해요", "JPA 쿼리가 느려요", "Fetch Join 사용법", "배치 INSERT가 안 돼요", "OSIV 설정", "영속성 컨텍스트 문제" 등의 요청에 이 스킬을 사용할 것. |
JPA/Hibernate MySQL 성능 튜닝 스킬
개요
이 스킬은 JPA/Hibernate (Java/Kotlin, Spring Boot) 환경에서 MySQL 쿼리 성능 문제를 진단하고 해결하는 데 필요한 레퍼런스를 제공한다. 사용자의 요청에 따라 아래 레퍼런스 파일 중 필요한 것만 선택적으로 읽어서 활용한다.
레퍼런스 파일 구조
| 파일 | 내용 | 이런 경우 읽을 것 |
|---|
reference/01-explain-logging.md | SQL 로깅 및 EXPLAIN 실행 | 실행계획 확인, SQL 로깅 설정, Hibernate Statistics |
reference/02-index.md | 엔티티 인덱스 선언 및 커버링 인덱스 | @Index 어노테이션, Projection, DTO 활용 |
reference/03-n-plus-one.md | N+1 문제 해결 (JPA 최대 이슈) | Fetch 전략, Fetch Join, @BatchSize, EntityGraph |
reference/04-query-patterns.md | 실전 쿼리 튜닝 패턴 | 좌변 가공 방지, 서브쿼리→JOIN, Keyset 페이징, 대량 DML, OSIV |
reference/05-orm-pitfalls.md | JPA 특유 주의사항 | EAGER 기본값, IDENTITY 배치 제약, 영속성 컨텍스트 |
reference/06-checklist.md | 튜닝 체크리스트 | 종합 진단, 전체 점검 |
사용 흐름
- 사용자의 요청을 파악한다
- 관련된 레퍼런스 파일을
view 도구로 읽는다 (여러 파일이 필요하면 복수 로드)
- 레퍼런스의 내용을 바탕으로 구체적인 진단과 해결책을 제시한다
핵심 원칙
- 모든 연관관계는 LAZY:
FetchType.LAZY를 기본으로 하고, 필요할 때만 fetch join
- N+1을 항상 경계: SQL 로깅을 켜서 쿼리 수를 확인한다
- EXPLAIN 먼저: 네이티브 쿼리로 실행계획을 확인한다
- DTO Projection:
SELECT * 대신 필요한 컬럼만 조회
- @BatchSize 글로벌 설정:
default_batch_fetch_size = 100은 거의 필수
빠른 진단 가이드
사용자가 "JPA 쿼리가 느려요" 라고 말하면, 이 순서로 진단한다:
1. SQL 로깅 켜기 → 01-explain-logging.md
- 실제 발생 쿼리 수 확인 (N+1 여부)
- EXPLAIN으로 풀스캔 확인
2. N+1 문제인가? → 03-n-plus-one.md
- LAZY 설정 확인
- Fetch Join / @BatchSize / EntityGraph 적용
3. 인덱스 문제인가? → 02-index.md
- @Index 선언 확인
- 커버링 인덱스 / Projection 활용
4. 쿼리 패턴 문제인가? → 04-query-patterns.md
- 좌변 함수? 스칼라 서브쿼리? OFFSET 페이징?
5. JPA 특유 함정인가? → 05-orm-pitfalls.md
- IDENTITY 배치 제약? OSIV? 영속성 컨텍스트?