작성
·
168
0
https://stackoverflow.com/questions/71129541/save-using-spring-data-jpa-and-find-using-jdbctemplate-within-same-transaction
공부하다 궁금한 점이 생겼습니다
부트에서 @Transactional 사용시 메서드 안에 jpa와 jdbc 템플릿을 혼용하여 사용했는데 위와 같은 문제 사항이 생겨서 해결가능한지 여쭙고 싶습니다.
뭔가 제 예상에는 jpa로 insert한것이 아직 커밋되지 않아 영속성 컨텍스트에 남아있는데 해당 로우를 jdbc를 사용해서 db에서 직접 접근하여 select해오려 해도 아직 영속성 컨텍스트에서 flush 도ㅣ지 않아서 저런 문제가 발생하는게 아닐까 생각은 하는데 정확히 모르겠습니다...
고수님들 제발 도와주세요!!!!!!!!!
답변 2
0
직접 테스트 한 블로그가 있어서 남깁니다
https://velog.io/@dusdn2424/Spring-JPA-%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98%EC%9D%80-%EC%A7%AC%EB%BD%95%EB%8F%84-%ED%95%B4%EC%A3%BC%EC%A7%80
그리고 jpa 쓰기 지연에 대한 flush 이슈를 언급하는 스택 오버 플로우 글 입니다
https://stackoverflow.com/questions/73024259/spring-jpa-jdbc-in-same-transaction
0
안녕하세요 hyeino3o 님, 인프런 AI 인턴이에요.
스프링 부트에서 @Transactional 어노테이션을 사용하여 메서드 안에서 JPA와 JDBC 템플릿을 혼용하여 사용할 때 발생하는 문제에 대해 궁금하신 것 같아요. 또한, 해당 문제와 관련된 스택오버플로우 질문 링크도 함께 공유해주셨네요.
스프링에서 @Transactional을 사용하면 트랜잭션 경계를 설정할 수 있으며, JPA와 JDBC 템플릿을 혼용해도 문제 없이 동작할 수 있습니다. 그러나 영속성 컨텍스트와 JDBC 템플릿 사이의 상호작용에서 문제가 발생할 수 있습니다.
예를 들어, JPA로 엔티티를 저장(Save)하면 영속성 컨텍스트에만 존재하고 아직 커밋되지 않은 상태입니다. 이때 JDBC를 사용하여 저장한 엔티티를 바로 조회(Select)하면 영속성 컨텍스트에서 조회 결과를 가져오지 않고 DB에서 직접 조회하게 됩니다. 따라서, 이런 경우 영속성 컨텍스트와 DB의 상태가 일치하지 않아 문제가 발생할 수 있습니다.
이 문제를 해결하기 위해서는 JPA의 Flush 작업을 수행하거나, 저장한 엔티티의 ID를 사용하여 별도로 조회를 해야 합니다. JPA의 Flush는 변경사항을 DB에 동기화하는 작업을 수행하며, 일반적으로 트랜잭션이 커밋되는 시점에서 자동으로 실행됩니다. 따라서, JPA로 저장한 데이터를 영속성 컨텍스트와 DB에서 모두 조회할 수 있게 됩니다.
위의 링크된 스택오버플로우 질문에도 비슷한 내용으로 답변이 있다고 하니 참고하시면 도움이 될 것입니다. 추가적인 궁금한 사항이 있으시면 언제든지 물어보세요. 감사합니다!
답변 감사합니다!!!!!!!!