Osiv


title: 2026-03-25 author: 강병호 (이름) date: 2026-03-25 (날짜) category: TIL/강병호/2026/03 (파일 경로 : TIL/{이름}/{연}/{월}) layout: post (자유) —

1. OSIV

OSIV는 영속성 컨텍스트를 뷰(View) 계층까지 열어두는 방식을 의미합니다. 영속성 컨텍스트가 살아있으면 엔티티는 ‘영속 상태’를 유지하므로, 트랜잭션이 끝난 후인 컨트롤러나 뷰에서도 지연 로딩(Lazy Loading)을 사용할 수 있다는 것이 핵심입니다.

2. OSIV의 개선 과정

초기 OSIV(트랜잭션 방식)는 표현 계층까지 트랜잭션을 확장했으나, 이는 컨트롤러에서 엔티티를 수정하면 DB까지 반영되는 심각한 유지보수 문제를 야기했습니다.

Spring의 OSIV 방식은 이를 다음과 같이 개선했습니다.

  • 비즈니스 계층: @Transactional 범위 내에서만 트랜잭션을 유지하며 데이터 수정이 가능합니다.
  • 표현 계층 (Controller/View): 트랜잭션은 없지만 영속성 컨텍스트는 유지됩니다. 따라서 ‘트랜잭션 없는 읽기’를 통해 지연 로딩은 가능하지만, 데이터 수정(Flush)은 불가능합니다.

3. 동작 원리

클라이언트 요청이 들어오면 서블릿 필터나 스프링 인터셉터에서 영속성 컨텍스트를 생성합니다. (트랜잭션은 시작하지 않음) 서비스 계층에서 트랜잭션을 시작할 때, 미리 생성된 영속성 컨텍스트를 찾아와서 사용합니다. 서비스 계층이 끝나면 트랜잭션을 커밋하고 플러시(Flush)합니다. 이때 영속성 컨텍스트는 종료하지 않고 유지합니다. 컨트롤러나 뷰까지 영속 상태가 유지되어 자유롭게 지연 로딩을 수행합니다. 요청이 끝나고 나가는 시점에 영속성 컨텍스트를 종료합니다.

results matching ""

    No results matching ""