728x90
✅ 1. 커밋(COMMIT) / 롤백(ROLLBACK) 시점에 어떤 일이 일어나는지
⚾️ 먼저 개념부터 짚자:
- 커밋 (Commit): 트랜잭션 안에서 한 작업들을 DB에 영구 반영하겠다는 뜻
- 롤백 (Rollback): 트랜잭션 안에서 한 작업들을 전부 취소하고 원래대로 되돌리겠다는 뜻
🔍 JPA에서 커밋이 일어날 때 무슨 일이 벌어지나?
JPA는 EntityManager 내부의 1차 캐시(Persistence Context)에서 객체 상태를 추적하고 있다가, 트랜잭션이 끝날 때 flush()를 자동으로 호출해!
→ 변경된 내용이 SQL로 변환되어 DB에 반영
👉 예:
@Transactional
public void updateTitle(Long id) {
Post post = postRepository.findById(id).orElseThrow();
post.setTitle("새로운 제목");
// 아직 DB 반영 아님. 메모리 상 객체만 수정한 상태
// 메서드 끝 → 트랜잭션 커밋 시 flush() → DB에 UPDATE 쿼리 실행됨
}
결과:
UPDATE post SET title='새로운 제목' WHERE id=?
🧨 예외가 발생해서 롤백된다면?
@Transactional
public void errorCase(Long id) {
Post post = postRepository.findById(id).orElseThrow();
post.setTitle("실패 케이스");
// 문제 발생!
throw new RuntimeException("강제 오류!");
}
이 경우:
- flush() 실행 X
- DB에 UPDATE 쿼리도 날리지 않음
- 메모리에서만 바뀌고 DB는 그대로
✅ 2. flush() 랑 커밋의 차이는?
- flush()는 영속성 컨텍스트(1차 캐시)의 변경 내용을 SQL로 DB에 보냄
- 하지만! 커밋은 그걸 영구히 저장하고, 롤백은 무효화하는 것
구분 | flush() | commit |
언제 호출? | 트랜잭션 중간에도 수동 호출 가능 | 트랜잭션 끝날 때 자동 |
역할 | SQL만 실행 (DB에 반영 시도) | DB에 영구 반영 |
확정 여부 | 아직 아님 | 확정임 |
롤백 가능? | 가능 | 불가 (이미 반영됨) |
✔️ flush만으로는 저장 확정이 아님.
→ flush 후 롤백하면 실제 DB에는 아무 일도 안 생긴 거처럼 됨.
✅ 3. 트랜잭션 없이 JPA 쓰면 어떻게 되는데?
public void noTransactionUpdate() {
Post post = postRepository.findById(1L).orElseThrow();
post.setTitle("트랜잭션 없음");
// 트랜잭션 없으니 flush도 안 되고
// 변경 감지 기능도 작동 안 함!
}
❗ 무슨 일이 벌어지냐면:
- post.setTitle("변경") 했는데도, DB에는 아무 일도 일어나지 않아
- 변경 감지(Dirty Checking)가 동작 안 해!
- 결국 JPA는 "아 얘 그냥 값 바꾼 것뿐인가보다" 하고 무시함
🔥 결론:
JPA를 쓰려면 반드시 트랜잭션 안에서 사용해야 한다!
🎯 정리 요약
기능 | 설명 |
커밋 | 트랜잭션의 변경 사항을 DB에 영구 반영 |
롤백 | 트랜잭션의 모든 작업을 취소 |
flush | 1차 캐시에 있는 변경 사항을 DB에 SQL로 보냄 (하지만 확정은 아님) |
트랜잭션 없으면? | 변경 감지, 쓰기 지연 등 JPA의 핵심 기능이 작동 안 함 |
🔹 지금까지 배운 핵심 요약 (트랜잭션 관련)
구분 | 의미와역할 |
flush() | 변경된 엔티티 정보를 SQL로 변환해서 DB에 전달. 하지만 실제 저장은 아님 |
commit | flush된 SQL을 진짜 DB에 영구 반영함. 이 시점에서 저장 완료됨 |
rollback | flush가 되었더라도 모든 변경사항을 취소함. DB에는 아무 일도 없었던 것처럼 됨 |
트랜잭션 없이 사용 | JPA의 핵심 기능 (변경 감지, 쓰기 지연 등)이 작동하지 않음 |
728x90
'프로그래밍 > Spring' 카테고리의 다른 글
@GeneratedValue란? (0) | 2025.04.07 |
---|---|
🌙JPA 매핑 어노테이션 가이드 (0) | 2025.04.07 |
변경 감지 (Dirty Checking)란? (0) | 2025.04.07 |
✅ Write-Behind (쓰기 지연) 란? (0) | 2025.04.07 |
⚾️ JPA 1차 캐시 (First-Level Cache) 완전 정복 (0) | 2025.04.07 |