[스프링부트JPA_활용2] Section5 - 실무 필수 최적화

JiMin LEE·2022년 11월 10일
0

[Spring]JPA활용2

목록 보기
6/6

1️⃣ OSIV와 성능 최적화

  • OSIV ( Open Session In View )
    : entity manager가 hibernate에서는 session

    1. OSIV ON

    • spring.jpa.open-in-view : true 가 켜져 있으면
      JPA가 데이터베이스 트랜잭션을 시작할 때 데이터베이스커넥션을 가지고 오고
      데이터 response가 나가면 데이터베이스 커넥션을 반환하고 영속성 컨텍스트도 사라진다.
    • 지연 로딩은 영속성 컨텍스트가 살아있어야 가능하고, 영속성 컨텍스트는 기본적으로 데이터베이스 커넥션을 유지한다. → 장점
    • 엔티티를 적극적으로 활용해서 지연 로딩같은 기술을 controller나 view에서 적극 활용할 수 있다 → 유지보수력 높아짐 → 장점
    • 너무 오랜 시간동안 데이터베이스 커넥션 리소스를 사용하기 때문에, 실시간 트래픽이 중요한 애플리케이션에서는 커넥션이 모자랄 수 있다. → 단점
      ex - 컨트롤러에서 외부 API를 호출하면 외부 API 대기 시간 만큼 커넥션 리소스를 반환하지 못하고, 유지해야 한다.

  • OSIV OFF

    • spring.jpa.open-in-view: false : 종료
    • OSIV를 끄면 트랜잭션을 종료할 때 영속성 컨텍스트를 닫고, 데이터베이스 커넥션도 반환한다. → 장점
    • OSIV를 끄면 커넥션 리소스를 낭비하지 않는다. → 장점
    • OSIV를 끄면 모든 지연로딩을 트랜잭션 안에서 처리해야 한다. 따라서 페치 조인을 사용하거나 지금까지 작성한 많은 지연 로딩 코드를 트랜잭션 안으로 넣어야 한다. → 단점
  • OSIV를 끈 상태로 복잡성을 관리하는 좋은 방법
    1. Command와 Query를 분리한다.
    2. 트랜잭션을 controller에서 사용하지 않기 때문에 query용 전용 service를 만든다.
    - OrderService : 핵심 비즈니스 로직
    - OrderQueryService : 화면이나 API에 맞춘 서비스 → 주로 읽기 전용 트랜잭션 사용
    - 보통 서비스 계층에서 트랜잭션을 유지한다.
    - 두 서비스 모두 트랜잭션을 유지하면서 지연 로딩을 사용할 수 있다.

    • 결론
      - 고객 서비스의 실시간 API는 OSIV를 끈다.
      - ADMIN 처럼 커넥션을 많이 사용하지 않는 곳에서는 OSIV를 켠다.

0개의 댓글