inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화

주문 조회 V4: JPA에서 DTO 직접 조회

osiv관련 질문

376

김민지

작성한 질문수 112

1

  1. osiv가 뷰에서도 지연로딩이 가능하게 하려고 도입한거잖아요 (뷰에서 필요한값들을 지연로딩으로 가져오려고)

    근데 지연로딩을 하면 결국 필요없는 쿼리가 추가로 나가게될텐데..애초에 필요한 데이터만 jpql사용해서 뽑아서 주면 문제가 해결되는거아닌가요? 왜osiv를 사용하는거죠?? 뷰와 리파지토리가 너무 연관되어서 그런가요..? 그게 그렇게 큰 단점인가요..?

    뭔가 osiv의 장점이 엄청많아보이는데 제가 다른 분들 프로젝트를 봤을때는 osiv를 거의 적용안했던것같거든요... 왜 잘 안쓰이는걸까요...

java spring spring-boot jpa

답변 1

0

y2gcoder

안녕하세요, 김민지 님. 공식 서포터즈 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를 비활성화하고 사용하지 않나 생각해보았습니다.

감사합니다.

강의 관련 외 질문입니다.

0

68

2

SpringBoot4 + Hibernate7 모듈 등록 방법 공유

0

92

1

BeanCreationException

0

91

3

Update 후 UpdateMemberResponse 매핑할 때

0

50

1

트랜잭션을 사용 안 할 때 커넥션은 언제 가져오나요?

0

101

2

페이징 + 검색조건 관련해서 질문드립니다.

0

70

1

Query Dsl Q파일 질문입니다.

0

84

1

루트 쿼리라는것은

0

60

1

메서드를 분리하는 기준

0

64

1

findAllWithMemberDelivery 메서드 질문드립니다.

0

110

3

연관관계 매핑을 안 쓸 경우, 사용해야 하는 전략

0

86

2

fetch join과 영속화와 OSIV의 관계

0

87

2

Distinct 사용 전 결과에 대한 의문

0

116

2

레포지토리 계층에서의 트랜잭션에 대한 의문

0

59

1

영속성 컨텍스트 생명주기의 신기한 부분이 있습니다.

0

78

2

dto 필드 속 엔티티 여부

0

60

1

뷰템플릿 사용 시

0

77

2

Result 클래스 관련 질문

0

56

1

@PostConstruct 프록시 관련 질문드립니다

0

86

1

DTO 대신 Form 사용은 안되나요?

0

138

1

OSIV ON 상태일 때

0

96

1

fetch join VS fetch join 페이징 궁금증

0

185

2

양방향 연관관계 알아보는 법?

0

106

1

16강 17강 간단 정리 이게 맞을까요 ?

0

165

2