OSIV
: Open Session In View
- 현재 JPA에서의 EntityManager와 같은 역할을
과거 Hibernate 에서 Session을 사용하였다.
@Transactional → setAutoCommit()
DB 커넥션을 획득하는 시점은 일반적으로 트랜잭션을 시작할 때 이다.
그럼 DB 커넥션의 반환 시점은 언제가 될까?
위 시점을 OSIV 설정을 통해 결정한다.
if OSIV = True
트랜잭션이 끝나도 'DB 커넥션'과 영속성 컨텍스트가 유지되게끔 한다.
따라서 (API) Controller 나 View Template에서의 지연 로딩이 가능해진다.
사용자에게 반응되기 전까지 오랫동안 DB 커넥션 리소스를 사용한다.
if OSIV = False
트랜잭션이 끝날 때, 'DB 커넥션'이 반환되고 영속성 컨텍스트도 비워진다.
따라서 커넥션 리소스 낭비가 없고, 실시간으로 트래픽이 많은 경우 DB 커넥션을 유연하게 사용할 수 있다.
모든 지연 로딩을 트랜잭션(Service) 안에서 처리해야 한다.
(Controller와 View Template에서 프록시 초기화를 할 수 없다.)
위에서 말했듯이 트랜잭션 안에서 처리를 하거나, Fetch join을 사용해야 한다.
이 때 아키텍처에 따라 별도의 QueryService를 만들어 관리해주는 것이 좋다.
ex. OrderService
- OrderService : 핵심 비즈니스 로직
- OrderQueryService : 화면이나 API에 맞춘 서비스
plus. 자바 ORM 표준 JPA 프로그래밍 13장
'Spring > JPA 2' 카테고리의 다른 글
4. API 개발 고급 - 컬렉션 조회 최적화 (0) | 2024.01.09 |
---|---|
3. API 개발 고급 - 지연 로딩과 조회 성능 최적화 (1) | 2024.01.08 |
2. API 개발 고급 - 준비 (0) | 2023.11.24 |
1. API 개발 기본 (0) | 2023.11.16 |