[JPA] OSIV
Open Session In View의 약자이다.
JPA가 영속성 컨텍스트를 관리하기 위해서는 먼저 데이터베이스 커넥션을 획득해야한다.
데이터베이스의 트랜잭션이 시작될 때 JPA의 영속성 컨텍스트가 데이터베이스 커넥션을 획득하는데.. 언제 반환하는걸까?
OSIV가 켜져 있는 경우 최초의 데이터베이스 커넥션을 획득하고 API의 응답이 끝날 때 까지 영속성 컨텍스트와 데이터베이스 커넥션을 유지한다.
즉, 트랜잭션이 끝나도 데이터베이스 커넥션을 반환하지 않는다.
지연 로딩은 영속성 컨텍스트가 살아있어야 가능하고, 영속성 컨텍스트는 데이터베이스 커넥션이 있어야 관리된다.
따라서 OSIV가 켜져 있으면 지연 로딩이 가능하다.
그런데... 데이터베이스 커넥션을 계속 들고 있으면 사용자가 많은 애플리케이션인 경우 데이터베이스 커넥션이 모자랄 수 있어 치명적인 문제가 발생한다.
OSIV를 끈 상태에서는 딱 트랜잭션이 수행되는 동안에만 데이터베이스 커넥션을 유지한다.
당연히 영속성 컨텍스트도 관리되지 않게 되고, 커넥션 리소스를 낭비하지 않게 된다.
대신 지연 로딩을 트랜잭션 외부에서 처리할 수 없게 된다.
따라서 트랜잭션이 끝나기 전에 지연 로딩을 강제로 호출해 주는 방식으로 기존 코드를 수정해야 한다.
고객 서비스의 실시간 API처럼 데이터베이스 커넥션을 자주 사용하는 부분에서는 OSIV를 끄고, 관리자 페이지처럼 커넥션을 많이 사용하지 않는 곳에서는 OSIV를 끄는 것 처럼 상황에 적합한 방법을 사용하자.
OSIV는 기본으로 켜져 있는 상태이다. 필요에 따라 설정해주자.
'Spring > JPA' 카테고리의 다른 글
[JPA] JPQL (2) (0) | 2022.12.28 |
---|---|
[JPA] JPQL (1) (0) | 2022.12.27 |
[JPA] 값 타입 (0) | 2022.12.26 |
[JPA] 영속성의 전이와 고아 객체 (0) | 2022.12.24 |
[JPA] 프록시와 연관관계 (0) | 2022.12.24 |
댓글
이 글 공유하기
다른 글
-
[JPA] JPQL (2)
[JPA] JPQL (2)
2022.12.28 -
[JPA] JPQL (1)
[JPA] JPQL (1)
2022.12.27 -
[JPA] 값 타입
[JPA] 값 타입
2022.12.26 -
[JPA] 영속성의 전이와 고아 객체
[JPA] 영속성의 전이와 고아 객체
2022.12.24