flush
flush 란
영속성 컨텍스트의 변경내용을 데이터베이스에 반영 하는 것
flush 발생 하는 상황
- 커밋되는 시점에 변경 감지, 쓰기 지연으로 쿼리(등록, 수정, 삭제)가 나가는 경우
flush가 사용 되는 경우
- em.flush() - 직접 호출. 사용자가 직접 호출하는 경우를 말함
- 트랜잭션 커밋 - 플러시 자동 호출
- JPQL 쿼리 실행 - 플러시 자동 호출. JPQL은 DB에서 읽어오기 때문에 영속성 컨텍스트의 변경내용을 DB에 반영해줘야 함.
준영속
준영속 상태란
영속성 컨텍스트에 저장되었다가 분리된 상태
준영속 상태로 만드는 이유
- 메모리 관리 & 성능 최적화: 영속성 컨텍스트(1차 캐시)에 엔티티가 계속 남아 있으면 메모리 사용량 증가
- 데이터 변경 감지 방지(Dirty Checking 막기): 더티 체킹을 의도적으로 막고 싶을 때 사용
- 롤백 시 데이터 보호: 트랜잭션을 롤백할 때도 영속 상태이면 변경 사항이 사라지지만, 준영속 상태라면 데이터를 유지할 수 있음.
영속 상태로 다시 만드는 방법
merge() 함수를 사용하면 된다.
User user = em.find(User.class, 1L);
em.detach(user);
user.setName("New Name");
User mergedUser = em.merge(user);
em.flush();
비영속 상태와 다른 점
비영속 상태란
JPA가 한 번도 관리한 적 없는 객체
영속 상태로 만드는 방법
persist() 함수를 사용하면 된다.
User user = new User("Alice");
em.persist(user);