OSIV란?
미리 알고 있어야 하는 개념
- 영속성 콘텍스트
- 지연 로딩
- DB Connection
OSIV란?
Open Session In View의 약자로 하이버네이트에서 사용하는 단어입니다.
JPA에서는 Open EntityManager In View가 정식 명칭이지만 관례상 OSIV라고 합니다.
OSIV는 영속성 콘텍스트의 생존 범위를 지정하는 것입니다.
위의 설정을 하면 커넥션 시작부터 API 응답이 끝날 때까지 영속성 콘텍스트가 유지됩니다.
이때 Controller에서도 지연 로딩을 사용할 수 있습니다.
하지만 DB Connection을 오랫동안 사용하기 때문에 실시간 트래픽이 몰리면 커넥션이 부족해질 수 있습니다.
(DB Connection Pool 에는 커넥션의 수가 정해져 있기 때문에 오래 쓸수록 부족해질 수밖에 없음)
트랜잭션이 종료될 때 영속성 콘텍스트를 닫고 DB 커넥션도 반환합니다.
커넥션을 오래 사용하지 않기 때문에 자원적으로 이득이 있지만 모든 지연 로딩을 트랜잭션 안에서 처리해야 합니다.
OSIV 설정을 사용하는 이유
리소스 낭비와 레이지 로딩을 어디까지 잡아야 할지 적절하게 선택해야 합니다.
OSIV 설정을 true로 하게 되면 리소스낭비가 발생하게 됩니다.
OSIV 설정을 false로 하게되면 LazyIntializationException이 발생할 수 있으며 Controller 단에서 Lazy Loading 된 Entity를 사용할 수 없습니다.
OSIV 설정을 하지 않는 방법(뷰가 필요한 엔티티를 미리 로딩해두는 방법)
1. JPQL로 페치 조인 사용 (페치 조인 자체가 연관된 엔티티를 함께 조회함 )
2. 영속성 콘텍스트가 살아있을 때 Controller에서 필요한 엔티티를 강제로 초기화해서 반환
하지만 실수의 가능성이 높음 -> OSIV 설정 등장
OSIV의 주의사항
단순 조회의 경우에는 트랜잭션 없어도 조회만 할 수 있습니다.
수정은 트랜잭션이 있는 계층에서만 동작하기 때문에 Controller 계층에서 엔티티를 수정해도 수정 내용을 DB에 반영하지 않습니다.
하지만 Controller 계층에서 엔티티를 수정한 직후에 트랜잭션을 시작하는 서비스 계층을 호출하면 문제가 발생합니다.
트랜잭션이 끝날 때 변경 감지가 동작하여 수정 부분이 DB에 반영되어 버립니다.
출처
https://ttl-blog.tistory.com/183