노트

영속성 컨텍스트

Persistence Context

백엔드#jpa · 연결된 개념 10개

쉽게 말하면

영속성 컨텍스트는 트랜잭션 하나 동안 JPA가 쓰는 작업 책상이에요. 꺼낸 엔티티를 책상 위에 올려 두고 같은 걸 또 찾으면 바로 건네고, 처음 모습과 달라진 곳은 커밋 때 DB에 반영하죠.

비유가 깨지는 곳 책상에서 내려놓은 준영속 엔티티는 바꿔도 추적하지 않아요. 책상은 보통 트랜잭션이 끝나면 치워져서, 그 뒤에도 지연 로딩을 하려면 OSIV처럼 요청 끝까지 열어 두는 설정이 필요해요.

JPA(Jakarta Persistence, 옛 이름 Java Persistence API)가 엔티티를 관리하는 메모리 공간. 보통 트랜잭션 하나와 수명이 같다.

  • 같은 id를 두 번 조회하면 두 번째는 1차 캐시에서 같은 객체를 돌려준다
  • 관리 중인 엔티티의 필드를 바꾸면 save() 없이도 커밋 때 UPDATE가 나간다 → 더티 체킹
  • 엔티티 상태는 비영속(transient) → 영속(managed) → 준영속(detached) → 삭제(removed). 준영속 엔티티는 변경을 추적하지 않는다
  • 트랜잭션이 끝난 뒤에도 웹 요청 끝까지 열어 두는 설정이 OSIV (Open Session In View)다
stateDiagram-v2
  state "비영속 (transient)" as T
  state "영속 (managed)" as M
  state "준영속 (detached)" as D
  state "삭제 (removed)" as R
  [*] --> T: new
  T --> M: persist()
  [*] --> M: find() · JPQL 조회
  M --> D: detach() · clear() · close()
  D --> M: merge()
  M --> R: remove()
  R --> [*]: 커밋 때 DELETE

책: 7장 출석부 비유, 엔티티의 생애는 7장 세 번째 절

출처: Hibernate ORM User Guide: Persistence Contexts · Detaching an entity

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • JPA Auditing

    JPA Auditing은 엔티티의 생성·수정 시각과 생성자·수정자를 저장할 때 자동으로 채워 주는 Spring Data JPA 기능이다. 모든 엔티티에 반복되는 createdAt = now() 코드를 없앤다.

  • JPA 연관관계 매핑

    JPA(Jakarta Persistence, 옛 이름 Java Persistence API) 연관관계 매핑(association mapping)은 테이블의 외래키(foreign key) 관계를 엔티티 사이의 참조로 표현하는 방법이다. 핵심은 외래키를 관리하는 쪽(연관관계의 주인, owning side)을 정하는 것이고, 양방향 관계에서 반대쪽은 mappedBy로 "나는 읽기 전용 거울"이라고 표시한다.

  • 저장소 역할 분담 (DB·캐시·큐·검색)

    서버 애플리케이션 옆에는 거의 늘 관계형 DB, 인메모리 캐시, 메시지 브로커(message broker), 검색 엔진이 붙는다. 하나로 다 하지 않는 이유는 데이터의 성격(영구성·속도·전달·검색)마다 잘하는 도구가 다르기 때문이다.

  • 최종 일관성

    최종 일관성(eventual consistency)은 "지금 당장은 저장소마다 값이 다를 수 있지만, 새 변경이 멈추면 결국 같아진다"는 보장이다. 원본 DB와 검색 색인·캐시·다른 서비스처럼 물리적으로 분리된 저장소를 한 트랜잭션으로 묶을 수 없을 때 받아들이는 일관성 모델(consistency model)이다.

  • React 상태 갱신

    React는 상태를 직접 고치지 않고 새 값을 setState로 넘겨야 다시 그린다. 이전 값과 Object.is로 비교하므로, 같은 객체를 고친 뒤 넘기면 바뀐 줄 모른다.

보기 옵션