인프런 커뮤니티 질문&답변

김재준님의 프로필 이미지
김재준

작성한 질문수

실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화

간단한 주문 조회 V1: 엔티티를 직접 노출

강제초기화 후, hibernate5Module 미주입시 오류에 대해

해결된 질문

작성

·

639

3

@SpringBootApplication
public class JpashopApplication {
   public static void main(String[] args) {
      SpringApplication.run(JpashopApplication.class, args);
   }
   //@Bean
  // Hibernate5Module hibernate5Module() {
   //   Hibernate5Module hibernate5Module = new Hibernate5Module();
   //   return hibernate5Module;
  // }
}

hibernate5Module을 의존성 추가하지 않고

강제초기화를 해보았는데 오류가 나더라구요.

강제 초기화를 했고 sql문은 나갔을텐데 오류가 나는게 의아하더라구요.

@GetMapping("/api/v1/simple-orders")
public List<Order> ordersV1() {
    List<Order> all = orderRepository.findAllByString(new OrderSearch());
    for (Order order : all) {
        order.getMember().getName();//강제 초기화
        order.getDelivery().getAddress();
    }
    return all;
}

디버깅을 해보았는데

Member와 Delivery의 sql이 나가고

return에서 오류가 나더라구요.

order->프록시->영속성컨택스트로 이어지고

강제초기화를 해서 Member와 Delivery는 영속성 컨택스트에 담겼지만

return에서 Order의 Member와 Delivery에는 프록시값이 가리키는 영속성컨택스트가 아닌, 프록시까지만 json으로 변환하기때문에 오류가 난다고 생각하는게 맞는 걸까요?

그리고 그 프록시를 영속성컨택스트로 바꿔서 변환해주는게 hibernate5Module의 역할이라고 보면 될까요?

답변 1

5

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. 김재준님

강제 초기화를 하더라도 해당 객체는 실제 객체가 아니라 프록시 객체 상태이기 때문입니다.

프록시 상태이고 내부에 실제 데이터가 초기화 되어 있는가 그렇지 않은가의 차이입니다. 해당 객체를 읽어서 출력해보면(.class()) 프록시 객체인 것을 확인할 수 있습니다.

hibernate5Module는 하이버네이트가 만든 프록시 객체를 JSON으로 읽을 수 있도록 도와주는 역할을 합니다.

감사합니다.

김재준님의 프로필 이미지
김재준

작성한 질문수

질문하기