JPA 영속성 관리

유기훈·2025년 3월 4일

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(); // DB에 반영됨

비영속 상태와 다른 점

비영속 상태란

JPA가 한 번도 관리한 적 없는 객체

영속 상태로 만드는 방법

persist() 함수를 사용하면 된다.

User user = new User("Alice"); // 비영속 상태
em.persist(user); // 영속 상태로 변경됨
profile
개발 블로그

0개의 댓글