Open-In-View

영속성 컨텍스트가 트랜잭션을 넘어선 view, controller의 범위까지 살아있도록 할지 말지에 대한 옵션.

On이 되어있는 경우에는 API의 경우는 클라이언트에 응답될 때까지, View라면 View가 렌더링 될 때까지 영속성 컨텍스트가 살아있게 된다.

Open-In-View가 On인 경우

Open-In-View가 On인 경우

Open-In-View가 Off인 경우

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로 설정해놓는 것이 좋다고 한다.


참고 문서

https://gracelove91.tistory.com/100