플러시란?
- 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영하는 과정
- 즉, 영속성 컨텍스트에 쌓인 변경된 엔티티들을 실제 DB에 반영
영속성 컨텍스트 내에서 엔티티가 변경되거나 삭제된 상태는 DB에 바로 반영되지 않고, 쓰기 지연 저장소에 쌓이게 됩니다. 그리고 트랜잭션이 커밋되거나, flush() 메서드가 호출될 때 DB에 쿼리가 반영됩니다.

transaction.commit()호출 시 flush()자동 호출
transaction.commit()이 호출되면 flush() ,commit() 순서대로 호출
플러시 발생 과정
1. 변경 감지(Dirty Checking)
영속성 컨텍스트는 트랜잭션 중에 엔티티 객체의 상태를 추적합니다. 엔티티가 변경된 상태인지를 감지하려면 JPA는 변경 감지(Dirty Checking)를 수행합니다.
- 변경 감지는 엔티티가 최초 로드된 상태(스냅샷)와 현재 상태를 비교하여, 어떤 필드가 변경되었는지 알아냅니다.
2. 수정된 엔티티들을 쓰기 지연 SQL 저장소에 등록
변경된 엔티티는 쓰기 지연 저장소에 쌓입니다. 이 저장소는 실제로 DB에 쿼리를 보내기 전에 SQL 쿼리를 모아놓는 일종의 큐 역할을 합니다.
- 쓰기 지연 저장소에는 insert, update, delete SQL 문들이 쌓입니다.
- 예를 들어, 엔티티의 필드를 수정하면 UPDATE 쿼리가, 새로운 엔티티를 추가하면 INSERT 쿼리가 쓰기 지연 저장소에 저장됩니다.
3. 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송
flush()가 호출되면, 쓰기 지연 저장소에 쌓였던 SQL 쿼리들을 실제로 DB에 전송합니다. 이 시점에서 DB와 영속성 컨텍스트의 상태가 동기화됩니다.
- insert, update, delete 쿼리들이 배치(batch) 처리되거나 순차적으로 DB에 반영됩니다.
- DB에 쿼리가 전송되고, 그 결과로 실제 데이터베이스에 변경 사항이 반영됩니다.

플러시는!
- 영속성 컨텍스트를 비우지 않음
- 영속성 컨텍스트의 변경내용을 데이터베이스에 동기화
flush()와 commit()의 차이
항목
|
flush()
|
commit()
|
역할
|
영속성 컨텍스트에 저장된 변경 사항을 DB에 반영
|
트랜잭션을 종료하고, 모든 변경 사항을 영구적으로 DB에 반영
|
트랜잭션 종료
|
트랜잭션을 종료하지 않음, rollback가능
|
트랜잭션 종료, 변경 사항 확정, rollback 불가
|
영향
|
DB에 반영되지만 트랜잭션은 계속 진행됨
|
DB에 반영된 후 트랜잭션이 종료됨
|
정리
- flush()는 쓰기 지연 저장소에 있는 데이터를 DB에 즉시 반영하여 영속성 컨텍스트와 데이터베이스의 동기화를 유지합니다. 그러나 트랜잭션이 종료되지는 않으며, 아직 rollback이 가능합니다.
- commit()은 트랜잭션을 완전히 종료시키고, 트랜잭션 내 모든 작업을 DB에 영구적으로 반영합니다. rollback은 불가능합니다.
'Spring, JPA 🌱 > 김영한 JPA' 카테고리의 다른 글
[김영한 JPA] 준영속 상태 (detached) (0) | 2025.02.07 |
---|---|
[김영한 JPA] 영속성 컨텍스트(Pesistence Context)의 이점 (0) | 2025.02.07 |
[김영한 JPA] 영속성 컨텍스트 (Persistence Context) (1) | 2025.02.07 |
[김영한 JPA] JPA 구동 방식 (0) | 2025.02.07 |
플러시란?
- 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영하는 과정
- 즉, 영속성 컨텍스트에 쌓인 변경된 엔티티들을 실제 DB에 반영
영속성 컨텍스트 내에서 엔티티가 변경되거나 삭제된 상태는 DB에 바로 반영되지 않고, 쓰기 지연 저장소에 쌓이게 됩니다. 그리고 트랜잭션이 커밋되거나, flush() 메서드가 호출될 때 DB에 쿼리가 반영됩니다.

