JPA

OSIV란?

Junuuu 2022. 8. 16. 00:01
728x90

미리 알고 있어야 하는 개념

- 영속성 콘텍스트

- 지연 로딩

- DB Connection

 

OSIV란?

Open Session In View의 약자로 하이버네이트에서 사용하는 단어입니다.

JPA에서는 Open EntityManager In View가 정식 명칭이지만 관례상 OSIV라고 합니다.

 

OSIV는 영속성 콘텍스트의 생존 범위를 지정하는 것입니다.

 

spring.jpa.open-in-view : true

 

위의 설정을 하면 커넥션 시작부터 API 응답이 끝날 때까지 영속성 콘텍스트가 유지됩니다.

 

이때 Controller에서도 지연 로딩을 사용할 수 있습니다.

하지만 DB Connection을 오랫동안 사용하기 때문에 실시간 트래픽이 몰리면 커넥션이 부족해질 수 있습니다.

(DB Connection Pool 에는 커넥션의 수가 정해져 있기 때문에 오래 쓸수록 부족해질 수밖에 없음)

 

 

spring.jpa.open-in-view : false

 

트랜잭션이 종료될 때 영속성 콘텍스트를 닫고 DB 커넥션도 반환합니다.

커넥션을 오래 사용하지 않기 때문에 자원적으로 이득이 있지만 모든 지연 로딩을 트랜잭션 안에서 처리해야 합니다.

 

 

OSIV 설정을 사용하는 이유

리소스 낭비와 레이지 로딩을 어디까지 잡아야 할지 적절하게 선택해야 합니다.

OSIV 설정을 true로 하게 되면 리소스낭비가 발생하게 됩니다.

OSIV 설정을 false로 하게되면 LazyIntializationException이 발생할 수 있으며 Controller 단에서 Lazy Loading 된 Entity를 사용할 수 없습니다.

 

 

OSIV 설정을 하지 않는 방법(뷰가 필요한 엔티티를 미리 로딩해두는 방법)

1. JPQL로 페치 조인 사용 (페치 조인 자체가 연관된 엔티티를 함께 조회함 )

2. 영속성 콘텍스트가 살아있을 때 Controller에서 필요한 엔티티를 강제로 초기화해서 반환

 

하지만 실수의 가능성이 높음 -> OSIV 설정 등장

 

OSIV의 주의사항

단순 조회의 경우에는 트랜잭션 없어도 조회만 할 수 있습니다.

수정은 트랜잭션이 있는 계층에서만 동작하기 때문에 Controller 계층에서 엔티티를 수정해도 수정 내용을 DB에 반영하지 않습니다.

 

하지만 Controller 계층에서 엔티티를 수정한 직후에 트랜잭션을 시작하는 서비스 계층을 호출하면 문제가 발생합니다.

트랜잭션이 끝날 때 변경 감지가 동작하여 수정 부분이 DB에 반영되어 버립니다.

 

 

 

출처

https://ttl-blog.tistory.com/183

 

[JPA] OSIV란? (feat. 스프링 JPA의 작동원리, 퍼사드 패턴 등)

OSIV에 다가가기까지 조금 서론이 길다. (JPA의 작동원리, FACADE 계층 등) OSIV에 대해서만 궁금하다면 그쪽 부분만 찾아서 보길 바란다. 스프링에서 JPA를 사용하게 되면, 스프링 컨테이너가 트랜잭

ttl-blog.tistory.com