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개의 댓글

Powered by GraphCDN, the GraphQL CDN