seong

Spring의 OSIV 정책 본문

JPA

Spring의 OSIV 정책

hyeonseong 2022. 10. 24. 14:44

OSIV(Open-Session-in-View) 란?

Persistenct Context(영속성 컨텍스트)를 뷰까지 열어두는 기능이다.

영속성 컨텍스트가 유지되면 엔티티도 영속 상태로 유지된다.

뷰까지 영속성 컨텍스트가 살아있다면 뷰에서도 지연 로딩을 사용할 수가 있다.

이렇게 되면 DB연결이 View까지 되어서 View에서 내가 의도하지 않은 데이터를 불러오는 이상한 현상이 발생할 수도있다.

 

Open-Session-in-View : True 일 경우

1. 클라이언트의 요청이 들어오면 첫번째로 Filter를 거쳐서 들어온다. 

2. 필터를 거쳐서 들어온 요청은 DS로 가서 Controller로 가는데 Filter를 통해 들어오면 바로 DB가 연결이 된다 .

3. 그럼 이때부터 SELECT가 가능하다. 단 insert,update,delete는 트랜젝션 처리가 필요하므로 service에서 처리해준다 .

4. 전달되어 Service를 통과하면 바로 트랜젝션이 발동하게 된다. 그럼 이때 부터 CRUD가 모두 가능 하다.

5.그리고 모든 요청에 응답을 하면 DS를 다시 나갈때 DB커넥션은 닫히게 된다.즉, DB가 연결된 시간은 DS의 시작과 끝이다. 여기 까지가 Open-Session-in-View의 정책이다.

 

Open-Session-in-View 정책을 위배한다면? 

간단하게 DB연결의 생명 주기가 트랜젝션의 시작과 끝이된다. 즉, Service에서만 DB질의를 할 수 있게 된다.

이것이 Open-Session-in-View정책을 위배한 것이다.

아래 그림에서 빨간 박스가 Open-Session-in-View의 위배 정책했을 때의 PC의 생명주기이다. 

앞으로 JPA를 사용할땐 모두 Open-Session-in-View를 모두 False로 두고 Service에서 처리할 계획이다.