작성
·
166
0
API에서는 제대로 작동하는 것이
Test에서는 proxy 초기화를 못 한다고 합니다.
이때 @Transactional을 붙이면 제대로 작동합니다.
test와 api는 어떤 차이가 있길래 이와 같은 이슈가 생기는 건가요?
답변 2
1
1
안녕하세요. dev님^^
JPA는 기본적으로 트랜잭션 범위 안에서만 영속성 컨텍스트가 유지됩니다. 그리고 proxy를 초기화 하려면 영속성 컨텍스트가 살아있어야 합니다.
그래서 테스트에서 @Transactional이 없으면 조회하고 나오는 순간 영속성 컨텍스트가 사라져버리는 것이죠. 그래서 proxy를 초기화 하지 못한 것입니다.
그러면 API에서는 어떻게 성공한 것일까요? 그건 바로 OSIV라는 특별한 기능이 스프링 부트에서 기본으로 켜져있기 때문입니다.
이 OSIV는 트랜잭션과 무관하게, 고객이 요청이 오는 순간부터 고객의 요청이 나가는 순간까지 영속성 컨텍스트를 유지시켜 줍니다. 그래서 API에서는 동작이 성공했습니다.
더 자세한 내용은 다음을 참고해주세요^^!
JPA책 13. 웹 애플리케이션과 영속성 관리
강의 활용2편 - OSIV와 성능 최적화
감사합니다.