강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

조태준님의 프로필 이미지
조태준

작성한 질문수

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

OSIV와 성능 최적화

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

작성

·

22

0

이번 강의에서 영한님이 기본적으로 트랜잭션을 시작할 때 커넥션을 가져온다고 말씀해 주셨습니다.

 

주문 api 관련 내용에서는 바로 리포지토리를 참조하여 @Transactional 없이 사용했는데요

그럼 이런 경우는 커넥션을 어느 타이밍에 가져오나요?

답변 2

0

조태준님의 프로필 이미지
조태준
질문자

추가로 주문 api 강의들에서 트랜잭션 없이도 지연 로딩을 활용했는데요

해당 링크 속 질문글의 영한님 답변은 아래와 같습니다.

트랜잭션 범위 밖의 영속성 컨텍스트는 1회성 영속성 컨텍스트라 생각하시면 됩니다. 보통 단순 조회성으로 사용하고, 지연로딩, 더티 체킹이 안됩니다.

 

답변 내용대로면 지연 로딩이 안되는 게 맞는데 어떻게 가능했던 건가요?

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. 조태준님

스프링 부트의 경우에는 OSIV를 기본으로 활성화 합니다.

궁금하신 비밀이 이번에 들으시는 OSIV와 성능 최적화에서 자세히 이해하실 수 있을거에요 🙂

참고로 OSIV를 사용하지 않고, @Transactional을 사용하지 않는 경우에는 데이터를 조회하는 시점에 커넥션을 가져와서 사용합니다.

감사합니다.

조태준님의 프로필 이미지
조태준
질문자

답변 감사합니다.

 

OSIV가 활성화되어 있으면 트랜잭션 범위 밖에서도 영속성 컨텍스트와 db 커넥션이 유지되는 걸로 이해하고 있습니다.

 

해당 링크 속 영한님의 답변을 보면 트랜잭션 범위 밖에서는 지연 로딩이 안 된다고 말씀해주셨습니다.

근데 OrderApiController에서 따로 트랜잭션 없이 OrderRepository를 주입받고 사용하고 있는데도 주문 목록을 가져와서 상품을 꺼낼 때 지연 로딩이 되는 부분이 "트랜잭션 범위 밖에서는 지연 로딩이 안 된다"라는 부분과 상반되어서요..

 

이게 OSIV와 연관이 있나요? OSIV는 영속성 컨텍스트와 커넥션을 언제까지 유지하느냐 인데 트랜잭션이 필요한 지연 로딩이 작동되는 것이 잘 이해가 안됩니다.

0

안녕하세요, 인프런 AI 인턴입니다. 조태준님.

트랜잭션을 사용하지 않는 경우, 일반적으로 데이터베이스와의 첫 번째 상호작용이 필요할 때 커넥션을 가져옵니다. Spring과 JPA 환경에서는 트랜잭션이 없더라도 데이터베이스 연산이 실행될 때, 예를 들어 EntityManager를 통해 처음으로 데이터베이스에 접근할 때 커넥션을 획득하게 됩니다.

즉, find 메서드를 호출하거나 query를 실행하는 첫 시점에서 커넥션을 요청하고 사용하게 됩니다. 이러한 방식은 필요할 때만 커넥션을 사용하도록 설계되어 있기 때문에 자원의 효율성을 높이는데 도움이 됩니다.

관련하여 참고할 수 있는 주제로는 다음과 같은 URL들을 추천합니다:

이 링크는 커넥션의 반환과 획득 메커니즘을 더 잘 이해하는 데 도움이 될 것입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

조태준님의 프로필 이미지
조태준

작성한 질문수

질문하기