transaction.commit()호출 시 flush()자동 호출
transaction.commit()이 호출되면 flush() ,commit() 순서대로 호출
플러시 발생 과정
1. 변경 감지(Dirty Checking)
영속성 컨텍스트는 트랜잭션 중에 엔티티 객체의 상태를 추적합니다. 엔티티가 변경된 상태인지를 감지하려면 JPA는 변경 감지(Dirty Checking)를 수행합니다.
- 변경 감지는 엔티티가 최초 로드된 상태(스냅샷)와 현재 상태를 비교하여, 어떤 필드가 변경되었는지 알아냅니다.
2. 수정된 엔티티들을 쓰기 지연 SQL 저장소에 등록
변경된 엔티티는 쓰기 지연 저장소에 쌓입니다. 이 저장소는 실제로 DB에 쿼리를 보내기 전에 SQL 쿼리를 모아놓는 일종의 큐 역할을 합니다.
- 쓰기 지연 저장소에는 insert, update, delete SQL 문들이 쌓입니다.
- 예를 들어, 엔티티의 필드를 수정하면 UPDATE 쿼리가, 새로운 엔티티를 추가하면 INSERT 쿼리가 쓰기 지연 저장소에 저장됩니다.
3. 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송
flush()가 호출되면, 쓰기 지연 저장소에 쌓였던 SQL 쿼리들을 실제로 DB에 전송합니다. 이 시점에서 DB와 영속성 컨텍스트의 상태가 동기화됩니다.
- insert, update, delete 쿼리들이 배치(batch) 처리되거나 순차적으로 DB에 반영됩니다.
- DB에 쿼리가 전송되고, 그 결과로 실제 데이터베이스에 변경 사항이 반영됩니다.

플러시는!
- 영속성 컨텍스트를 비우지 않음
- 영속성 컨텍스트의 변경내용을 데이터베이스에 동기화
flush()와 commit()의 차이
항목
|
flush()
|
commit()
|
역할
|
영속성 컨텍스트에 저장된 변경 사항을 DB에 반영
|
트랜잭션을 종료하고, 모든 변경 사항을 영구적으로 DB에 반영
|
트랜잭션 종료
|
트랜잭션을 종료하지 않음, rollback가능
|
트랜잭션 종료, 변경 사항 확정, rollback 불가
|
영향
|
DB에 반영되지만 트랜잭션은 계속 진행됨
|
DB에 반영된 후 트랜잭션이 종료됨
|
정리
- flush()는 쓰기 지연 저장소에 있는 데이터를 DB에 즉시 반영하여 영속성 컨텍스트와 데이터베이스의 동기화를 유지합니다. 그러나 트랜잭션이 종료되지는 않으며, 아직 rollback이 가능합니다.
- commit()은 트랜잭션을 완전히 종료시키고, 트랜잭션 내 모든 작업을 DB에 영구적으로 반영합니다. rollback은 불가능합니다.
'Spring, JPA 🌱 > 김영한 JPA' 카테고리의 다른 글
[김영한 JPA] 준영속 상태 (detached) (0) | 2025.02.07 |
---|---|
[김영한 JPA] 영속성 컨텍스트(Pesistence Context)의 이점 (0) | 2025.02.07 |
[김영한 JPA] 영속성 컨텍스트 (Persistence Context) (1) | 2025.02.07 |
[김영한 JPA] JPA 구동 방식 (0) | 2025.02.07 |