• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

Test에서 fetchType = LAZY 일 경우 proxy 초기화를 못 하는 이유는 무엇인가요?

20.09.02 16:38 작성 조회수 121

0

API에서는 제대로 작동하는 것이

Test에서는 proxy 초기화를 못 한다고 합니다.

이때 @Transactional을 붙이면 제대로 작동합니다.

test와 api는 어떤 차이가 있길래 이와 같은 이슈가 생기는 건가요?

답변 2

·

답변을 작성해보세요.

1

정말 감사합니다 영한님! ^__^

1

안녕하세요. dev님^^

JPA는 기본적으로 트랜잭션 범위 안에서만 영속성 컨텍스트가 유지됩니다. 그리고 proxy를 초기화 하려면 영속성 컨텍스트가 살아있어야 합니다.

그래서 테스트에서 @Transactional이 없으면 조회하고 나오는 순간 영속성 컨텍스트가 사라져버리는 것이죠. 그래서 proxy를 초기화 하지 못한 것입니다.

그러면 API에서는 어떻게 성공한 것일까요? 그건 바로 OSIV라는 특별한 기능이 스프링 부트에서 기본으로 켜져있기 때문입니다.

이 OSIV는 트랜잭션과 무관하게, 고객이 요청이 오는 순간부터 고객의 요청이 나가는 순간까지 영속성 컨텍스트를 유지시켜 줍니다. 그래서 API에서는 동작이 성공했습니다.

더 자세한 내용은 다음을 참고해주세요^^!

JPA책 13. 웹 애플리케이션과 영속성 관리

강의 활용2편 - OSIV와 성능 최적화

감사합니다.