본문 바로가기

개인적으로 공부한 것을 정리해 놓은 블로그입니다 틀린 것이 있으면 댓글 부탁 드립니다!


JPA

API 개발을 위한 JPA 4 - OSIV (open session in view)

반응형

OSIV 란 ? 

 

JPA가 생기기전 하이버네이트에서 JPA의 EntityManager역할을 하는게  hibernate Session이 었다 . 

 

JPA에서는 open entitymanager in view라고 하지만 관례산 OSIV(open session in view)라 한다. 

 

기본값이 true 로 되어 있다 

 

스프링 부트 애플리케이션을 run 하면

2021-06-14 23:20:39.303  WARN 29122 --- [  restartedMain] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning

 

위의 코드와 같은 warn을 볼 수 있다.  

 

open-in-view는 기본적으로 활성화되어 있으니. 뷰 렌더링 중에 데이터베이스 쿼리를 수행 할 수 있다 ,   경고를 비활성화하기위해선spring.jpa.open-in-view를 명시적으로 구성하라고 한다. 

 

음 뭔가 위험한건가 ?

 

영속성 컨텍스트는 데이터베이스 커넥션을 가져와 JPA의 기능들을 동작시키는데 

JPA가 데이터베이스 커넥션을 가져오는 시점은 언제이고 반환하는 시점은 언제일까 ?

 

JPA는 데이터베이스 트랜젝션이 시작될때 데이터베이스 커넥션을 가져온다

중요한 것은 반환하는 시점이다 . 

 

OSIV는 반환 시점을 지정하는 옵션이라 생각하면된다 

 

OSIV 옵션을 켜둘때 장점은   데이터베이스 트랜젝션이 끝나더라도 해당 요청에 대한 응답이 완료될때까지 DB 커넥션과 영속성 컨텍스트가 살아 있기 때문에 요청과 응답을 다루는 컨트롤러단에서도 지연로딩같은 영속성 컨택스트의 기능들을 사용할 수 있다. 서비스 단에서 핵심 비지니스 로직이 아닌 로직들이 덜어질 수 있는 것이다 .

    

단점은 데이터 베이스 커넥션이 너무 오래 유지된다는 것이다 . 데이터 베이스 커넥션은 한정적인데 한 요청이 커넥션을 너무 오래 붙잡고 있으면 커넥션풀이 말라버려 장애가 일어날 수 있다. 때문에 접속량이 많은 실시간 대용량 서비스 같은 경우에는 OSIV옵션을 꺼두는 것이 좋다 .

 

OSIV 옵션이 꺼져있을 때의 장점은 위에 켜져 있을 때의 단점을 해결해 준다는 것이다.  대신 모든 영속성 컨텍스트를 사용하는 로직을 트랜잭션 내에서 해결해야하기 때문에 주로 트랜잭션이 시작되고 끝나는 서비스단의 코드가 복잡해지고 유지보수가 힘들어질 수 있다.

이런 문제를 해결하기 위해선 화면용(조회용)  Service를 분리하는 것도 방법이다 . 핵심 비지니스로직이 아닌 화면용 Sevice 같은 경우 별도의 Service로 만들어 로직들을 따로 관리하면 유지보수성이 개선된다.

 

 서비스 규모가 작다면 굳이 분리할 필요는 없지만 서비스 규모가 커지면 위의 방법을 고려해 보는 것이 좋다 

 

 

반응형