보다 더 나은 내일의 나를 위해

JPA의 Open-In-View란? 본문

spring/jpa

JPA의 Open-In-View란?

H-SC 2022. 4. 26. 19:53

OSIV

Open In ViewOpen Session In View라 불리며 관례상 OSIV라 부릅니다.
OSIV는 영속성 컨텍스트를 트랜잭션이 종료되어도 VIew 렌더링 또는 응답 시까지 살아있도록 합니다.

Spring Boot에서는 spring.jpa.open-in-view의 기본값이 true로 되어있습니다.
이 값이 true 일 때와 false 일 때 무엇이 다를까요?


True라면?


spring.jpa.open-in-view의 값이 기본값인 true라면 트랜잭션이 종료되어도 영속성 컨텍스트가 살아있다.


예를 들어 Book와 Bookcase라는 엔티티가 있습니다.

// 책
@Entity
public class Book {
	...
    
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "Bookcase_id")
    private Bookcase bookcase;
    
    ...
}
// 책장
@Entity
public class Bookcase {
	...
    
    @OneToMany(mappedBy = "bookcase")
    private List<Book> books = new ArrayList<>();
    
    ...
}

Book와 Bookcase는 서로 1 : N 관계입니다.
Lazy로딩으로 설정했기 때문에 Book를 조회했을 때 Bookcase는 프록시 객체가 됩니다.
이 후 Book에서 Bookcase를 건드려야지 Bookcase를 조회합니다.

참고 - LAZY 로딩

[spring/jpa] - 즉시로딩(EAGER)과 지연로딩(LAZY)


spring.jpa.open-in-view의 값이 true일 때는 영속성 컨텍스트가 살아있으므로 언제든지 Bookcase를 찾아올 수 있습니다.

spring.jpa.open-in-view = true



False라면?


spring.jpa.open-in-view의 값이 false라면 트랜잭션이 종료될 때 영속성 컨텍스트도 닫히게 된다.


즉 Service단에서 Book만을 찾아 와서 트랜잭션이 종료된 후, Controller단에서 Book과 연관관계를 맺고있는 Bookcase를 조회하고싶어도 영속성 컨텍스트가 닫혀 org.hibernate.LazyInitializationException 예외를 뱉어냅니다.

spring.jpa.open-in-view = false

 

'spring > jpa' 카테고리의 다른 글

즉시로딩(EAGER)과 지연로딩(LAZY)  (0) 2022.04.27
Comments