-
JPA(2) - OSIVWeb/JPA 2024. 1. 22. 12:52
1. Open Session In View (Open EntityManager in View)
- 영속성 컨텍스트의 범위를 설정하는 옵션이다.
- 기본으로 view까지 session이 유지된다. (DB세션 의미)
- 트랜잭션 시작시 영속성 컨텍스트가 DB 커넥션을 가지고오는데, OSIV가 켜져있으면, 트랜잭션 종료후에도 커넥션을 반환하지 않는다 (레이지 로딩 때문이다.) 응답이 나갈때 까지 커넥션을 유지한다.
- 이 덕분에 view나 컨트롤러에서 지연 로딩이 가능했던 것이다.
- 이 전략은 DB커넥션을 너무 많이 사용하기때문에 장애로 이어질 수 있다.
- OSIV를 끄면 트랜잭션 종료시 영속성 컨텍스트를 닫고, DB커넥션을 반환한다. 따라서 커넥션 리소스 낭비가 없다.
- OSIV를 끄면 모든 지연로딩은 트랜잭션 안에서 처리해야한다! -> 트랜잭션 끝나기 전에 모든 지연로딩을 강제로 호출해 두어야한다! (외부에서 지연로딩 호출이 안되는 것 뿐 필요없는 애들까지 모두 로딩시키라는 말은 아님 -> 필요한 데이터는 미리 지연로딩을 초기화 하자!)
2. 커맨드와 쿼리의 분리
- OSIV를 끈 상태로 복잡성을 관리하는 방법이다. Command와 Query를 분리하는 것
- 비지니스 로직이 아닌 화면에 맞춘 Service를 따로 추가하자 (OrderQueryService - 트랜잭션 읽기 전용 [화면, API에 맞춘 서비스])
- 보통 비지니스 로직은 엔티티 몇 개를 수정하거나 등록하는 것 성능 문제가 크게 없다.
- 복잡한 화면을 출력하기 위한 쿼리는 화면에 맞추어 최적화 하는 것이 중요하다. (핵심과 뷰용 로직은 라이프 사이클이 다름)
'Web > JPA' 카테고리의 다른 글
SpringDataJPA (1) - 공용 인터페이스, @Query (0) 2024.01.30 JPA (2) - API 개발 시 기본으로 지켜야 할 사항 (0) 2024.01.22 JPA (11) - 다형성 쿼리,엔티티 직접 사용,정적쿼리,벌크연산 (0) 2024.01.12 JPA - 프로젝트 생성 (0) 2024.01.11 JPA 활용 (1-3) - 엔티티 설계시 주의점 (0) 2024.01.04