2-4. 실무 필수 최적화

지니🧸·2023년 3월 2일
0

Spring Boot & JPA

목록 보기
22/35

본 문서는 인프런의 실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화 (김영한) 강의를 공부하며 작성한 개인 노트입니다.

🧼 OSIV와 성능 최적화

OSIV

Open Session In View - Hibernate

  • JPA의 EntityManager = Hibernate의 Session
    • JPA에서는 Open EntityManager in View

OSIV ON

spring.jpa.open-in-view

  • 기본값: true

OSIV은 최초 디비 커넥션 시작 시점부터~API 응답 끝나는 시점까지 영속성 컨텍스트와 디비 커넥션 유지

  • 이 때문에 view template/API controller에서 지연 로딩 가능
    • 지연 로딩은 영속성 컨텍스트가 유지되어야 가능
    • 영속성 컨텍스트는 디비 커넥션을 유지함
  • 하지만 디비 커넥션 리소스를 너무 오래 사용해서 장애로 이어질 수 있음
    • (예) 실시간 트래픽이 중요한 앱 등

OSIV OFF

spring.jpa.open-in-view: false

트랜잭션 종료 > 영속성 컨텍스트 종료 > 디비 커넥션 반환 >> 커넥션 리소스 낭비 X

  • 모든 지연로딩은 트랜잭션 안으로 옮겨야 함
  • View template에서는 지연로딩 불가
  • 대안
    • fetch join
    • OR 트랜잭션이 끝나기 전에 지연로딩 강제 호출
    • OrderQueryService 클래스를 만들어 지연로딩이 필요한 로직을 옮기자

커멘드와 쿼리 분리

실무에서 OSIV을 끈 상태로 복잡성을 관리하는 방법임
(예) OrderService을 OrderService와 OrderQueryService로 분리

  • OrderService: 핵심 비즈니스 로직
  • OrderQueryService: 화면/API에 맞춘 서비스

참고

고객 서비스의 실시간 API > OSIV 끄기
Admin처럼 커넥션 사용량이 적음 > OSIV 키기

profile
우당탕탕

0개의 댓글