본문 바로가기
Spring/JPA 2

5. API 개발 고급 - 실무 필수 최적화

by wch_t 2024. 1. 13.

OSIV

: Open Session In View

 

- 현재 JPA에서의 EntityManager와 같은 역할을

과거 Hibernate 에서 Session을 사용하였다.

 

DB 커넥션 계속 유지

 

 

@Transactional → setAutoCommit()

DB 커넥션을 획득하는 시점은 일반적으로 트랜잭션을 시작할 때 이다.

 

그럼 DB 커넥션의 반환 시점은 언제가 될까?

위 시점을 OSIV 설정을 통해 결정한다.

 

 


 

 

실전! 스프링부트와 JPA 활용2 - 김영한

 

 

if OSIV = True

     트랜잭션이 끝나도 'DB 커넥션'영속성 컨텍스트가 유지되게끔 한다.

     따라서 (API) Controller 나 View Template에서의 지연 로딩이 가능해진다.

 

     사용자에게 반응되기 전까지 오랫동안 DB 커넥션 리소스를 사용한다.

 

 

if OSIV = False

     트랜잭션이 끝날 때, 'DB 커넥션'이 반환되고 영속성 컨텍스트도 비워진다.

     따라서 커넥션 리소스 낭비가 없고, 실시간으로 트래픽이 많은 경우 DB 커넥션을 유연하게 사용할 수 있다.

 

     모든 지연 로딩을 트랜잭션(Service) 안에서 처리해야 한다.

     (Controller와 View Template에서 프록시 초기화를 할 수 없다.)

 

.getUsername() 일 때 프록시 초기화가 일어나야 한다.

 

open-in-view: false 설정 후 실행 결과

 

 

위에서 말했듯이 트랜잭션 안에서 처리를 하거나, Fetch join을 사용해야 한다.

 

이 때 아키텍처에 따라 별도의 QueryService를 만들어 관리해주는 것이 좋다.

ex. OrderService

        - OrderService : 핵심 비즈니스 로직

        - OrderQueryService : 화면이나 API에 맞춘 서비스 

 

 

 

 

 

plus. 자바 ORM 표준 JPA 프로그래밍 13장