Programing/Spring
영속성 컨텍스트 - JPA 핵심 개념 : 동일성 보장 및 쓰기 지연
블스뜸
2025. 5. 15. 17:55
1. 동일성 보장 (Identity Guarantee)
- 동일 트랜잭션 내 조회된 Entity는 동일 인스턴스 반환.
- 영속성 컨텍스트의 1차 캐시 활용.
- DB 조회 후 1차 캐시에 저장, 이후 동일 조회 시 1차 캐시에서 반환.
try {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("your_persistence_unit");
EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();
transaction.begin();
// DB 조회, 1차 캐시에 저장
Tutor findTutor1 = em.find(Tutor.class, 1L);
// 1차 캐시 조회
Tutor findTutor2 = em.find(Tutor.class, 1L);
// true 반환
System.out.println("findTutor1 == findTutor2 : " + (findTutor1 == findTutor2));
transaction.commit();
} catch (Exception e) {
e.printStackTrace();
transaction.rollback();
}
2. 쓰기 지연 (Transactional Write-Behind)
- 동일 트랜잭션 내 생성된 SQL을 Commit 시점에 일괄 반영.
- 쓰기 지연 저장소 활용.
- persist() 호출 시 SQL 즉시 전송 X, 쓰기 지연 저장소에 보관.
- transaction.commit() 시 영속성 컨텍스트 Flush, 쓰기 지연 저장소의 SQL 일괄 실행 후 DB 반영.
성능 최적화:
- 네트워크 통신 횟수 감소, 성능 향상.
- hibernate.jdbc.batch_size 설정으로 동일 유형 SQL 묶어서 전송 가능.
@GeneratedValue(strategy = GenerationType.IDENTITY) 사용 시 주의사항:
- 해당 전략 사용 시 persist() 호출 시점에 즉시 INSERT SQL 실행, 쓰기 지연 무시.
결론적으로, 동일성 보장은 트랜잭션 내 객체 참조 일관성 유지 및 불필요한 DB 조회 감소에 기여하며, 쓰기 지연은 DB 통신 횟수 최적화로 성능 향상에 기여한다.