영속성 컨텍스트 2

숭맹이·2025년 4월 24일
0

김영한님의 자바 ORM 표준 JPA 프로그래밍 - 기본편 정리

🔍 영속성 컨텍스트란?

EntityManager는 내부적으로 영속성 컨텍스트(Persistence Context)를 유지한다. 쉽게 말해, JPA가 엔티티를 관리하는 메모리 공간이다.

  • 1차 캐시: 영속성 컨텍스트 내부에서 가장 핵심적인 역할을 수행.
  • 엔티티의 PK를 키, 실제 객체를 값으로 가지는 Map 형태.
Member member = new Member();
member.setId("member1");
member.setUsername("회원1");
em.persist(member); // 비로소 영속 상태 진입

이제 member1은 1차 캐시에 저장된다.


📌 1차 캐시의 이점

1. 조회 최적화

Member find1 = em.find(Member.class, "member1"); // SELECT 발생
Member find2 = em.find(Member.class, "member1"); // 캐시에서 조회, SELECT 없음
  • 같은 트랜잭션 내에서 동일 엔티티 조회 시, DB가 아닌 1차 캐시에서 가져옴

2. 동일성 보장 (==)

System.out.println(find1 == find2); // true
  • 같은 인스턴스를 반환하기 때문에 == 비교도 true
  • 이는 JPA가 제공하는 REPEATABLE READ 수준의 트랜잭션 일관성을 보장하는 핵심 기제

🕐 쓰기 지연 (Write-Behind Buffering)

em.persist() 호출 시, 바로 DB에 INSERT 되지 않는다.

em.getTransaction().begin();
em.persist(memberA);
em.persist(memberB);
// 아직 INSERT 없음
em.getTransaction().commit(); // 이 순간 INSERT SQL 실행

➕ 이점

  • 여러 INSERT 쿼리를 모아서 한 번에 보내 성능 최적화 가능
  • Hibernate는 hibernate.jdbc.batch_size 옵션으로 JDBC 배치 처리도 지원

🧼 변경 감지 (Dirty Checking)

Member member = em.find(Member.class, "member1");
member.setUsername("변경됨");
em.getTransaction().commit(); // UPDATE SQL 자동 발생
  • em.update() 같은 명시적 호출 필요 없음
  • JPA는 최초 상태 스냅샷과 비교해 변경이 있으면 UPDATE 쿼리 생성

✅ 내부 동작 원리

  1. 영속 상태 진입 시 스냅샷 생성
  2. 트랜잭션 커밋 시점에 현재 상태와 비교
  3. 변경 사항 있으면 UPDATE SQL 생성 후 실행

🗑️ 엔티티 삭제

Member member = em.find(Member.class, "member1");
em.remove(member);
em.getTransaction().commit(); // DELETE SQL 발생
  • 마찬가지로 커밋 시점에 삭제 쿼리 실행

🔄 플러시 (Flush)

  • 영속성 컨텍스트 → DB 반영 작업
  • 커밋 시점 자동 수행 or 수동으로 em.flush() 호출 가능
em.flush(); // 강제로 DB에 반영

💡 실무 팁

  • 트랜잭션 범위 안에서 같은 엔티티 여러 번 조회하면 DB 부하 줄일 수 있음
  • 변경 감지 메커니즘을 이해하면 불필요한 update() 호출 줄일 수 있음
  • JDBC 배치 설정을 잘 활용하면 대량 INSERT 시 성능 개선 가능
profile
👨🏻‍💻 Backend Developer

0개의 댓글