JPA open-in-view

치미·2024년 4월 10일

JPA open-in-view가 뭘까

spring.jpa.open-in-view
OSIV,

  • API의 요청부터 응답까지, 영속성 컨텍스트가 유지되는 것이다.
  • default 값은 true!

영속성 컨텍스트는 DB Connection을 1:1로 쓰면서 동작해야 함.
기본적으로 DB Transaction을 시작할 때 영속성 컨텍스트가 DB Connection을 가져온다.
커넥션 획득 후에 DB에게 돌려주는 시점이 중요하다.

이게 true로 켜져 있으면 응답이 반환되는 타이밍이 되어서야 끝남. 즉 Transaction이 끝나도 영속성 컨텍스트를 끝까지 살려두는 것.

지연 로딩은 영속성 컨텍스트가 살아 있어야 가능하고, 영속성 컨텍스트는 기본적으로 DB 커넥션을 유지하므로 이것 자체가 큰 장점이다.

그런데 이 전략은 너무 오랜 시간동안 DB Connection Resource를 사용한다.
따라서 실시간 트래픽이 중요한 Application에서는 Connection이 모자랄 수 있고, 이것이 장애로 이어진다.



true인 경우


false인 경우

  • Transaction을 종료할 때 영속성 컨텍스트를 닫고, DB Connection도 반환함. 따라서 Connection 리로스를 낭비하지 않음.
  • OSIV를 끄면 모든 지연 로딩을 Transaction 안에서 처리해야 한다.
  • 추가로, view template에서 지연로딩이 동작하지 않음. 따라서 transaction이 끝나기 전, 지연 로딩을 강제로 호출해두어야 한다.

이를 해결하기 위해 많은 방법들이 있는데,
그증 하나는 OSIV를 끈 상태로 복잡성을 관리하는 방법이다. 실무에서도 자주 쓰임.
바로 Command와 Query를 분리하는 것!
보통 비즈니스 로직은, 특정 Entity 몇 개를 등록하거나 수정하는 것이므로 성능이 크게 문제가 되지 않는다. 보통 성능 문제는 조회에서 많이 발생한다.
화면용 기능들은 요구사항이 자주 바뀌지만, 정책이나 핵심 비즈니스 로직은 잘 변경되지 않음.
예를 들어 OrderService라고 했을 때,

  • 주문 서비스
    • OrderService: 핵심 비즈니스 로직
    • OrderQueryService: 화변이나 API에 맞춘 서비스(주로 readOnly Transactiont사용)

크고 복잡한 Application을 개발한다면, 이 둘의 관심사를 명확하게 분리하는 것이 유지보수 관점에서 의미 있는 선택이다.

출처: 실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-JPA-API%EA%B0%9C%EB%B0%9C-%EC%84%B1%EB%8A%A5%EC%B5%9C%EC%A0%81%ED%99%94

profile
backend developer

0개의 댓글