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 |