영속성 컨텍스트가 트랜잭션을 넘어선 view, controller의 범위까지 살아있도록 할지 말지에 대한 옵션.
On이 되어있는 경우에는 API의 경우는 클라이언트에 응답될 때까지, View라면 View가 렌더링 될 때까지 영속성 컨텍스트가 살아있게 된다.
Open-In-View가 On인 경우
Open-In-View가 Off인 경우
Off로 한 상태에서, Controller 레벨 내의 코드에서 Entity를 받아와서 그와 엮여있는 객체에 대해서 lazy loading을 하게 되면, 에러가 나게 된다.
@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();
} // controller 레벨에서 member.getTeam()을 통해서 연결된 다른 Entity를 가져온다.
}
이렇게 되면 영속성 컨텍스트를 이용해서 가져오게 되는데, Off로 할 경우 영속성 컨텍스트가 생존해 있지 않아 에러가 발생되게 된다.
⇒ no Session 에러 발생.
영속성 컨텍스트를 유지한다는 것은 DB Connection을 계속 가지고 있는 것이기 때문에, view까지 이를 전달한다면 Connection이 모자를 수 있어서 OSIV 값은 false로 설정해놓는 것이 좋다고 한다.
참고 문서