If at first you don't succeed, try again

[JPA] Flush와 Commit의 차이 본문

Java/JPA

[JPA] Flush와 Commit의 차이

웅지니어링 2025. 3. 21. 16:25

* 개요

JPA를 공부하다 보니, flush와 commit에 대한 개념이 너무 헷갈렸다.

두 개의 작업은 데이터를 데이터베이스에 반영한다는 점에서는 비슷하지만 엄연히 다르다고 한다.

이를 정리하기 위해 글을 쓰게 되었다.

 

* flush()란?

flush()는 영속성 컨텍스트의 변경사항을 즉시 데이터베이스에 반영(동기화)하는 역할을 한다.

즉, 데이터베이스와 영속성 컨텍스트 사이의 스냅샷을 일치시키는 작업이다.

 

- 스냅샷 : 엔티티를 영속성 컨텍스트에 보관할 때, 최초 상태를 복사해서 저장해두는 것

 

다만, 트랜잭션을 커밋하지는 않는다.

이는 에러 발생 시, ROLLBACK이 가능한 단계까지만 반영하는 작업임을 알 수 있다.

그리고 flush()가 호출되면 변경된 엔티티가 SQL로 변환되어 실행되지만, 트랜잭션이 끝난 것은 아니다.

entityManager.persist(entity);
entityManager.flush(); // SQL 쿼리 즉시 실행

 

-  그래서 flush()는 언제 사용하는데?

-> 변경 사항을 즉시 데이터베이스에 반영해야 하지만, 트랜잭션은 유지해야 할 때 사용(대량 데이터 처리)

-> JPQL 실행 전에 변경 사항을 강제 반영해야 할 때 사용  

 

* commit()이란?

commit()은 현재 트랜잭션을 완료하고 모든 변경 사항을 확정하는 역할을 한다.

내부적으로 flush()를 수행한 후, 실제로 트랜잭션을 커밋한다.

commit()이 실행되면 변경 사항이 영구적으로 저장되며 ROLLBACK할 수 없다. 

EntityTransaction transaction = entityManager.getTransaction();
transaction.begin();

entityManager.persist(entity);

transaction.commit(); // flush()가 자동 실행된 후 commit됨

- 그래서 commit()은 언제 사용하는데?

-> 데이터베이스 변경 사항을 최종적으로 확정할 때 사용

-> 하나의 작업 단위를 끝내고 안정적인 저장이 필요할 때 사용

 

* 결론

구분 flush() commit()
실행 시점 즉시 데이터베이스에 SQL 실행 트랜잭션 종료 시점
트랜잭션 종료 여부 트랜잭션 유지됨 트랜잭션 종료됨
롤백 가능 여부 가능 불가능(커밋되면 롤백 불가)
내부적으로 flush() 호출 여부 명시적으로 호출 필요 내부적으로 자동 호출됨
주요 목적 변경 사항을 즉시 반영(트랜잭션 유지) 변경 사항을 확정하고 트랜잭션을 종료

 

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

[JPA] 영속성 컨텍스트  (0) 2025.02.21
[JPA] Entity Manager  (0) 2025.02.12
[JPA] JPA 기초 및 개념  (0) 2025.02.11