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

홍찬의님의 프로필 이미지
홍찬의

작성한 질문수

스프링 DB 2편 - 데이터 접근 활용 기술

정리

테스트에서 JPA의 경우 커밋되는 시점에 DB에 반영되기 때문에 jpql이 로그에 남지 않는 것에 관하여 질문드립니다.

작성

·

483

0

jpa의 update 쿼리는 @commit을 붙이지 않으면 jpql이 남지 않는 것으로 배웠습니다.

 

그런데 "다양한 데이터 접근 기술 조합" 강의의 '주의점'에서 jpa는 기본적으로 트랜잭션 커밋되는 시점에 반영한다고 합니다.

 

그러면 save도 insert jpql이 로그에 남지 않아야 하는 것 아닌가요? 왜 insert의 경우 jpql이 남는 것지 궁금합니다! 위 사진은 save 테스트 메서드를 했을 때 남는 로그입니다.

 

 

 

 

답변 3

0

홍찬의님의 프로필 이미지
홍찬의
질문자

명확한 답변 감사합니다~

0

안녕하세요, 홍찬의 님! 공식 서포터즈 codesweaver 입니다.

AI 답변에 더하면,

save() 부분은 데이터베이스에 입력해야지만 ID를 알 수 있기에 쿼리를 강제로 실행합니다 :)

업데이트와 관련한 부분은 최대한 늦게 쿼리를 날리기 위해 쿼리 저장소에 보관하게 되는데, @Commit 처럼 강제로 반영하도록 설정하지 않았다면 실제 쿼리가 날아가지 않습니다.

감사합니다.

0

안녕하세요, 인프런 AI 인턴이에요.

JPA의 경우 트랜잭션이 커밋되는 시점에 DB에 반영되기 때문에 jpql이 로그에 남지 않을 수 있습니다. 그러나, save 메서드의 경우 JPA가 새로운 객체를 DB에 추가하기 위해 사용하는 INSERT 쿼리가 로그에 남는 것은 맞습니다.

이는 save 메서드가 신규 객체를 DB에 추가하기 위한 JPQL 쿼리를 생성하기 때문입니다. 따라서 INSERT 쿼리는 로그에 남게 됩니다.

반면 update 메서드는 이미 DB에 존재하는 객체의 값을 변경하기 때문에 JPQL 쿼리가 생성되지 않아 로그에 남지 않습니다. 이를 방지하기 위해 @commit을 붙이면 JPQL 쿼리와 함께 로그에 남길 수 있습니다.

이상이 이번 질문에 대한 답변입니다. 더 궁금하신 점이 있으시다면 언제든지 댓글로 질문해주세요. 감사합니다.

홍찬의님의 프로필 이미지
홍찬의

작성한 질문수

질문하기