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

최재영님의 프로필 이미지

작성한 질문수

실전! 스프링 데이터 JPA

벌크성 수정 쿼리

flush() 와 clear()

해결된 질문

작성

·

363

0

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.

1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)

질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)

[질문 내용]
1. 스프링 데이터 JPA 가 지원하는 save를 호출하면 flush()가 나가는건가요 아니면 save를 하고 bulkAgePlus()를 호출하면서 bulkAgePlus() 에 있는 JQPL이 실행되서 flush() 가 나가는건가요 ?

 

  1. 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()를 호출하는 것이 적절합니다.

감사합니다.

최재영님의 프로필 이미지
최재영
질문자

제가 예상했던게 헷갈려서 의구심이 생겼는데 이제 확실히 이해했습니다!