작성
·
51
0
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? 예
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예
3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예
[질문 내용]
jpa 특징은 "persist" 메서드 호출 시 바로 insert 쿼리를 날리는 게 아니라 트랜잭션을 커밋하기 직전 flush 가 발생해서 insert 쿼리 로그가 뒤에 찍힌다고 설명해주셨습니다.
(영상 기준 4:50 ~ 5:12)
저도 같은 테스트코드를 실행시켰으나 강의 영상과 다르게 중간에 insert 쿼리 로그가 남는 것을 확인했습니다.
영상 촬영시점보다 hibernate 버전이 업그레이드 되어 로그를 남기는 시점만 변경이 된 것일까요? 아니면 flush 시점 자체도 변경이 된 건가요?
답변 2
2
JPA 책을 보면서 학습하다보니 왜 쿼리 로그가 저 부분에 남았는지 알 것 같습니다.
현재 Member
클래스의 @Id
는 @GeneratedValue
로 설정이 되어 있어 id
값을 얻으려면 DB에 데이터를 추가해야 합니다.
영속성 컨텍스트에 영속화 된 객체는 @Id
값을 보유해야 하므로,
persist
호출 시점에 DB
에 쿼리를 날려서 id
값을 얻어 와야 하므로 쿼리 로그가 발생했던 것 같네요!
0
안녕하세요, 인프런 AI 인턴입니다. wjdwldud0601 님,
JPA의 flush 동작과 관련된 질문을 주셨군요. Hibernate 버전이 업그레이드됨에 따라 트랜잭션과 Flush 동작이 다르게 나타나는지를 문의하셨습니다. 이와 관련된 유사한 질문과 답변을 확인할 수 있는 몇 가지 링크를 공유합니다:
1. JPA Rollback과 Insert 쿼리 관련 질문:
이 답변에서는 Flush와 JPA의 동작 방식에 대해 상세히 설명하고 있습니다. JPQL 실행 시 flush가 발생하여 Insert 쿼리가 로그로 찍히는 이유를 알 수 있습니다.
이미지 설명이 포함되어 있으며, 문제가 발생하는 전 과정도 설명되어 있어 이해에 도움이 될 것입니다.
2. insert 쿼리는 로깅이 되지 않습니다. (수정 후 원인 파악):
이 질문에서는 Rollback 설정과 쿼리 로깅에 대해 다루고 있습니다. 쿼리가 로그에 남지 않는 경우에 대한 해결책으로 @Rollback(value = false)
어노테이션을 사용하는 방법을 설명합니다. 이 정보는 flush 동작에도 관련이 있습니다.
3. 플러시 동작과 트랜잭션 관련 질문:
해당 질문에서는 트랜잭션 롤백과 flush 시점에 관한 상세한 설명을 제공합니다. JPQL과 트랜잭션 커밋 전에 flush가 작동하는 방식에 대한 이해를 도울 수 있습니다.
질문하신 내용과 관련하여, Hibernate 버전 업그레이드로 인해 flush 동작이나 로그 시점이 변경될 가능성도 있지만, 보통 Hibernate의 주요 동작 원리가 크게 변하는 경우는 드뭅니다. 다만, 버전 상승에 따른 일부 설정이나 내부 처리 방식의 차이로 로그에 나타나는 시점의 차이가 있을 수 있습니다.
아래의 방법을 적용해 보시길 권장합니다:
1. JPQL 실행 여부 확인: 중간에 JPQL이 실행되었는지 확인해 보세요. JPQL이 실행되면 flush가 발생하게 됩니다.
2. Hibernate 버전 확인 및 문서 참고: 현재 사용 중인 Hibernate 버전의 문서를 참조하여 flush 및 트랜잭션 관련 변화가 있는지 확인합니다.
3. spring.jpa.show-sql 설정과 로깅 설정 확인: application.properties 또는 application.yml 파일에서 관련 로깅 설정이 올바르게 되어 있는지 확인합니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.