나만의 개발 로그 | 고민 로그
23.02.06 TIL 본문
☑️ JPA Fetch Join 정리
항목 | 내용 |
정의 | JPQL에서 fetch join 키워드로 연관 엔티티를 한 번의 SELECT 로 즉시 로드 |
장점 | N+1 문제 제거, 네트워크 지연 감소 |
Eager 로딩과 차이 | EAGER 은 엔티티 먼저 조회 후 관계 로딩 결정 → 쿼리 2 회 이상 가능 fetch join 은 애초에 한 방에 가져옴 |
제한 | fetch join 이 적용되면 컬렉션 페이징이 불가 (하이버네이트가 경고) |
// 예시:
Order ↔ OrderItem
select o from Order o join fetch o.orderItems oi where o.member.id = :memberId
☑️ OSIV(Open-Session-In-View) – true vs false
설정 | 동작 | 장점 | 단점 |
true (기본) | 컨트롤러/뷰 렌더링 종료까지 영속성 컨텍스트·DB 커넥션 유지 | 지연 로딩(Lazy) → View 단계도 안전 | 커넥션 점유 길어짐 → 고트래픽 서비스에서 부족 현상 |
false | 트랜잭션 종료 시 바로 닫힘 | 커넥션 즉시 반환 → 자원 효율 | 컨트롤러 이후 Lazy 로딩 시 LazyInitializationException 발생 |
권장 판단 기준
- API 서버·실시간 트래픽 크면 → false + DTO 변환 단계에서 모두 조회
- 관리자 페이지·통계 레포트 같이 트래픽 낮고 View 템플릿 사용 → true 로 편의 확보
- OSIV false 전환 시 필수 작업
- Service 계층 안에서 모든 데이터 완전 조회 → DTO 변환
- 페이지네이션 + Fetch Join 불가 구간은 default_batch_fetch_size 로 튜닝
'TIL&WIL' 카테고리의 다른 글
23.03.27 TIL [최종 프로젝트 회고!] (0) | 2023.03.28 |
---|---|
23.02.08 TIL (0) | 2023.02.09 |
23.02.03 TIL (0) | 2023.02.04 |
23.02.01 TIL (1) | 2023.02.02 |
23.01.31 TIL (0) | 2023.02.01 |
Comments