해결된 질문
작성
·
366
0
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.
1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)
질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)
[질문 내용]
1. 스프링 데이터 JPA 가 지원하는 save를 호출하면 flush()가 나가는건가요 아니면 save를 하고 bulkAgePlus()를 호출하면서 bulkAgePlus() 에 있는 JQPL이 실행되서 flush() 가 나가는건가요 ?
bulkAgePlus()를 실행하면 JPQL 실행이되고, JPQL 이 실행이 되면 flush() 가 호출이 되는데 이때 SQL쿼리문이 DB에 전송이대서 DB에는 업데이트가 되어있지만 영속성 컨텍스트는 업데이트가 안되기 때문에 clear()를 해주는게 맞는건가요 ?
답변 1
2
안녕하세요. 최재영님
스프링 데이터 JPA와 관련된 작업 흐름을 이해하는 것은 중요합니다. 여기서 언급된 save()
와 bulkAgePlus()
메서드의 동작과 관련하여 JPA의 동작 방식을 설명하겠습니다.
1. save() 메서드 호출 시의 플러시 동작: 스프링 데이터 JPA의 save()
메서드를 호출할 때, 일반적으로는 즉시 flush()
가 발생하지 않습니다. save()
메서드는 주로 엔티티를 영속성 컨텍스트에 저장하는 데 사용되며, 이후 트랜잭션이 커밋되거나 명시적으로 flush()
를 호출할 때까지 데이터베이스에는 반영되지 않습니다.
2. bulkAgePlus()와 JPQL의 실행: bulkAgePlus()
내에서 JPQL(JPA Query Language)을 사용하는 벌크 연산을 실행하면, JPA는 이를 데이터베이스에 즉시 반영하기 위해 flush()
를 호출합니다. 이는 벌크 연산이 영속성 컨텍스트를 무시하고 직접 데이터베이스에 적용되기 때문입니다.
3. 영속성 컨텍스트와 clear()
의 필요성: 벌크 연산 후 clear()
를 호출하는 것은 영속성 컨텍스트와 데이터베이스 간의 일관성을 유지하기 위해 중요합니다. 벌크 연산은 영속성 컨텍스트에 있는 엔티티 상태를 업데이트하지 않으므로, 데이터베이스에는 변경 사항이 반영되어 있지만 영속성 컨텍스트는 그 변경 사항을 모르는 상태가 됩니다. 따라서 clear()
를 호출하여 영속성 컨텍스트를 초기화하고 필요한 경우 다시 로드해야 일관성을 유지할 수 있습니다.
결론적으로, save()
를 호출한 후 bulkAgePlus()
를 호출하면, bulkAgePlus()
내부에서 실행되는 JPQL이 flush()
를 발생시키고, 벌크 연산 후 영속성 컨텍스트의 상태가 데이터베이스와 동기화되지 않으므로 clear()
를 호출하는 것이 적절합니다.
감사합니다.
제가 예상했던게 헷갈려서 의구심이 생겼는데 이제 확실히 이해했습니다!