본문 바로가기
JPA

jpa - 플러시, 준영속 상태

by 근즈리얼 2021. 10. 16.
728x90
플러시

jpa의 플러시에 대해서 알아보겠습니다.

 

플러시란

- 영속성 컨텍스트의 변경내용을 데이터베이스에 반영합니다.

 

플러시가 발생할 때

- 변경 감지

- 수정된 엔티티 쓰지 지연 SQL 저장소에 등록

- 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송 (등록, 수정, 삭제 쿼리)

 

영속성 컨텍스트를 플러시하는 방법

- em.flush() - 직접호출합니다.

- 트랜잭션 커밋 - 플러시를 자동 호출합니다.

- JPQL 쿼리 실행 - 플러시 자동 호출

Member member = new Member(200L, "memberA");
em.persist(member);

em.flush();

System.out.println("======짠======");

tx.commit();

 

위의 코드를 실행할 경우

위의 사진처럼 flush()를 실행할 때 쿼리문이 발생합니다.

 

플러시에서 주의해야할 것이 있습니다!!

  • 플러시를 하는 것이 영속성 컨텍스트를 비우는 것이 아닙니다.
  • 영속성 컨텍스트의 변경내용을 데이터베이스에 동기화합니다.
  • 트랜잭션이라는 작업 단위가 중요하고 커밋 직전에만 동기화를 하면 됩니다.

정리를 하자면 트랜잭션 작업 단위이전에만 플러시가 발생하면 되고

플러시가 발생한다는 것은 영속성 컨텍스트의 쓰기지연 sql 저장소의 내용만 데이터베이스에 적용될 뿐입니다.

즉, 영속성 컨텍스트의 내용이 사라지는 것은 아닙니다!!

 

준영속 상태

 

준영속 상태란

- 영속 -> 준영속

- 영속 상태의 엔티티가 영속성 컨텍스트에서 분리

- 영속성 컨텍스트가 제공하는 기능을 사용 못함

 

detach()를 사용

Member member = em.find(Member.class, 100L);
member.setName("asd");
            
em.detach(member);
            
System.out.println("======짠======");

tx.commit();

코드와 이미지를 보면 flush()와 더티체킹이 발생하기 전에 detach를 사용했습니다.

- 이는 영속성 컨텍스트를 더 이상 활용하지 못하게 되고 이에 따라 수정 쿼리는 발생하지 않았습니다.

 

정리를 하면

- em.detach(entity) : 특정 엔티티만 준영속 상태로 전환

- em.clear() : 영속성 컨텍스트를 완전히 초기화

- em.close() : 영속성 컨텍스트를 종료

 

이렇게 세가지로 준영속 상태로 만들 수 있습니다.

 

출처

https://www.inflearn.com/course/ORM-JPA-Basic

 

자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의

JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., 본 강의는 자바 백엔

www.inflearn.com

 

728x90