본문 바로가기
JPA

Open Session in View

by 슈슈슉민 2024. 4. 25.

Open Session in View 패턴은 영속성 컨텍스트의 생존 범위를 HTTP 요청( Request) 범위로 한정하는 방식이다.

 

기본적으로 웹 애플리케이션에서는 요청 단위로 영속성 컨텍스트를 열고 닫는다. 하지만 이 방식에서는 *뷰 렌더링 과정에서 지연 로딩이 발생하면 예외가 발생할 수 있다. 왜냐하면 요청이 끝나면서 영속성 컨텍스트가 이미 닫혀있기 때문이다.

* 뷰 렌더링 과정 : 서버 측에서 HTML 페이지를 생성하는 과정

 

Open Session in View 패턴은 이러한 문제를 해결하기 위해 등장했다. 이 패턴을 사용하면 영속성 컨텍스트를 뷰 렌더링이 완료될 때까지 유지할 수 있다. 이를 통해 뷰 렌더링 중에도 지연 로딩이 가능해진다.

 

하지만 이 패턴은 주의해야 할 점이 있다.

 

  • 동시성 문제: 영속성 컨텍스트가 오래 유지되므로 동시성 문제가 발생할 수 있다.
  • 메모리 누수: 영속성 컨텍스트가 오래 유지되면서 메모리 누수가 발생할 수 있다.
  • 트랜잭션 분리 문제: 요청 범위를 넘어서 영속성 컨텍스트가 유지되므로 트랜잭션 격리 수준이 낮아질 수 있다.

따라서 Open Session in View 패턴은 지연 로딩 문제를 해결하는 대신 다른 문제를 야기할 수 있다. 이 패턴을 사용할 때는 애플리케이션의 특성과 요구사항을 고려하여 적절한 상황에서만 선별적으로 적용하는 것이 좋다.

결론적으로 Open Session in View 패턴은 영속성 컨텍스트의 생존 범위를 HTTP 요청(Request) 범위로 한정하면서도, 뷰 렌더링 시에는 영속성 컨텍스트를 계속 유지하는 방식이다.

 

OSIV 설정 값이 true일 때이다.

HTTP 요청(Request)의 시작부터 뷰 렌더링이 완료될 때까지로 연장된다.

 

OSIV 설정 값이 false 일 때이다.

영속성 컨텍스트 생존 기간은 http 응답까지 이다. 만약 뷰 렌더링 과정에서 지연 로딩이 발생하면 LazyInitializationException 예외가 발생할 수 있다.

 

비교
OSIV true OSIV false
1. HTTP 요청이 들어온다.

2. 영속성 컨텍스트가 생성되고 열린다.


3. 컨트롤러에서 엔티티를 조회하고 필요한 로직을 수행한다.


4. 컨트롤러에서 반환되면 HTTP 응답이 생성된다.


5. 이 시점에서는 영속성 컨텍스트가 아직 열려 있는 상태이다.


6. 뷰 렌더링 과정이 진행된다.


7. 뷰 렌더링이 완료되면 그 때 영속성 컨텍스트가 닫힌다.
1. HTTP 요청이 들어온다.

2. 영속성 컨텍스트가 생성되고 열린다.

3. 컨트롤러에서 엔티티를 조회하고 필요한 로직을 수행한다.

4. 컨트롤러에서 반환되면 HTTP 응답이 생성된다.

5. HTTP 응답이 완료되면 영속성 컨텍스트가 바로 닫힌다.

6. 뷰 렌더링 과정에서 지연 로딩이 발생하면 LazyInitializationException 예외가 발생할 수 있다.

'JPA' 카테고리의 다른 글

[QueryDsl] 대량으로 수정하기  (0) 2025.04.08
[QueryDsl] 동적 접근이란 무엇일까  (0) 2024.10.25
[Relation] mappedBy  (1) 2023.07.27