작성
·
299
·
수정됨
1
osiv가 뷰에서도 지연로딩이 가능하게 하려고 도입한거잖아요 (뷰에서 필요한값들을 지연로딩으로 가져오려고)
근데 지연로딩을 하면 결국 필요없는 쿼리가 추가로 나가게될텐데..애초에 필요한 데이터만 jpql사용해서 뽑아서 주면 문제가 해결되는거아닌가요? 왜osiv를 사용하는거죠?? 뷰와 리파지토리가 너무 연관되어서 그런가요..? 그게 그렇게 큰 단점인가요..?
뭔가 osiv의 장점이 엄청많아보이는데 제가 다른 분들 프로젝트를 봤을때는 osiv를 거의 적용안했던것같거든요... 왜 잘 안쓰이는걸까요...
답변 1
0
안녕하세요, 김민지 님. 공식 서포터즈 y2gcoder 입니다.
사람들이 OSIV를 잘 사용하지 않는 이유에 대해서 질문해주신 것으로 판단했습니다.
우선 말씀하신 것처럼 OSIV를 활성화했을 때는 컨트롤러, 뷰 템플릿까지 영속성 컨텍스트를 계속 살려놓습니다. 그래서 View 템플릿에서 엔티티 객체를 활용하여 지연로딩하는 것이 가능하기 때문에 연관관계에 있는 객체들을 필요할 때 지연로딩으로 부를 수 있는 편리한 기능이 존재합니다.
한편으로는 말씀하신 것처럼 실무에서는 OSIV를 비활성화하고 쓰는 경우가 많은 것 같습니다. 저도 보통 제가 만드는 프로젝트에서는 특별한 경우가 아니면 OSIV를 비활성화하고 시작하는 경우가 많습니다. 제 나름대로 생각해본 결과 이유는 크게 2가지가 있는 것 같습니다.
첫 번째로는 성능 저하가 발생할 수 있기 때문입니다. 보통 애플리케이션은 커넥션 풀을 활용해서 한정된 수의 DB 커넥션을 생성하고, 이를 이용해서 DB와 통신합니다. OSIV를 켜서 영속성 컨텍스트를 유지하는 범위를 늘리게 되면 그렇지 않은 경우보다 한 요청 당 DB 커넥션을 갖고 있는 시간이 길어집니다. 영속성 컨텍스트를 컨트롤러, 뷰 템플릿 까지 사용하기 위해 DB 커넥션을 더 오래 유지해야 하기 때문입니다. 한정된 DB 커넥션 수로 많은 요청들을 커버해야 하는 상황에서 OSIV 를 활성화 해놓으면 평균적으로 한 요청 당 DB 커넥션을 유지하는 시간이 OSIV를 비활성화했을 때보다 길 수 밖에 없고, 다음 요청을 위해 DB 커넥션을 다시 서버에서 회수하는데 더 오래 걸릴 수 있습니다. 이러한 상황에서 다음 요청은 DB 커넥션을 배당받기 전까지 대기해야 하고 그로 인해 성능 저하가 발생할 수 있습니다.
두 번째로는 굳이 영속성 컨텍스트를 그렇게 오래 유지할 필요가 없기 때문입니다. 김민지 님께서 앞서 말씀해주신 것처럼 연관관계의 객체까지 조회해야 한다면 fetch join을 하든, 서비스 단에서 미리 지연로딩해서 받아와서 컨트롤러 단에서 응답해주면 됩니다. 또한 엔티티를 그대로 응답 객체에 실어서 보내는 경우도 잘 없습니다. 그리고 결정적으로 요즘은 프론트엔드 단과 백엔드 단을 분리해서 개발하는 경우가 많습니다. 예를 들어 백엔드에서 Spring Boot로 만들어 Rest API JSON으로 응답해주고 프론트엔드는 React로 개발한다고 하면 이미 백엔드에서 JSON으로 응답해줄 때 결과에 필요한 모든 객체를 조회해서 넣어주어야 합니다.
김민지님의 질문을 듣고 크게 위의 두가지 이유로 인해 실무에서 OSIV를 비활성화하고 사용하지 않나 생각해보았습니다.
감사합니다.