OSIV 옵션에 대해서 설명해주세요.

2024. 11. 27. 21:20·백엔드 면접

OSIV (Open Session In View)

OSIV는 영속성 컨텍스트를 뷰까지 열어둔다는 의미입니다.

 

영속성 컨텍스트가 살아있으면 엔티티는 영속 상태로 유지될 수 있어, 뷰에서도 지연 로딩을 사용할 수 있습니다. OSIV의 핵심은 뷰에서도 지연 로딩이 가능하도록 하는 것입니다. 가장 단순한 구현은 클라이언트 요청이 들어올 때 필터나 인터셉터에서 트랜잭션을 시작하는 방법이 있습니다. 이를 트랜잭션 방식 OSIV 라고 합니다.

 

하지만, 트랜잭션 방식 OSIV는 표현 계층에서도 엔티티를 수정할 수 있기 때문에 유지보수하기 어려운 코드를 만들 수 있습니다.


트랜잭션 방식의 OSIV 문제는 어떻게 해결할 수 있을까요?

최신 방식의 OSIV는 트랜잭션 방식의 문제를 해결합니다. 스프링 OSIV는 OSIV를 사용하면서 트랜잭션은 비즈니스 계층에서만 사용합니다. 표현 계층에서는 트랜잭션이 없기 때문에 수정이 불가능합니다.

하지만, 표현 계층에서 트랜잭션 없는 읽기를 이용해 지연 로딩은 가능합니다. 동작 원리를 설명하겠습니다.

 

  1. 클라이언트의 요청이 들어오면 서블릿 필터나 스프링 인터셉터에서 영속성 컨텍스트를 생성합니다.
  2. 응용 계층에서 @Transactional 로 트랜잭션을 시작할 때 미리 생성한 영속성 컨텍스트를 찾아와서 트랜잭션을 시작합니다.
  3. 응용 계층이 끝나면 트랜잭션을 커밋하고 영속성 컨텍스트를 플러시 합니다. (영속성 컨텍스트는 종료하지 않습니다.)
  4. 컨트롤러와 뷰까지 영속성 컨텍스트가 유지되므로 조회한 엔티티는 영속 상태를 유지할 수 있습니다.
  5. 필터, 인터셉터로 요청이 돌아오면 영속성 컨텍스트를 종료하는데 이때 플러시는 수행하지 않습니다.

 

스프링 방식의 OSIV의 문제점

▶ 표현 계층에서 엔티티를 수정하면 데이터베이스에 반영하지 않습니다. 하지만, 엔티티를 수정한 이후 트랜잭션을 시작하는 응용 계층을 시작한 경우 문제가 발생합니다. 응용 계층 트랜잭션이 끝나고 영속성 컨텍스트를 플러시 하는 과정에서 변경 감지가 동작할 수 있습니다.
▶ OSIV 기능을 사용하면 상대적으로 오래 DB 커넥션을 점유하기 때문에 커넥션 고갈로 이어질 수 있습니다.

OSIV 기능을 비활성화하여 성능 최적화

▶ OSIV 기능이 활성화되어 있는 경우에는 트랜잭션의 범위를 벗어나도 커넥션을 계속 유지합니다. 만약 트래픽을 많이 받는 상황이라면, 커넥션 고갈로 이어질 수 있습니다. OSIV 기능을 비활성화하여 데이터베이스 커넥션을 율적으로 사용할 수 있습니다.

 

 


무조건 OSIV 기능을 비활성화 하는 것이 좋을까요?

무조건 비활성화보다는 그래야 하는 근거가 필요합니다. 만약 트랜잭션 범위 밖에서 지연 로딩을 반드시 수행해야 하는 경우에는 비활성화하기 어려울 수도 있습니다.

 

데이터베이스를 복제하여 사용하는 경우, 데이터소스도 분리해야 하는데, OSIV 기능으로 인해 예기치 않은 데이터베이스로 요청이 전달될 수 있습니다. 대량의 트래픽이 발생하는 경우처럼 데이터베이스 커넥션을 효율적으로 사용해야 할 수도 있습니다. 이런 경우에는 OSIV 비활성화를 고려해 볼 수 있습니다.

 

결론은 상황에 적합한 경우 OSIV 기능을 비활성화하는 것이 적절합니다.

'백엔드 면접' 카테고리의 다른 글

엔티티 매니저에 대해 설명해 주세요.  (0) 2024.11.30
JPA의 ddl-auto 옵션에 대해서 설명해 주세요.  (0) 2024.11.29
Spring Data JPA에서 새로운 Entity인지 판단하는 방법은 무엇일까요?  (0) 2024.11.29
@Value 어노테이션 사용 시 주의할 점을 설명해 주세요.  (0) 2024.11.28
RAID 기술에 대해서 설명해주세요.  (0) 2024.11.28
'백엔드 면접' 카테고리의 다른 글
  • JPA의 ddl-auto 옵션에 대해서 설명해 주세요.
  • Spring Data JPA에서 새로운 Entity인지 판단하는 방법은 무엇일까요?
  • @Value 어노테이션 사용 시 주의할 점을 설명해 주세요.
  • RAID 기술에 대해서 설명해주세요.
이런개발
이런개발
geun-00의 흔적 보관소
  • 이런개발
    내일이 기대되는 오늘
    이런개발
  • 전체
    오늘
    어제
    • 분류 전체보기 N
      • 백엔드 면접
      • SQL N
        • SUM, MAX, MIN
        • SELECT
        • GROUP BY
        • JOIN
      • Spring
      • JPA
      • 트러블슈팅
      • Infra
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    오블완
    자바
    raid
    JPA
    데브코스
    티스토리챌린지
    백엔드 면접
    토스 페이먼츠
    스프링
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
이런개발
OSIV 옵션에 대해서 설명해주세요.
상단으로

티스토리툴바