일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 정보처리기사 실기
- kotlin coroutine
- CKA 기출문제
- kotlin querydsl
- aws
- 정보처리기사실기 기출문제
- 공부
- Linux
- kotlin
- CloudWatch
- 티스토리챌린지
- 코틀린 코루틴의 정석
- AI
- Spring
- 오블완
- Kubernetes
- IntelliJ
- APM
- MySQL
- Elasticsearch
- kotlin spring
- 정보처리기사 실기 기출문제
- CKA
- Java
- 기록으로 실력을 쌓자
- PETERICA
- mysql 튜닝
- minikube
- Pinpoint
- AWS EKS
- Today
- Total
피터의 개발이야기
[Spring] 패치조인(fetchJoin)이란? 본문
ㅁ 들어가며
ㅇ [Spring] JDBC와 MyBatis와 JPA 비교, 시대적 흐름에서 장단점 분석에서 JDBC, MyBatis, JPA의 시대적 흐름에 따른 장단점을 정리하였다.
ㅇ JPA의 장단점을 요약적으로 정리하고 fetch Join이 왜 필요한지 정리해 보았다.
ㅇ 우선 JPA의 장점을 정리하였다.
ㅁ JPA (Java Persistence API) 의 장점
ㅇ 객체와 데이터베이스 테이블을 자동으로 매핑
ㅇ 객체 지향적인 방식으로 데이터 관리 가능
ㅇ 코드 작성량이 적고 유지보수가 용이함
ㅁ JPA의 단점
ㅇ 성능이슈: JDBC가 JPA보다 약 2배 정도 빠름
ㅇ 학습 난이도: JPA와 ORM를 잘 다루기 위해서는 초반 학습이 필요함
ㅇ 특정 데이터베이스의 기능 활용 제한
ㄴ 프로시저, 특정 쿼리 힌트나 최적화 기법
ㅇ N+1문제: 연관 관계가 있는 엔티티를 조회할 때 발생할 수 있는 성능 문제
ㅇ 복잡한 쿼리 처리: 배우 복잡한 쿼리는 JPA로 한계가 있다.
ㅇ 트랜젝션 격리 수준: JPA는 MySQL의 모든 트랜잭션을 완벽하게 제어하기 어렵다.
ㅁ JPA 종합
ㅇ JPA는 개발자 입장에서 강력한 도구이다. 개발 생산성과 유지보수성을 중시하고 더욱이 객체지향적인 설계기 필요한 경우 분명 장점이 크다. 하지만 프로젝트의 특성과 요구사항에 따라 적절히 사용해야 한다. 특히 성능이 중요한 부분에서는 네이티브 쿼리나 다른 최적화된 기법을 함께 사용하는 것이 좋다.
ㅁ fetch Join이란?
ㅇ 정의
Fetch Join은 JPA에서 성능 최적화를 위해 제공하는 중요한 기능으로 JPQL에서 연관된 엔티티나 컬렉션을 한 번에 조회하는 기능이다.
ㅇ 목적
N+1 문제를 해결하고 성능을 최적화하기 위해 사용된다.
ㅇ 사용방법
JPQL에서 "JOIN FETCH" 키워드를 사용하여 구현한다.
ㄴ 하지만 SQL의 조인 종류는 아니다.
ㄴ 참고로, SQL JOIN은 Inner Join, Outer Join(left, right, full)이 있다.
ㅇ 장점
연관된 엔티티티를 한번에 조회하여 지연 로딩으로 인한 성능 문제를 해결할 수 있다.
ㅇ 주의사항
- 일대다 관게에서 사용하면 중복 문제가 있어서, DISTINCT를 함께 사용하면 좋다.
- Fetch Join 대상 entity에 alias를 사용하는 것은 JPA 스팩상 지양해야 한다.
ㅁ 일반 Join VS Fetch Join
ㅇ 필요한 엔티티만 영속성 컨텍스트에 올리기 위해 일반 Join과 Fetch Join을 상황에 맞게 적절히 사용해야 한다.
ㅇ 쿼리 검색 조건에는 필요하지만 실제 데이터는 필요하지 않는 상황에는 일반 Join이 유리하다.
ㄴ 메인 엔티티만 영속성 컨텍스트에 올리고 하위 엔티티는 패치가 되지 않은 상태이다.
ㅇ 대량 트래픽으로 DB QPS의 유휴자원이 부족하다면 Fecth Join으로 호출 횟수를 줄이면 병목을 줄일 수 있다.
ㅁ 함께 보면 좋은 사이트
ㅇ Spring-Data-JPA [5] Fetch Join
ㅇ [JPA] 일반 Join과 Fetch Join의 차이
ㄴ LazyInitializationException의 원인분석, Lazy 패치로 생성초기화 되지 않는 경우 에러 발생 -> fetch join으로 해결.
'Programming > Spring' 카테고리의 다른 글
[Spring] JUnit5 조건부 테스트 실행방법 (0) | 2024.06.27 |
---|---|
[Spring] Junit 테스트 시 자동 Rollback 설정방법 (0) | 2024.06.26 |
[Spring] Ktlint란, 코딩 컨벤션 (0) | 2024.06.22 |
REST API에서 PATCH와 PUT의 차이점 (0) | 2024.06.16 |
[Spring] JDBC와 MyBatis와 JPA 비교, 시대적 흐름에서 장단점 분석 (2) | 2024.06.11 |