spring.jpa.open-in-view=true
스프링에서는 OSIV가 기본적으로 켜져있다.
OSIV ON
- DB 트랜잭션을 시작할 때 JPA 영속성 컨텍스트가 DB 커넥션을 가져온다.
- OSIV가 켜져있으면 @Transactional 메서드를 벗어나도 커넥션을 계속 유지한다.
- API 응답이 나가고 화면이 렌더링 될 때까지 영속성 컨텍스트를 유지한다.
- 그래서 View, Controller 단에서도 지연 로딩으로 데이터를 가져올 수 있다.
- 지연 로딩은 영속성 컨텍스트가 살아 있어야 가능하다.
- 너무 오랫동안 DB 커넥션을 사용하기 때문에 실시간 트래픽이 중요한 애플리케이션에서는 커넥션이 모자랄 수 있다.
- 결국 장애로 이어진다.
- 하지만 지연 로딩을 적극 활용할 수 있다는 장점이 있다.
OSIV OFF
spring.jpa.open-in-view=false
- 트랜잭션을 종료할 때 영속성 컨텍스트를 닫고 DB 커넥션을 반환한다.
- 따라서 커넥션 리소스를 낭비하지 않는다.
- 트랜잭션으로 가져온 데이터를 요청한 지점에서 반환한 다음에는 DB 커넥션을 쓰지 않는다.
- 사용자 요청이 많을 경우 유연하게 사용할 수 있다.
- 모든 지연 로딩을 트랜잭션 안에서 해결해야 한다.
- 지연 로딩을 하려면 영속성 컨텍스트가 살아있어야 한다.
- 지연 로딩 코드는 트랜잭션 안으로 넣어줘야 한다.
- 따라서 트랜잭션이 끝나기 전에 지연 로딩을 강제로 호출해두거나 fetch join을 사용해야 한다.
실무 활용 팁
- ADMIN처럼 커넥션을 많이 사용하지 않는 곳 -> OSIV ON
- 고객 서비스 기반의 트래픽이 많은 실시간 API -> OSIV OFF
참고
https://dodeon.gitbook.io/study/kimyounghan-spring-boot-and-jpa-optimization/04-osiv
'개발 > Spring' 카테고리의 다른 글
Entity와 DTO (0) | 2023.08.02 |
---|---|
@Transactional 동작원리와 public method calls private method에서의 트랜잭션 적용 여부 (0) | 2023.08.02 |
연관관계 매핑된 Entity 생성하기 (0) | 2023.08.01 |
@Transactional, JPA dirty checking, readOnly=true 옵션 (0) | 2023.07.12 |
ConnectionPool과 JPA HikariCP 개념 (0) | 2023.07.09 |
댓글