-
[Spring] OSIV 란?Spring JPA 2024. 5. 24. 15:10
- 영속성 컨텍스트를 뷰까지 열어두는 기능
- 뷰에서도 지연 로딩이 가능하도록 하는 것
- 컨트롤러 계층에서도 데이터를 변경할 수 있다
- 스프링에서는 defualt로 OSIV 값이 true로 설정 되어 있다
영속성 컨텍스트 : 엔티티를 영구 저장하는 환경이라는 뜻, 애플리케이션과 데이터베이스 사이에서 객체를 보관하는 가상의 데이터베이스 같은 역할을 함
동작 방식
- 요청이 들어오면 서블릿 필터나, 스프링 인터셉터에서 영속성 컨텍스트를 생성한다
- 서비스 계층에서 @Transactional으로 트랜잭션을 시작하게 되면 전에 생성한 영속성 컨텍스트를 찾아온다
- 서비스 계층이 끝나고 반환하면 트랜잭션을 커밋하고 영속성 컨텍스트를 flush 한다
- 이때 트랜잭션은 끝나지만 영속성 컨텍스트는 끝내지 않는다
- 컨트롤러와 뷰까지 영속성 컨텍스트가 유지되므로 조회한 엔티티는 영속 상태를 유지한다
- 서블릿 필터나 스프링에서 인터셉터로 요청이 돌아오면 영속성 컨테스트를 종료한다 이때 flush를 호출하지 않고 바로 종료한다
flush : 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영
문제
- 오랜시간 동안 데이터베이스 커넥션 리소스를 사용하기 때문에 실시간 트래픽이 중요한 애플리케이션에는 커넥션이 모잘랄 수 있다 이게 곧 시스템 장애로 이어진다
- 즉, 오랜시간 데이터베이스 커넥션을 사용한다는 점이다
그렇다면 OSIV를 끈다면?
- 트랜잭션을 종료할 때 영속성 컨텍스트를 닫고 데이터베이스 커넥션도 반환한다
- 즉, 커넥션 리소스도 낭비하지 않는다
- 다시말해 영속성 컨텍스트가 트랜잭션과 생명주기를 같이한다
- 하지만 모든 지연로딩을 트랜잭션 안에서 처리해야 한다
- 컨트롤러 계층에서 작성한 많은 지연 로딩 코드를 트랜잭션 안으로 넣어햐한다는 단점이 있다
결론
결론은 실시간성이 중요한 어플리케이션에서는 OSIV 를 끄는게 좋다 데이터베이스 커넥션이 부족해서 시스템 장애로 이어질수도 있다
'Spring JPA' 카테고리의 다른 글
[Spring JPA] JPA N+1 문제 (1) 2024.10.13 [Spring JPA] entity의 생성일, 수정일 어떤식으로 할까 (0) 2024.09.11 [Spring] 즉시(Eager) 로딩 과 지연(Lazy) 로딩 (0) 2024.08.11 [Spring] DB 상태 테이블, Enum 관리 Converter 사용해보자 (0) 2024.07.04