ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JPA(2) - OSIV
    Web/JPA 2024. 1. 22. 12:52

     

    1. Open Session In View (Open EntityManager in View)

     

    출처: JPA 활용 2(김영한) -인프런

     

    - 영속성 컨텍스트의 범위를 설정하는 옵션이다. 

    - 기본으로 view까지 session이 유지된다. (DB세션 의미)

    - 트랜잭션 시작시 영속성 컨텍스트가 DB 커넥션을 가지고오는데, OSIV가 켜져있으면, 트랜잭션 종료후에도 커넥션을 반환하지 않는다 (레이지 로딩 때문이다.) 응답이 나갈때 까지 커넥션을 유지한다.

    - 이 덕분에 view나 컨트롤러에서 지연 로딩이 가능했던 것이다.

    - 이 전략은 DB커넥션을 너무 많이 사용하기때문에 장애로 이어질 수 있다.

     

    출처: JPA 활용 2(김영한) -인프런

     

    - OSIV를 끄면 트랜잭션 종료시 영속성 컨텍스트를 닫고, DB커넥션을 반환한다. 따라서 커넥션 리소스 낭비가 없다.

    - OSIV를 끄면 모든 지연로딩은 트랜잭션 안에서 처리해야한다! -> 트랜잭션 끝나기 전에 모든 지연로딩을 강제로 호출해 두어야한다! (외부에서 지연로딩 호출이 안되는 것 뿐 필요없는 애들까지 모두 로딩시키라는 말은 아님 -> 필요한 데이터는 미리 지연로딩을 초기화 하자!)

     

    2. 커맨드와 쿼리의 분리 

     

    - OSIV를 끈 상태로 복잡성을 관리하는 방법이다.  Command와 Query를 분리하는 것 

    - 비지니스 로직이 아닌 화면에 맞춘 Service를 따로 추가하자 (OrderQueryService - 트랜잭션 읽기 전용 [화면, API에 맞춘 서비스]) 

    - 보통 비지니스 로직은 엔티티 몇 개를 수정하거나 등록하는 것 성능 문제가 크게 없다. 

    - 복잡한 화면을 출력하기 위한 쿼리는 화면에 맞추어 최적화 하는 것이 중요하다. (핵심과 뷰용 로직은 라이프 사이클이 다름)

     

     

Designed by Tistory.