Open-In-View

Better late than never·2023년 5월 9일
0

#OSIV #Open-Session-In-View #Open-EntityManager-In-View

Explanation

Open-In-View, Open-Session-In-View, Open-EntityManager-In-View라고도 하는데 OSIV로 명칭

Action

true일 경우 영속성 컨텍스트가 트랜잭션 범위를 넘어선 레이어까지 살아있는데 Api라면 클라이언트에게 응답될 때까지, View라면 View가 렌더링 될 때까지 살아 있다(기본값)

false일 경우 트랜잭션을 종료할 때 영속성 컨텍스트가 닫힌다

Example

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 또한 할 수 없다.

  • OSIV를 true로 계속 둔다면 영속성 컨텍스트를 계속 유지한다는 것인데 이는 DB Connection을 계속 가지고 있는 뜻으로 DB Connection이 모자를 수도 있다(성능을 고려한다면 OSIV를 false로 설정)

0개의 댓글