*인프런 '실전! 스프링부트와 JPA 활용2' 강의 내용에서 배운 내용을 정리한 것입니다*
OSIV: Open Session In View, 하이버네이트
OEIV: Open EntityManager In View, JPA(관례상 OSIV라 한다)
-설정
spring.jpa.open-in-view: true
-OSIV와 지연로딩
OSIV 전략은 최초 데이터베이스 시작 시점부터 API 응답이 끝날 때까지 영속성 컨텍스트와 데이터베이스 커넥션을 유지한다.
지연로딩은 영속성 컨텍스트가 살아있어야 가능하고, 영속성 컨텍스트는 데이터베이스 커넥션을 유지한다.

-문제점
OSIV 전략은 너무 오랜시간동안 데이터베이스 커넥션 리소스를 사용하기 때문에, 실시간 트래픽이 중요한 애플리케이션에서는 커넥션이 모자랄 수 있고, 이것은 곧 장애로 이어진다
-결론
따라서 OSIV를 끄고, 트랜잭션을 종료할 때 영속성 컨텍스트를 닫고 데이터베이스 커넥션을 반환해야지 커넥션 리소스를 낭비하지 않는다.
이렇게 되면, 지연로딩을 트랜잭션 안에서 처리해야 한다. 이것은 많은 지연 로딩 코드를 트랜잭션 안으로 넣어야하는 단점이 있다.
트랜잭션이 끝나기 전에 지연로딩을 강제로 호출해 두어야 한다
이것을 하기 위해서는 Command와 Query를 분리하는 방법을 사용해야한다.
예를 들면 OrderService 에서
OrderServie: 핵심 비즈니스 로직
OrderQueryService: 화면이나 API에 맞춘 서비스(주로 읽기 전용 트랜잭션 사용)
두 서비스 모두 트랜잭션을 유지하면서 지연 로딩을 사용할 수 있다
'JPA' 카테고리의 다른 글
[JPA] 2/24 공부내용 정리(페치 조인(main),다형성 쿼리,엔티티 직접 사용, Named 쿼리, 벌크연산) (0) | 2022.02.26 |
---|---|
[JPA] 2/24 공부내용 정리(경로 표현식, 경로탐색, 묵시적 조인) (0) | 2022.02.26 |
[JPA] 2/24 공부내용 기록(조인,on 절, 서브쿼리) (0) | 2022.02.26 |
[JPA] 2/22 공부 내용 기록(값타입,Embedded Type) (0) | 2022.02.25 |
[JPA] 2/22 공부내용 기록(지연 로딩, cascade, 고아객체) (0) | 2022.02.25 |