[인프런][JPA2][섹션5] OSIV를 킬까 끌까?

mutexlocking·2022년 7월 22일
0

정리에 들어가기 앞서,
현재 나의 상태는 DB Transaction , DB Connection, 영속성 컨텍스트 에 대해서 완벽하게 이해한 상태가 아니다.

그러나 OSIV를 키거나 끔에 따라서 달라지는 것은 바로
위 DB Connection과 영속성 컨텍스트가 유효한 범위이다.

따라서 DB Transaction이나 DB Connectino이 어떤것인지에 대한 이해는 일단 나중으로 미루고 ,
지금은 OSIV를 키고 / 끔에 따라 - DB Connection과 영속성 컨텍스트의 유효 범위가 어떻게 달라지니 -> 그래서 개발자는 어떻게 행동해야 하는지에 대해 알아본다.
또한 어떨 때 OSIV를 켜야 하고 / 어떨 떄 OSIV를 꺼야 하는지도 알아보자.

[1. 먼저 Open Session In View 일명 OSIV란 ]

지금까지는 잘 인지하지 못했지만 , 항상 Spring을 다시 띄울 때 마다 Warnning이 났던 것이 이 OSIV 때문이었다.

그렇다면 OSIV란 도대체 무엇인가?
: JPA를 사용하면서 DB Connection를 언제까지 잡고 있고 영속성 컨텍스트를 언제 까지 살려둘지에 대한 옵션 이라고 생각할 수 있다.

[2. OSIV를 ON 하거나 OFF한다]

  • 일종의 옵션인 OSIV를 키면
    • DB Transaction이 끝나도 DB Connection을 잡고 있고 + 영속성 컨텍스트가 살아있게 된다.
    • 그리고 요청에 따른 Reponse가 나가기 전까지는 계속 DB Connection과 영속성 컨텍스트가 유지된다.
    • 따라서 Transaction이 끝나도 Controller 단에서 (API) 혹은 View 렌더링 시에 LAZY 로딩 등이 정상적으로 수행된다.
      (Lazy 로딩은 영속성 컨텍스트가 해주는 것이니깐.)
    • 실제로 우리가 지금까지 짠 코든 코드는 이 OSIV가 켜져있었기 때문에 정상적으로 Transaction 이 끝나도 LAZY 로딩이 정상 작동했던 것이다.
  • 반대로 OSIV를 끄면
    • DB Transaction이 끝나면 곧바로 DB Connection을 반환하고 + 영속성 컨텍스트도 사라진다.
    • 따라서 Transaction이 끝나면 영속성 컨텍스트를 활용한 LAZY 로딩같은게 정상적으로 수행되지 않고
    • 만약 이를 시도한다면 - 서버 에러가 터진다.
    • 즉 이 경우는 어떻게든 Lazy 로딩을 Transaction이 끝나기 전에 다 수행하던가
    • 혹은 Fetch Join 을 활발하게 써서 Transaction이 끝나기 전에 미리 다 조회해와야만 한다.

[3. 그렇다면 그냥 OSIV를 키면 되겠네?]

  • 라고 생각할 수 있지만, 애초에 DB Connection 이라는 것이 유한한 리소스 이고, 사용자 요청에 따른 DB 접근을 위해서는 - 이 DB Connection을 얻는것이 필수적인 모양이다.
  • 따라서 오히려 실시간 트래픽이 많은 서비스의 경우 , 함부로 OSIV를 켜놨다가 , 쓸데없이 DB Connection이 낭비된다면
    • 사용자가 요청한 순간에 사용 가능한 DB Connection을 얻지 못할 수 있고
    • 그러면 실제로 장애가 난다.
      (예를 들어 Controller가 또 외부 API를 호출하는데 , 그 처리 시간이 3초이면, 그 3초동안 Response가 못나가고 - DB Connection도 반환 못하는 것)

[4. 그래서 실제로 서비스를 운영할 때 OSIV를 어떻게 해야 하냐면]

  • 실시간 Traffic이 많은 서비스 운영시에는 반드시 OSIV를 꺼야 하고
  • 그렇지 않고 운영판과 같이 요청이 빈번하지 않은 경우네는 OSIV를 켜도 된다.

[5. 근데 그럼 OSIV가 꺼져있으면 어떻게 LAZY 로딩 같은 복잡성을 잘 관리하지?]

  • Command와 Query를 분리하는 방법을 권장한다 (강의에서..)

솔직히 이게 무슨 말인지 지금 이해가 가지는 않지만 , 다음의 의미라고 하신다..

  • 핵심 비지니스 로직은 잘 변하지 않고
  • API나 화면에 의존적인 결과를 내야하는 로직은 빈번하게 변하게 되니깐
    -> 같은 OrderService 라도 OrderService에는 핵심 비지니스 로직을 넣고
    -> OrderQueryService에는 화면이나 API에 종속적인 로직을 넣어서
    이 OrderQueryService에서 Transaction이 끝나지 않은 동안 마음껏 조회를 하라는 의미 (라고 생각한다......... 잘 모르겠다)

어쨌든 지금은 OSIV를 키고 / 끔에 따른 큰 흐름의 차이를 이해하는것에 중점을 두자.

profile
개발자가 되고자 try 하는중

0개의 댓글