![Is Open Session in View (OSIV) in Hibernate a Bad Practice and What are the Alternatives?](https://img.php.cn/upload/article/000/000/000/173240407838982.jpg)
Hibernate에서 Open Session in View가 나쁜 습관인 이유
Open Session in View(OSIV)는 Hibernate에서 다음을 포함하는 패턴입니다. HTTP 요청 전반에 걸쳐 세션이 열립니다. 이는 LazyLoadException을 방지하는 데 도움이 될 수 있지만 다음과 같은 수많은 단점이 있습니다.
데이터베이스 관점 문제:
-
자동 커밋 모드: 트랜잭션은 서비스 계층에 의해 커밋되지만 OSIV에서는 명시적으로 커밋되지 않으므로 UI 렌더링의 후속 데이터베이스 문은 자동 커밋으로 실행됩니다. 모드. 이는 빈번한 트랜잭션 로그 플러시를 요구하여 데이터베이스 서버에 부담을 줍니다.
-
혼합된 명령문 소스: OSIV에서는 서비스 계층과 UI 렌더링 프로세스 모두에서 명령문을 생성할 수 있으므로 테스트가 어렵습니다. 여러 계층에 걸쳐 데이터베이스 상호 작용.
코드 복잡성 및 확장성 문제:
-
제한된 UI 기능: OSIV는 UI 계층을 탐색 연결로 제한하여 잠재적으로 N 1 쿼리 문제를 유발할 수 있습니다.
-
연결 보유: OSIV는 UI 렌더링 전반에 걸쳐 데이터베이스 연결을 보유하여 연결 임대 시간을 늘리고 트랜잭션을 줄일 수 있습니다.
Spring Boot 고려 사항:
Spring Boot에서는 OSIV가 기본적으로 활성화되어 있습니다. 애플리케이션 구성에서 spring.jpa.open-in-view=false를 설정하여 비활성화하는 것이 좋습니다.
LazyLoadException을 피하기 위한 대체 전략:
대신 OSIV의 경우 다음을 고려하십시오.
-
열심히 가져오기 관계: 뷰 계층에 필요한 연관을 즉시 가져와서 엔터티가 검색될 때 로드되도록 합니다.
-
서비스 계층에서 명시적 가져오기: fetch()와 같은 메서드를 사용하여 뷰를 렌더링하기 전에 명시적으로 연관을 가져옵니다.
-
프로젝션: 프로젝션을 사용하여 불필요한 지연 초기화를 피하면서 뷰 레이어에 필요한 데이터만 검색합니다.
-
Criteria API: Criteria API를 활용하여 쿼리 및 즉시 가져오기 연결을 사용자 정의합니다.
-
엔티티 그래프: 특정 용도에 따라 연관 검색을 최적화하도록 엔터티 그래프를 정의합니다. 경우입니다.
위 내용은 Hibernate의 OSIV(Open Session in View)는 나쁜 습관이며 대안은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!