flush()
- 영속성 컨텍스트의 변경 내용을 DB에 반영
- Transaction commit이 일어날 때 동작
- 지연 저장소에 있는 쿼리가 실행된다.
- 영속성 컨텍스트의 변경 내용을 DB에 동기화
- insert, update, delete 작업을 하고 flush()나 트랜잭션이 끝나지 전 까지는 변경된 내용을 DB에서 조회할 수 없다.
- 영속성 컨텍스트를 비우는 것이 아니고 저장된 쿼리를 실행하는 것
- JPQL 쿼리를 실행할 때는 flush()가 자동으로 호출
clear()
- 영속성 컨텍스트를 비운다.
- 그 전에 조회한 entity가 있으면 준영속 상태가 된다.
- 영속성 컨텍스트를 사용하려면 clear() 후 다시 조회해야한다.
- flush 전에 clear를 하면 DB에 변경사항이 저장되지 않는다.
@Test
public void flushTest() {
Post post = postRepository.findById(1L).get();
log.info("delete 전: "+post.getDeleted()); // false
post.delete();
Post post2 = postRepository.findById(1L).get();
log.info("clear 전: "+post2.getDeleted().toString()); // true
em.clear();
Post post3 = postRepository.findById(1L).get();
log.info("clear 후: "+post3.getDeleted().toString()); // false
}