일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- Dispatcher Servlet
- Open EntityManager In View
- 참조 타입
- 필드 주입
- @Configuration
- 불변 객체
- Request flow
- 이펙티브 자바
- 익명 함수
- Spring Framework
- 일괄처리
- Spring Batch
- View Resolver
- OSIV
- Batch
- mavenCentral
- open session in view
- 가변 객체
- 컴포넌트스캔
- open-in-view
- 생성자 주입
- Handler Adepter
- 스프링 빈
- @Bean
- 메서드 주입
- 빈
- 싱글 스레드
- @FunctionalInterface
- spring boot
- @componentScan
Archives
- Today
- Total
보다 더 나은 내일의 나를 위해
JPA의 Open-In-View란? 본문
OSIV
Open In View는 Open 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.open-in-view의 값이 true일 때는 영속성 컨텍스트가 살아있으므로 언제든지 Bookcase를 찾아올 수 있습니다.

False라면?
spring.jpa.open-in-view의 값이 false라면 트랜잭션이 종료될 때 영속성 컨텍스트도 닫히게 된다.
즉 Service단에서 Book만을 찾아 와서 트랜잭션이 종료된 후, Controller단에서 Book과 연관관계를 맺고있는 Bookcase를 조회하고싶어도 영속성 컨텍스트가 닫혀 org.hibernate.LazyInitializationException 예외를 뱉어냅니다.

'spring > jpa' 카테고리의 다른 글
즉시로딩(EAGER)과 지연로딩(LAZY) (0) | 2022.04.27 |
---|
Comments