Day 23 숙련 스프링 (1)

정채림·2026년 2월 10일

영속성 컨텍스트

  • 영속성 컨텍스트는 단어 그대로 엔티티(Entity)를 영속적으로 저장하는 환경이라는 뜻

  • JPA에서는 엔티티의 생명주기를 관리하고, 애플리케이션과 데이터베이스 사이에서 수많은 최적화 작업을 해주는 논리적인 공간

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

  1. 1차 캐시와 동일성(Identity) 보장
  • 1차 캐시:
    영속성 컨텍스트는 일종의 Map 형태의 캐시 저장소를 갖고 있습니다.
    엔티티가 영속성 컨텍스트의 1차 캐시에 저장됩니다.
    먼저 1차 캐시를 확인합니다. 캐시에 동일한 ID의 엔티티 객체가 있으면, DB를 조회하지 않고 캐시의 엔티티를 즉시 반환합니다.
  1. 동일성 보장:
    1차 캐시 덕분에, 같은 트랜잭션 안에서 같은 ID로 조회한 엔티티는 항상 동일한 메모리 주소의 인스턴스(== 비교 시 true)임이 보장됩니다.

  2. 변경 감지 (Dirty Checking)

  • 동작 원리:
    트랜잭션이 커밋되기 직전, 영속성 컨텍스트는 1차 캐시에 있는 모든 엔티티의 최초 상태(스냅샷)와 현재 상태를 비교합니다.
    만약 두 상태가 다르다면(즉, 엔티티의 필드 값이 변경되었다면), JPA는 변경된 내용을 감지하고 자동으로 UPDATE SQL을 생성하여 DB에 반영합니다.
    이 과정을 더티 체킹(Dirty Checking)이라고 합니다.
  1. 쓰기 지연 (Transactional Write-Behind)
    동작 원리:
    memberRepository.save() 호출되면, 해당 엔티티는 1차 캐시에 저장되고, JPA는 이 엔티티를 DB에 반영하기 위한 INSERT SQL을 생성하여 차곡차곡 모아둡니다.
    UPDATE나 DELETE 쿼리도 마찬가지로 이 저장소에 쌓입니다.
    트랜잭션이 커밋되는 순간, JPA는 모아뒀던 모든 SQL들을 한 번에 DB로 보냅니다. (이 과정을 Flush라고 합니다.)
    장점:
    SQL을 하나씩 보내지 않고 모았다가 한 번에 처리하므로, 네트워크 비용을 줄이고 DB와 상호작용하는 횟수를 최소화하여 성능을 최적화할 수 있습니다. (e.g., JDBC 배치 기능 활용 가능)

0개의 댓글