[Spring][JPA] OSIV
OSIV
Open Session In View
의 약자로써 영속성 컨텍스트를 뷰까지 열어둔다는 뜻이다. 영속성 컨텍스트가 살아있으면 엔티티는 영속 상태로 유지된다. 따라서 뷰에서도 지연 로딩을 사용할 수 있다.
spring.jpa.open-in-view: false
, spring.jpa.open-in-view : true(기본값)
요청 당 트랜잭션 방식의 OSIV 문제점
컨트롤러나 뷰 같은 프리젠테이션 계층이 엔티티를 변경할 수 있다. 요청이 끝나고 트랜잭션이 커밋되면서 영속성 컨텍스트가 플러쉬 된다면 데이터베이스의 내용이 의도치 않게 변경되게 된다.
스프링 OSIV: 비즈니스 계층 트랜잭션
- 스프링 프레임워크가 제공하는 OSIV는 비즈니스 계층에서 트랜잭션을 사용하는 OSIV을 말한다. 즉 트랜잭션의 범위는 비즈니스 로직이 존재하는 계층까지만을 포함하지만 영속성 컨텍스트의 범위는 뷰까지 확장시켜주는 개념이다.
- 엔티티를 변경하지 않고 조회만 하는 경우에는 트랜잭션 단위가 아니어도 되므로 트랙잭션 없이 읽기가 가능하고 따라서 뷰 로직 단계에서도 지연로딩 및 프록시 초기화가 가능하다.
- 요청이 끝나고 영속성 컨텍스트가 종료될때 플러쉬가 호출되지 않는다.
- 단, 프리젠테이션 계층에서 엔티티 변경후 다시 트랜잭션 범위의 비즈니스 로직을 호출하는 경우 의도치 않은 플러쉬가 발생할 수 있는바 이를 주의해야 한다.
정리
이 전략은 너무 오랜 시간동안 데이터베이스 커넥션 리소스를 사용하기 때문에, 실시간 트래픽이 중요한 애플리케이션에서는 커넥션이 모자랄 수 있다. 따라서 고객 서비스의 실시간 API는 OSIV를 끄고, ADMIN 처럼 커넥션을 많이 사용하지 않는 곳에서는 OSIV를 키는 것이 바람직하다.
댓글남기기