정리에 들어가기 앞서,
현재 나의 상태는 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를 키고 / 끔에 따른 큰 흐름의 차이를 이해하는것에 중점을 두자.