ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring] OSIV 란?
    Spring JPA 2024. 5. 24. 15:10
    • 영속성 컨텍스트를 뷰까지 열어두는 기능
    • 뷰에서도 지연 로딩이 가능하도록 하는 것
    • 컨트롤러 계층에서도 데이터를 변경할 수 있다
    • 스프링에서는 defualt로 OSIV 값이 true로 설정 되어 있다

    영속성 컨텍스트 : 엔티티를 영구 저장하는 환경이라는 뜻, 애플리케이션과 데이터베이스 사이에서 객체를 보관하는 가상의 데이터베이스 같은 역할을 함

     

    동작 방식

    1. 요청이 들어오면 서블릿 필터나, 스프링 인터셉터에서 영속성 컨텍스트를 생성한다
    2. 서비스 계층에서 @Transactional으로 트랜잭션을 시작하게 되면 전에 생성한 영속성 컨텍스트를 찾아온다
    3. 서비스 계층이 끝나고 반환하면 트랜잭션을 커밋하고 영속성 컨텍스트를 flush 한다 
    4. 이때 트랜잭션은 끝나지만 영속성 컨텍스트는 끝내지 않는다
    5. 컨트롤러와 뷰까지 영속성 컨텍스트가 유지되므로 조회한 엔티티는 영속 상태를 유지한다
    6. 서블릿 필터나 스프링에서 인터셉터로 요청이 돌아오면 영속성 컨테스트를 종료한다 이때 flush를 호출하지 않고 바로 종료한다

     

    flush : 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영

     

     

     

    문제 

    • 오랜시간 동안 데이터베이스 커넥션 리소스를 사용하기 때문에 실시간 트래픽이 중요한 애플리케이션에는 커넥션이 모잘랄 수 있다 이게 곧 시스템 장애로 이어진다
    • 즉, 오랜시간 데이터베이스 커넥션을 사용한다는 점이다

     

     

    그렇다면 OSIV를 끈다면?

     

    • 트랜잭션을 종료할 때 영속성 컨텍스트를 닫고 데이터베이스 커넥션도 반환한다
    • 즉, 커넥션 리소스도 낭비하지 않는다
    • 다시말해 영속성 컨텍스트가 트랜잭션과 생명주기를 같이한다
    • 하지만 모든 지연로딩을 트랜잭션 안에서 처리해야 한다
    • 컨트롤러 계층에서 작성한 많은 지연 로딩 코드를 트랜잭션 안으로 넣어햐한다는 단점이 있다

     

     

    결론

     

    결론은 실시간성이 중요한 어플리케이션에서는 OSIV 를 끄는게 좋다 데이터베이스 커넥션이 부족해서 시스템 장애로 이어질수도 있다

Designed by Tistory.