Contents
해결책
Lazy Loading 전략과 기본 동작
Lazy Loading은 엔티티와 연관된 데이터를 지연해서 로드하는 전략으로, 처음 데이터에 접근할 때(예:
getCustomer()
를 호출할 때) 실제 데이터베이스에서 필요한 데이터를 가져옵니다.문제는 뷰를 렌더링 할 때 불필요한 Lazy Loding이 이뤄날 수도 있다는 것이다.
즉 DB커넥션 세션이 계속 열려있다는 문제가 발생한다.
- Board -> User(FK) Lazy 전략 순수하게 Board Select하면 , User는 Select가 안됨(문제없음)
- OpenInView = true(default)
- 컨트롤러에서 반환하는 값이 객체이면 json으로 변환됨 이때 json으로 바뀌기 위해 get요청을 하게 되고 그러면 전략이 Lazy 라서 db에 필요없는 User요청(문제발생)
해결책
spring.jpa.open-in-view=false
서비스 계층에서의 Lazy Loading
- 서비스 계층까지 Lazy Loading:
spring.jpa.open-in-view=false
설정이 적용되면, Lazy Loading은 서비스 계층에서만 가능하고, 그 이후(예: 컨트롤러나 뷰에서)는 사용할 수 없습니다. 따라서 서비스 계층에서 필요한 모든 데이터를 미리 로드해야 합니다. - 이 방식은 서비스 계층에서 모든 데이터베이스 작업이 완료되도록 보장하며, 뷰 계층에서는 데이터베이스 접근 없이 이미 로드된 데이터를 사용하게 됩니다.
. 왜 사용하는가?
- 성능 최적화:
Open Session in View
패턴을 사용하지 않으면, 데이터베이스 세션이 짧게 유지되므로 데이터베이스 리소스를 더 효율적으로 사용하게 됩니다. 이는 고부하 시스템에서 특히 유리합니다.
- 책임 분리:
- 서비스 계층에서 모든 데이터 처리를 완료하게 함으로써, 서비스 계층과 뷰 계층 간의 책임이 명확히 분리됩니다. 뷰는 데이터 표현에만 집중하고, 데이터 로딩이나 비즈니스 로직 처리는 서비스 계층에서만 이루어집니다.
- 안정성:
- 세션이 뷰까지 열려 있으면, 뷰 렌더링 중에 Lazy Loading이 발생할 수 있으며, 이로 인해 예기치 않은 데이터베이스 접근이나 성능 문제가 발생할 수 있습니다.
spring.jpa.open-in-view=false
설정은 이러한 문제를 예방합니다.
Share article