OSIV Class는 Servlet Filter에서 적용할지 Spring 인터셉터에서 적용할지에 따라 원하는 Class를 선택해서 사용하면 됨!
Spring FrameWork가 제공하는 OSIV는 Business계층에서 트랜잭션을 사용하는 OSIV임
영속성 컨텍스트는 Client의 Request시점에서 생성이 되지만, Data를 쓰거나 Update할 수 있는 트랜잭션은 Business 계층에서만 사용할 수 있도록 트랜잭션이 일어남
ykh6242 블로그를 참고함 - https://ykh6242.tistory.com/entry/JPA-OSIVOpen-Session-In-View와-성능-최적화
[동작원리]
@Transeactional
로 트랜잭션을 시작할 때 1번에서 미리 생성해둔 영속성 컨텍스트를 찾아와서 트랜잭션을 시작함Service 계층에서 트랜잭션이 끝나면 Controller와 View에는 트랜잭션이 유지되지 않는 상태이고, Entity를 변경하지 않고 단순히 조회만 할 때는 트랜젹션이 없어도 동작은 하는 것을 트랜잭션없이 읽기(Nontransactional reads)라 함
프록시를 View Rendering하는 과정에 Lazy Loading(초기화)가 일어나게 되어도 조회 기능이므로 트랜잭션이 없이 읽기가 가능함
트랜잭션 범위 밖인 Controller와 View에서 Entity를 Update하여도 영속성 컨텍스트의 변경 감지에 의한 Data Update가 동작하지 않음**(2가지)**
오랜시간동안 DB Connection 리소스를 사용하기 때문에, 실시간 트래픽이 중요한 Application에서 Connection이 모잘라 수 있어, 장애로 이어지는 경우도 발생함
ex) Controller에서 외부 API를 Call하면 외부 API대기 시간 만큼 Connection 리소스를 반환하지 못하고, 유지해야함
OSIV OFF
ykh6242 블로그를 참고함 → https://ykh6242.tistory.com/entry/JPA-OSIVOpen-Session-In-View와-성능-최적화