GitHub

https://github.com/Choidongjun0830

Spring

[JPA 활용 2편] API 개발 고급 - 실무 필수 최적화

gogi masidda 2024. 7. 8. 13:07

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