일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
Tags
- 가변 객체
- 일괄처리
- Request flow
- spring boot
- View Resolver
- OSIV
- @Configuration
- Dispatcher Servlet
- 컴포넌트스캔
- Spring Batch
- open-in-view
- @Bean
- @FunctionalInterface
- 빈
- 필드 주입
- 익명 함수
- open session in view
- 스프링 빈
- Spring Framework
- 메서드 주입
- Batch
- Open EntityManager In View
- 참조 타입
- @componentScan
- 싱글 스레드
- mavenCentral
- 불변 객체
- 생성자 주입
- 이펙티브 자바
- Handler Adepter
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