TIL&WIL
23.02.06 TIL
ultramancode
2023. 2. 7. 03:23
☑️ 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 로 튜닝