#OSIV #Open-Session-In-View #Open-EntityManager-In-View
Open-In-View, Open-Session-In-View, Open-EntityManager-In-View라고도 하는데 OSIV로 명칭
true일 경우 영속성 컨텍스트가 트랜잭션 범위를 넘어선 레이어까지 살아있는데 Api라면 클라이언트에게 응답될 때까지, View라면 View가 렌더링 될 때까지 살아 있다(기본값)
false일 경우 트랜잭션을 종료할 때 영속성 컨텍스트가 닫힌다
Member와 Team 다 대 일 관계라고 가정하고 Lazy로딩으로 Member안의 Team이 프록시 객체라고 가정한다면 OSIV가 true라면 실행이 잘되지만 false로 설정한다면
@RequiredArgsConstructor
@RestController
public class MemberController {
private final MemberService memberService;
@GetMapping("/members/{name}")
public MemberDto findMember(@PathVariable String name) {
Member member = memberService.findByName(name);
return MemberDto.builder()
.name(member.getName())
.teamName(member.getTeam().getTeamName())
.build();
}
jpa:
open-in-view: false
500에러가 발생한다. 영속성 컨텍스트가 Transaction 범위 밖인 Controller에서 Lazy Loading을 시도했기 때문인데 영속성 컨텍스트가 닫히면 Lazy Loading 또한 할 수 없다.