본문 바로가기
  • 주니어 개발자의
    RESTful 성장기
Web/JPA

3-3. Flush와 준영속

by 돌건 2021. 6. 7.

1. Flush

플러시는 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영하는 것을 말한다. (영속성 컨텍스트에 보관된 엔티티를 지우는 것이 아님)

 

* 플러시 실행 과정

1. 변경 감지가 동작, 영속성 컨텍스트에 있는 모든 Entity 스냅샷과 비교해 수정된 Entity를 찾는다. 수정된 Entity는 수정 쿼리를 만들어 쓰기 지연 SQL 저장소에 등록한다.
2. 쓰기 지연 SQL 저장소의 쿼리를 DB에 전송한다.

 

* 플러시 방법 

1. em.flush()를 직접 호출
테스트나 다른 프레임워크와 JPA를 함께 사용할 때를 제외하고 거의 사용하지 않음.

2. 트랜잭션 커밋 시 플러시 자동 호출
DB에 변경 내용을 SQL로 전달하지 않고 트랜잭션만 커밋하면 어떤 데이터도 DB에 반영되지 않는다. 그렇기에 트랜잭션을 커밋하기 전에 반드시 플러시를 호출해 영속성 컨텍스트의 변경 내용을 DB에 반영해야 한다. 따라서 JPA는 트랜잭션 커밋 시 플러시를 자동으로 호출한다.

3. JPQL 쿼리 실행시 플러시 자동 호출
영속성 컨텍스트에서 관리되나 아직 DB에 반영되지 않은 엔티티들이 존재할 때, JPQL을 실행해 해당 엔티티를 조회하고자 하면 조회되지 않는다. 따라서, 이런 문제를 예방하기 위해 JPQL을 실행할 때도 플러시가 자동으로 호출된다.

 

* 플러시 옵션

FlushModeType.AUTO - 커밋, 쿼리 실행 시 플러시 (기본값)
FlushModeType.COMMIT - 커밋 시에만 플러시 (성능 최적화를 위해 사용)

 

2. 준영속

영속 상태의 엔티티가 영속성 컨텍스트에서 분리된(detached) 상태를 말한다. 준영속 상태의 엔티티는 영속성 컨텍스트가 제공하는 기능을 사용할 수 없다.

 

* 준영속 상태로 만드는 방법

1. em.detach(entity) - 특정 엔티티를 준영속 상태로 만든다.
호출되면 1차 캐시에서 제거된 후 쓰기 지연 SQL 저장소에 있는 해당 엔티티를 관리하기 위한 모든 정보가 제거된다.

2. em.clear() - 영속성 컨텍스트를 초기화한다.
영속성 컨텍스트를 초기화해 해당 영속성 컨텍스트에서 관리하는 모든 엔티티를 준영속 상태로 만든다.
영속성 컨텍스트를 제거하고 새로 만드는 것과 동일하게 볼 수 있다.

3. em.close() - 영속성 컨텍스트를 종료한다.
영속성 컨텍스트를 종료함으로써 해당 영속성 컨텍스트가 관리하던 영속 상태 엔티티를 모두 준영속 상태로 만든다.
영속 상태의 엔티티는 영속성 컨텍스트가 종료될 때 준영속 상태가 되며, 개발자가 직접 준영속 상태로 만드는 일은 드물다.

 

* 준영속 특징

1. 영속성 컨텍스트가 제공하는 기능을 사용할 수 없게 된다.
2. 비영속 상태와는 다르게 식별자 값을 지니고 있다. 한 번 영속 상태가 됐었으므로 식별자 값을 가지고 있다.
3. 1차 캐시에서 제거되어 지연 로딩을 할 수 없게 된다.

 

* 병합 (Merge)

준영속 상태의 엔티티를 다시 영속 상태로 변경하기 위해 사용된다. merge()는 준영속 상태의 엔티티를 전달 받아 그 정보로 새로운 영속 상태의 엔티티를 반환한다.

1. merge() 실행.
2. 전달받은 준영속 상태의 엔티티의 식별자 값으로 1차 캐시에서 엔티티를 조회, 존재하지 않는다면 DB에서 엔티티를 조회해 1차 캐시에 저장.
3. 조회한 영속 엔티티에 전달 받은 엔티티의 값을 채워 넣음.
4. 위 과정을 통해 새롭게 생성된 엔티티를 반환한다.

📌 전달 인자로 사용된 준영속 상태의 엔티티는 더이상 사용할 수 없게 된다. 따라서, 준영속 상태의 엔티티를 참조하던 변수를 새롭게 반환된 영속 상태의 엔티티를 참조하도록 변경해주는 것이 안전하다.

📌 merge는 비영속 상태의 엔티티도 영속 상태로 만든다. DB에서 조회한 후, 존재하지 않으면 새로 엔티티를 생성해서 병합한다. 즉, Save or Update 기능을 수행한다.

 

 

참고 문헌: 자바 ORM 표준 JPA 프로그래밍 (김영한 지음)

'Web > JPA' 카테고리의 다른 글

4-2. Entity 매핑 (2)  (0) 2021.06.11
4-1. Entity 매핑 (1)  (0) 2021.06.09
3-2. 영속성 컨텍스트의 특징  (0) 2021.05.31
3-1. 영속성 컨텍스트와 Entity 생명주기  (0) 2021.05.26
2. JPA 설정 및 어플리케이션 개발  (0) 2021.05.24

댓글