반응형
OSIV란?
- Open Session In View: 하이버네이트
- Open EntityManager In View: JPA
OSIV ON
spring.jpa.open-in-view : true 기본값
0 | 1 | 2 | 3 | 4 |
요청 → | Filter Interceptor → | Controller → | Service → | Repository |
↖ View ↙ | ||||
트랜잭션 범위 (3~4) | ||||
영속성 컨텍스트 생존 범위 (1~4) | ||||
영속 상태, 수정 불가능 | 영속 상태, 수정 가능 |
Q. 언제 JPA(영속성 컨텍스트)가 데이터베이스 커넥션을 획득?
A. 데이터베이스 트랜잭션 시작할 때
장점
OSIV 전략은 최초 데이터베이스 커넥션 시작 시점부터 API 응답이 끝날 때 까지 영속성 컨텍스트와 데이터베이스 커넥션을 유지한다.
→ 지연 로딩이 가능
단점
너무 오랜시간동안 데이터베이스 커넥션 리소스를 사용 → 장애
e.g. 컨트롤러에서 외부 API를 호출하면 외부 API 대기 시간 만큼 커넥션 리소스를 반환하지 못하고, 유지해야 한다.
OSIV OFF
spring.jpa.open-in-view: false OSIV 종료
0 | 1 | 2 | 3 | 4 |
요청 → | Filter Interceptor → | Controller → | Service → | Repository |
↖ View ↙ | ||||
트랜잭션 범위 (3~4) | ||||
영속성 컨텍스트 생존 범위 (3~4) |
||||
준영속 상태 | 영속 상태 |
장점
OSIV를 끄면 트랜잭션을 종료할 때 영속성 컨텍스트를 닫고, 데이터베이스 커넥션도 반환한다.
→ 커넥션 리소스를 낭비하지 않는다.
단점
OSIV를 끄면 모든 지연로딩을 트랜잭션 안에서 처리해야 한다.
트랜잭션이 끝나기 전에 지연 로딩을 강제로 호출해 두어야 한다.
OSIV를 끈 상태로 복잡성을 관리하는 좋은 방법: Command와 Query를 분리하는 것!
참조 - 자바 ORM 표준 JPA 프로그래밍
반응형
'웹개발 > Spring' 카테고리의 다른 글
[Spring Data JPA] Query Methods - 메소드 이름으로 쿼리 생성 (0) | 2020.01.22 |
---|---|
[JPA] 연관관계 매핑 (0) | 2020.01.20 |
[JPA] 양방향 연관관계 (0) | 2020.01.19 |
[JPA] 엔티티 매핑 ⭐️ @Entity, @Table, @Column, @Id (0) | 2020.01.17 |
[JPA] 플러시란? Flush (0) | 2020.01.17 |