본문 바로가기
Back-End/JPA

JPA) 과거 방식의 OSIV

by 어렵다어려웡 2022. 3. 13.

OSIV란?

 

영속성 컨텍스트를 View 계층까지 열어 둔다는 뜻이다.

 

영속성 컨텍스트가 살아 있다는 것은 엔티티가 영속상태로 유지된다는 것이며,

따라서, View 계층에서도 지연 로딩을 쓸수 있다는 것이다.

 

과거의 OSIV : 요청 당 트랜잭션

핵심은 View 계층에서 지연 로딩이 가능하다는 점이다.

 

과거의 OSIV는 클라이언트 요청이 들어오면 서블릿 필터 또는 스프링 인터셉터에서 

트랜잭션을 시작하고 요청이 끝날 때 트랜잭션을 종료하는 것이다.

 

 

영속성 컨텍스트와 트랜잭션의 범위가 같기 때문에 조회한 엔티티도 View에서 영속상태를 유지하고

지연 로딩 또한 가능하므로 Entity를 미리 초기화할 필요가 없다.

 

 문제점.

* Presentation 계층에서 Entity의 변경이 이루어질 수 있다.

특정 화면에서 DB의 정보를 보여주는 게 아니라 임의의 데이터로 변경해서 보여주려 할 경우

Presentation 계층에서 데이터를 변경하는 코드가 들어가게 된다.

 

따라서, 트랜잭션 및 영속성 컨텍스트가 살아있는 계층이기 때문에 요청이 종료 될 때

영속성 컨텍스트에서 Flush 가 일어나 DB에 반영되고 Commit 이 이루어진다.

 

 해결 방안

Presentation 계층에서 Entity의 수정을 막기 위한 방법은 3가지 이다.

1) Entity를 읽기 전용 인터페이스로 제공

2) Entity Wrapping

3) DTO만 반환하기

 

지금까지 설명한 방법은 모두 코드량이 증가한다는 단점이 있다.

차라리 Presentation 에서 엔티티를 수정하면 안된다는 합의를 하는 것이 실용적일 수 있다.

 

적절한 도구를 사용해 Presentation 계층에서 변경코드를 잡아내는것도 방법이 될 수 있지만 쉽지않다.

 

지금 까지는 요청 당 트랜잭션 OSIV 인데,

최근에는 거의 사용하지 않는 방법이며 이러한 문제점을 보완해서

 

비즈니스 계층에서만 트랜잭션을 유지하는 방식의 OSIV 를 사용한다.

스프링 프레임워크가 이 방식을 사용한다.

 

 

 

'Back-End > JPA' 카테고리의 다른 글

JPA) Join Fetch, @EntityGraph 차이점  (0) 2022.03.24
JPA) Spring OSIV  (0) 2022.03.14
JPA) 값 타입 컬렉션 vs @OneToMany  (0) 2022.03.12
JPA) 객체지향 쿼리  (0) 2022.03.12
JPA) 영속성 전이  (0) 2022.03.12