[내일배움캠프] JPA 영속성 컨텍스트

김재진·2026년 1월 6일

내일배움캠프

목록 보기
31/70

1. 영속성 컨텍스트란?

  • 엔티티를 영속적으로 저장하는 환경
  • JPA에서는 엔티티의 생명주기를 관리하고, 애플리케이션과 데이터베이스 사이에서 수많은 최적화 작업을 해주는 논리적인 공간(메모리 공간)

2. 영속성 컨텍스트를 사용하는 이유

  1. 1차 캐시와 동일성 보장
    • 영속성 컨텍스트는 일종의 Map형태의 캐시 저장소를 가짐
    • 1차 캐시에 엔티티가 저장
    • 1차 캐시에 동일한 ID 엔티티 객체가 있을 경우 DB를 조회하지 않고 반환
  2. 변경 감지 (Dirty Checking)
    • 트랜잭션이 커밋되기 직전, 영속성 컨텍스트는 1차 캐시에 있는 모든 엔티티의 최초 상태(스냅샷)와 현재 상태를 비교
    • 엔티티의 필드값이 변경되었을 경우, JPA는 변경된 내용을 감지하고 자동으로 UPDATE SQL을 생성하여 DB에 반영
  3. 쓰기 지연 (Transactional Write-Behind)
    • 호출 즉시 SQL이 DB로 전송되는 것이 아닌 1차 캐시에 저장됨
    • 커밋되는 순간, JPA가 모아둔 모든 SQL을 한 번에 DB로 전송(Flush)

3. 트랜잭션 격리 수준 (Transaction Isolation Level)

  • 동시에 실행되는 여러 트랜잭션들이 어느 정도 격리되어 실행될지를 결정하는 DB설정
  1. READ UNCOMMITTED
    • 가장 낮은 격리 수준
    • 다른 트랜잭션에서 값을 읽을 수 있음, 정합성에 문제가 많아 사용하지 않는 것을 권장
  2. READ COMMITTED
    • COMMIT이 된 데이터만 읽음
    • RDB에서 대부분 기본적으로 사용하는 격리 수준
  3. REPEATABLE READ
    • 자신의 트랜잭션이 생성되기 이전의 트랜잭션에서 COMMIT이 된 데이터만 읽음
    • MySQL의 default 격리 수준
    • MySQL에서는 트랜잭션마다 트랜잭션 ID를 부여하여 트랜잭션 ID보다 작은 트랜잭션 번호에서 변경한 것만 읽게 됨
  4. SERIALIZABLE
    • 가장 엄격한 격리 수준
    • 데이터를 접근할 때, 항상 Lock을 걸고 데이터를 조회
    • 성능 문제로 데이터베이스에서 거의 사용되지 않음
profile
개발공부 처음해보는 사람

0개의 댓글