23 OpenInView , Lazy 전략

강재영's avatar
Aug 22, 2024
23 OpenInView , Lazy 전략
Contents
해결책
 
notion image
 

Lazy Loading 전략과 기본 동작

💡
Lazy Loading은 엔티티와 연관된 데이터를 지연해서 로드하는 전략으로, 처음 데이터에 접근할 때(예: getCustomer()를 호출할 때) 실제 데이터베이스에서 필요한 데이터를 가져옵니다.
 
문제는 뷰를 렌더링 할 때 불필요한 Lazy Loding이 이뤄날 수도 있다는 것이다.
즉 DB커넥션 세션이 계속 열려있다는 문제가 발생한다.
 
 
  1. Board -> User(FK) Lazy 전략 순수하게 Board Select하면 , User는 Select가 안됨(문제없음)
  1. OpenInView = true(default)
  1. 컨트롤러에서 반환하는 값이 객체이면 json으로 변환됨 이때 json으로 바뀌기 위해 get요청을 하게 되고 그러면 전략이 Lazy 라서 db에 필요없는 User요청(문제발생)
 

해결책

 
spring.jpa.open-in-view=false
 

서비스 계층에서의 Lazy Loading

  • 서비스 계층까지 Lazy Loading: spring.jpa.open-in-view=false 설정이 적용되면, Lazy Loading은 서비스 계층에서만 가능하고, 그 이후(예: 컨트롤러나 뷰에서)는 사용할 수 없습니다. 따라서 서비스 계층에서 필요한 모든 데이터를 미리 로드해야 합니다.
    • 이 방식은 서비스 계층에서 모든 데이터베이스 작업이 완료되도록 보장하며, 뷰 계층에서는 데이터베이스 접근 없이 이미 로드된 데이터를 사용하게 됩니다.
    •  
 

. 왜 사용하는가?

  1. 성능 최적화:
      • Open Session in View 패턴을 사용하지 않으면, 데이터베이스 세션이 짧게 유지되므로 데이터베이스 리소스를 더 효율적으로 사용하게 됩니다. 이는 고부하 시스템에서 특히 유리합니다.
  1. 책임 분리:
      • 서비스 계층에서 모든 데이터 처리를 완료하게 함으로써, 서비스 계층과 뷰 계층 간의 책임이 명확히 분리됩니다. 뷰는 데이터 표현에만 집중하고, 데이터 로딩이나 비즈니스 로직 처리는 서비스 계층에서만 이루어집니다.
  1. 안정성:
      • 세션이 뷰까지 열려 있으면, 뷰 렌더링 중에 Lazy Loading이 발생할 수 있으며, 이로 인해 예기치 않은 데이터베이스 접근이나 성능 문제가 발생할 수 있습니다. spring.jpa.open-in-view=false 설정은 이러한 문제를 예방합니다.
 
Share article

강재영 블로그