JPA/영속성 컨텍스트

OSIV와 성능 최적화

수달하나 2021. 8. 6. 17:08

Open Session In View: 하이버네이트

Open EntityManager In View: JPA

→ 관례상 둘다 OSIV 라고 한다.

 

spring.jpa.open-in-view: true  (기본 default 값)

 

 

OSIV 전략은 트랜잭션 시작처럼 최초 데이터베이스 커넥션 시작 시점부터 API응답이 끝날 때 까지 영속성 컨텍스트와 데이터베이스 커넥션을 유지한다. 그래서 View Template 혹은 API컨트롤러에서 지연 로딩이 가능하다. 지연 로딩은 영속성 컨텍스트가 살아있어야 가능하고, 영속성 컨텍스트는 기본적으로 데이터베이스 커넥션을 유지한다.

 

주의할점은 OSIV 전략이 너무 오랜시간동안 데이터베이스 커넥션 리소스를 사용하기 때문에, 실시간 트래픽이 중요한 애플리케이션에서는 커텍션이 모자랄 수 있고 이것이 장애로 이어질 가능성이 존재한다는 것이다. 

 

 

spring.jpa.open-in-view: false

 

OSIV를 끄면 트랜잭션을 종료할 때 영속성 컨텍스트를 닫고, 데이터베이스 커넥션도 반환하기 때문에 커넥션 리소스를 낭비하지 않을 수 있다. 하지만 모든 지연로딩을 트랜잭션 안에서 처리해야 하기 때문에 트랜잭션이 끝나기 전에 지연 로딩을 강제로 호출해 두어야 한다.