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 발생
 

권장 판단 기준

  1. API 서버·실시간 트래픽 크면 → false + DTO 변환 단계에서 모두 조회
  2. 관리자 페이지·통계 레포트 같이 트래픽 낮고 View 템플릿 사용 → true 로 편의 확보
  3. OSIV false 전환 시 필수 작업
    • Service 계층 안에서 모든 데이터 완전 조회 → DTO 변환
    • 페이지네이션 + Fetch Join 불가 구간은 default_batch_fetch_size 로 튜닝