[Jpa] 준영속과 변경

준영속 상태와 지연 로딩

  • 엔티티의 생명주기
  • 데이터 접근 전략 등을 설명

준영속 + 트랜잭션범위의 영속성

  • 스프링이나 J2EE 컨테이너는 트랜잭션 범위 영속성 컨텍스트를 기본 전략으로 사용
  • 서비스 계층에서 시작된 트랜잭션 종료시
    • 영속성도 종료
      • 엔티티가 서비스와 레포 계층에서 영속 상태를 유지하지만,
      • 프레젠테이션 (컨트롤러 뷰 등) 에서는 준영속 상태가 됨

지연로딩과 준영속 상태

  • 준영속 상태에서는
    • 엔티티 변경감지
    • 지연 로딩
      • 이 동작하지 않음
  • 코드
    @Entity
    public class Order {
        @Id @GeneratedValue
        private Long id;
    
        @ManyToOne(fetch = FetchType.LAZY) // 지연 로딩 전략
        private Member member; // 주문 회원
    }
    class OrderController {
        public String view(Long orderId) {
            Order order = orderService.findOne(orderId);
            Member member = order.getMember();
            member.getName(); // 지연 로딩 시 예외 발생
        }
    }
  • order 객체는 이미 준영속 상태이며
  • order.getMember 를 통해 지연로딩을 시도해도 값을 가져 오지 못함
    • member 객체변수는 null
    • member.getName() 시 NPE 가 발생한다.

위 문제 해결방안

  • JPQL 의 fetch join 혹은 qdsl fetchJoin 사용


Uploaded by N2T