인프런 커뮤니티 질문&답변
트랜잭션을 사용 안 할 때 커넥션은 언제 가져오나요?
작성
·
43
0
이번 강의에서 영한님이 기본적으로 트랜잭션을 시작할 때 커넥션을 가져온다고 말씀해 주셨습니다.
주문 api 관련 내용에서는 바로 리포지토리를 참조하여 @Transactional 없이 사용했는데요
그럼 이런 경우는 커넥션을 어느 타이밍에 가져오나요?
답변 2
0
답변 감사합니다.
OSIV가 활성화되어 있으면 트랜잭션 범위 밖에서도 영속성 컨텍스트와 db 커넥션이 유지되는 걸로 이해하고 있습니다.
해당 링크 속 영한님의 답변을 보면 트랜잭션 범위 밖에서는 지연 로딩이 안 된다고 말씀해주셨습니다.
근데 OrderApiController에서 따로 트랜잭션 없이 OrderRepository를 주입받고 사용하고 있는데도 주문 목록을 가져와서 상품을 꺼낼 때 지연 로딩이 되는 부분이 "트랜잭션 범위 밖에서는 지연 로딩이 안 된다"라는 부분과 상반되어서요..
이게 OSIV와 연관이 있나요? OSIV는 영속성 컨텍스트와 커넥션을 언제까지 유지하느냐 인데 트랜잭션이 필요한 지연 로딩이 작동되는 것이 잘 이해가 안됩니다.
모 개발자분의 JPA 프로그래밍 책 13장. 웹 애플리케이션과 영속성 관리 부분을 읽고 완벽하게 이해했습니다. 흐흐
트랜잭션 당 영속성 컨텍스트의 경우 트랜잭션이 끝나면 영속성 컨텍스트도 종료가 되어 조회된 엔티티는 준영속 상태가 되므로 지연 로딩이 안되고,
스프링 OSIV를 사용할 경우 트랜잭션이 끝나도 영속성 컨텍스트는 열려있어서 트랜잭션 없이 읽기를 통해 지연 로딩이 가능한 거였네요
0
안녕하세요, 인프런 AI 인턴입니다. 조태준님.
트랜잭션을 사용하지 않는 경우, 일반적으로 데이터베이스와의 첫 번째 상호작용이 필요할 때 커넥션을 가져옵니다. Spring과 JPA 환경에서는 트랜잭션이 없더라도 데이터베이스 연산이 실행될 때, 예를 들어 EntityManager를 통해 처음으로 데이터베이스에 접근할 때 커넥션을 획득하게 됩니다.
즉, find 메서드를 호출하거나 query를 실행하는 첫 시점에서 커넥션을 요청하고 사용하게 됩니다. 이러한 방식은 필요할 때만 커넥션을 사용하도록 설계되어 있기 때문에 자원의 효율성을 높이는데 도움이 됩니다.
관련하여 참고할 수 있는 주제로는 다음과 같은 URL들을 추천합니다:
이 링크는 커넥션의 반환과 획득 메커니즘을 더 잘 이해하는 데 도움이 될 것입니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.






안녕하세요. 조태준님
스프링 부트의 경우에는 OSIV를 기본으로 활성화 합니다.
궁금하신 비밀이 이번에 들으시는 OSIV와 성능 최적화에서 자세히 이해하실 수 있을거에요 🙂
참고로 OSIV를 사용하지 않고, @Transactional을 사용하지 않는 경우에는 데이터를 조회하는 시점에 커넥션을 가져와서 사용합니다.
감사합니다.