OSIV와 성능 최적화
- Open Session In View
- JPA의 영속성 컨텍스트와 데이터베이스 커넥션은 밀접한 관련이 있다.
- 서비스 계층에서 데이터베이스 트랜잭션 시작 시에 JPA의 영속성 컨텍스트가 데이터베이스 커넥션을 가져온다.
- Open Session In View는 트랜잭션이 끝나도 영속성 컨텍스트와 데이터베이스 커넥션을 유지하는 것이다. 끝까지 살아있다가 응답이 나가면 그때 데이터베이스 커넥션을 돌려주고 영속성 컨텍스트가 사라진다.
- 그래서 지연 로딩이 가능했던 것이다.
- 하지만 이 전략은 데이터베이스 커넥션 리소스를 계속 사용해서 커넥션이 모자라 장애로 이어질 수 있다.
- OSIV를 Off
- 서비스 계층에서 트랜잭션을 종료할 때 영속성 컨텍스트를 닫고, 데이터베이스 커넥션도 반환한다.
- 커넥션 리소스를 낭비하지 않는다.
- 하지만 지연 로딩을 트랜잭션 안에서 모두 처리해야 한다. 지금까지 작성한 많은 지연 로딩 코드를 트랜잭션 안으로 넣어야 한다.
- OSIV를 끈 상태로 복잡성을 관리하는 좋은 방법은 커맨드와 쿼리를 분리하는 것이다.
- 보통 비즈니스 로직은 특정 엔티티 몇개를 등록, 수정하는 것이라서 성능에 크게 문제가 없다.
- 복잡한 화면을 출력하는 쿼리는 최적화하는 것이 중요하다.
- OrderService: 핵심 비즈니스 로직
- OrderQuerySerivce: 화면이나 API에 맞춘 서비스
- 위처럼 나눠서 분리해서 개발하는 것을 추천.
- 고객 서비스의 실시간 API는 OSIV를 끄고, ADMIN처럼 커넥션을 많이 사용하지 않는 곳에서는 OSIV를 킨다. 배포를 따로 한다.
Spring Data JPA
- JPARepository를 extends
- 기본적인 CRUD기능 모두 제공
- findByName처럼 일반화하기 어려운 기능도 메서드 이름으로 정확한 JPQL 쿼리를 실행
Querydsl
- 동적 쿼리 작성할 때 좋음.
- 빌드 시에 생성되는 Q... 엔티티를 이용
- 쿼리 오류를 컴파일 시점에 빠르게 잡을 수 있다.
- Querydsl은 필수
728x90
'Spring' 카테고리의 다른 글
로딩 페이지 (ajax 이용)과 Validation 적용하기 (2) | 2024.08.29 |
---|---|
Querydsl에서 동적 쿼리와 함께 페이징하기 (2) | 2024.08.08 |
[JPA 활용 2편] API 개발 고급 - 컬렉션 조회 최적화 (1) | 2024.07.05 |
[JPA 활용 2편] API 개발 고급 - 지연 로딩과 조회 성능 최적화 (0) | 2024.07.03 |
[JPA 활용 2편] API 개발 기본 (0) | 2024.07.02 |