본문 바로가기

스터디/JPA

영속성 관리 - (2)

728x90
반응형

플러시


 

플러시를 통해 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영한다

 

플러시 호출 방법

1. 직접 호츨

  - flush() 메서드 직접 호출해 영속성 컨텍스트를 강제로 플러시

 

2. 트랜잭션 커밋 시 플러시 자동 호출

 

3. JPQL 쿼리 실행 전 플러시 자동 호출

  - JPQL 쿼리를 실행 하기 전 엔티티가 데이터베이스에 반영되어 있지 않으면 데이터가 없거나 잘못된 데이터를 가져올 수 있으므로 JPQL을 실행하기 전 자동으로 플러시가 호출된다

 

플러시 모드 옵션

  • FlushModeType.AUTO: 커밋이나 쿼리를 실행할 때 플러시 (default)
  • FlushModeType.COMMIT: 커밋할 때에만 플러시

플러시는 영속성 컨텍스트에 보관된 엔티티를 지우는 것이 아니라 영속성 컨텍스트와 데이터베이스를 동기화하는 것이다

 

준영속


 

엔티티가 영속성 컨텍스트에서 분리된 상태로 영속성 컨텍스트가 제공하는 기능을 사용할 수 없다

 

준영속 상태로 만드는 방법

  1. em.detach(entity)
    • 특정 엔티티만 준영속 상태로 전환한다
    • 영속성 컨텍스트에서 해당 엔티티를 관리하지 않는 상태이다
    • 1차 캐시, 쓰기 지연 SQL 저장소까지 해당 엔티티와 관련된 정보가 모두 제거된다
  2. em.clear()
    • 영속성 컨텍스트를 완전히 초기화한다
    • 해당 영속성 컨텍스트의 모든 엔티티를 준영속 상태로 만든다
  3. em.close()
    • 영속성 컨텍스트를 종료한다
    • 해당 영속성 컨텍스트의 모든 엔티티를 준영속 상태로 만든다

특징

  • 거의 비영속 상태에 가깝다
    • 영속성 컨텍스가 제공하는 어떠한 기능도 동작하지 않는다
  • 식별자 값을 가지고 있다
    • 한 번 영속 상태였으므로 식별자 값을 가지고 있다
  • 지연 로딩을 할 수 없다
    • 지연 로딩실제 객체 대신 프록시 객체를 로딩해두고 실제로 사용할 때 영속성 컨텍스트를 통해 데이터를 불러오는 방법이다
    • 영속성 컨텍스트가 해당 엔티티를 관리하지 않으므로 지연 로딩 시 문제가 발생한다

병합: merge()

준영속 상태의 엔티티를 다시 영속 상태로 변경하기 위해서는 병합을 사용하면 된다

 

동작 방식

1. merge()를 실행한다

2. 파라미터로 넘어온 준영속 엔티티의 식별차 값으로 1차 캐시에서 엔티티를 조회한다

3. 1차 캐시에 엔티티가 없다면 데이터베이스에서 엔티티를 조회해 1차 캐시에 저장한다

4. 조회한 영속 엔티티에 준영속 엔티티의 값을 채워 넣는다

 

병합을 통해 비영속 엔티티도 영속 상태로 만들 수 있다

  - 파라미터로 넘어온 엔티티의 식별자 값으로 1차 캐시와 데이터베이스에서 엔티티를 조회하지 못한 경우 새로운 엔티티를 생성해서 병합한다

728x90
반응형

'스터디 > JPA' 카테고리의 다른 글

엔티티 매핑 - (2)  (0) 2025.02.08
엔티티 매핑 - (1)  (0) 2025.02.08
영속성 관리 - (1)  (0) 2025.02.07
JPA란 무엇인가?  (1) 2025.02.06
JPA의 등장 배경  (0) 2025.02.06