[DB] JPA flush

hyunoi·2024년 12월 26일

Database

목록 보기
8/8
post-thumbnail

영속성 컨텍스트


JPA Flush에 대해 알기 전에 영속성 컨텍스트에 대해 알아야 한다.

영속성 컨텍스트는 엔티티 객체를 관리하고 변경 사항을 추적하는 가상의 메모리 공간이다.
데이터베이스와 완전히 동기화되지 않는다.

Flush


위에서 설명한 데이터베이스와 동기화되지 않은 영속성 컨텍스트에 저장된 내용을 데이터베이스에 동기화하는 것이 JPA에서 하는 flush 작업이다.

flush는 영속성 컨텍스트에 누적된 변경 내용을 데이터베이스에 반영하여 일관성을 유지하도록 한다.

동작 원리

1. 변경 감지 (Dirty Checking)

JPA는 엔티티가 영속성 컨텍스트에 처음 저장될 때의 상태스냅샷으로 유지하는데,
영속성 컨텍스트에 저장된 엔티티와 스냅샷을 비교하여 변경된 내용을 찾는다.

Member member = em.find(Member.class, 1L);
member.setName("Updated Name");

이름을 새롭게 업데이트한 상황
영속성 컨텍스트는 변경된 내용인 이름을 찾는다.

2. SQL 생성

위에서 찾은 변경 사항에 따라 INSERT, UPDATE, DELETE와 같은 SQL문을 생성한 후 SQL 저장소에 등록한다.

UPDATE Member SET name = 'Updated Name' WHERE id = 1;

업데이트된 것을 인식했기 때문에 UPDATE 쿼리를 생성한다.

3. SQL 실행 준비

생성된 SQL은 데이터베이스로 전송하기 위해 대기한다.

Flush 방식

flush를 하는 방식에는 세 가지가 있다.

  1. em.flush()직접 호출하는 방식
  2. 트랜잭션 커밋 시에 자동으로 호출되는 방식
  3. JPQL 쿼리 실행 시에 자동으로 호출되는 방식

1. em.flush()를 직접 호출

EntityManager em = entityManagerFactory.createEntityManager();
em.flush();

명시적으로 호출하여 flush를 강제적으로 수행한다.
하지만 테스트나 다른 프레임워크와 JPA를 함께 사용할 때를 제외하고는 자주 사용되지 않는다.

2. 트랜잭션 커밋 시에 자동으로 호출

트랜잭션이 종료되기 전에 flush를 호출하여 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영한다.
JPA는 트랜잭션 종료 전에 flush 호출이 안 되는 경우를 예방하기 위해서 자동으로 호출한다.

3. JPQL 쿼리 실행 시에 자동으로 호출

Member member = em.find(Member.class, 1L);
member.setName("JPQL Flush");

// flush 발생
List<Member> members = em.createQuery("SELECT m FROM Member m", Member.class).getResultList();

JPQL 쿼리를 실행하기 전에 자동으로 flush가 발생해 일관된 데이터를 조회할 수 있도록 한다.

0개의 댓글