티스토리 뷰

Spring

OSIV

soo__ 2022. 4. 24. 16:16

JPA에서는 Open EntityManager(=하이버네이트의 Session) In View

하이버네이트에서는 Open Session(=JPA의 EntityManager) In View 라고 불리우는 OSIV

 

`spring.jpa.open-in-view` 스프링에서는 기본값으로 true가 되어있다.

이처럼 애플리케이션 시작 시점에 warn 로그를 남긴다.

 

왜일까? OSIV 전략을 살펴보자.

최초 DB Connection 시작 시점(트랜젝션 시작 등)부터 API 응답이 끝날 때까지 영속성 컨텍스트와 DB Connection을 유지한다. 따라서 View Templete이나 API Controller 단에서도 (DB Connection이 유지되므로) 지연 로딩이 가능하다.

    * 지연 로딩 영속성 컨텍스트가 살아있어야 가능 영속성 컨텍스트는 DB Connection을 유지

이와 같은 장점이 있지만, warn 로그를 남기는 이유가 있다.

 

너무 오랜시간동안 DB Connection 리소스를 사용한다.

실시간 트래픽이 중요한 애플리케이션에서는 이 전략이 켜져있을 시 DB Connection이 말라버릴 수 있다. 만약 Controller에서 외부 API(푸쉬 전송과 같은)를 호출하면 외부 API 대기 시간만큼 DB Connection 리소스를 반환하지 않고 유지하기 때문이다.

 

OSIV를 false로 닫으면, 트랜잭션을 종료할 때 영속성 컨텍스트도 함께 닫고, DB Connection을 반환한다. DB Connection 리소스를 낭비하지 않을 수 있지만, 모든 지연 로딩을 트랜잭션 안에서 처리해야한다.

View Template에서 지연 로딩이 동작하지 않으므로, 트랜잭션 안에서 지연 로딩을 강제로 호출해야하며, 이는 코드 복잡성이 올라가는 결과로 이어질 수 있다.

 

 

OSIV를 끄고 서비스 계층에서만 트랜잭션을 유지하면서 복잡성을 관리하기 위해

Command와 Query를 분리하자

  • Command Service
    핵심 비즈니스 로직
  • Query ◻QueryService
    화면이나 API에 맞춘 서비스 (대체로 lifecycle이 짧고 변경이 잦은)(읽기 전용 트랜잭션)

 

공지사항
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31