JPA (Java Persistence API)

- 자바 진영의 ORM 표준

- 오픈소스 Hibernate가 떡상하자 자바에서 그거 만든 개발자 잡아와서 만든 표준이다.

 

ORM (Object-relational mapping) 객체 관계 매핑

- 객체는 객체대로 

- 관계형 데이터베이스는 DB대로 

- ORM이 중간에서 연결해줌

 

JPA에서 가장 중요한 것은?

1. 객체와 관계형 데이터베이스 매핑하기

2. 영속성 컨텍스트

 


 

영속성 컨텍스트

- 논리적인 개념

- 엔티티 매니저를 통해 영속성 컨텍스트에 접근한다.

 

영속성 컨텍스트의 생명주기

1. 비영속 (new/transient) : 영속성 컨텍스트와 전혀 관계없는 새로운 상태

2. 영속 (managed) : persist()를 통해 객체를 저장, 영속성 컨텍스트에서 관리중

3. 준영속 (detached) : 저장되었다가 분리된 상태

4. 삭제 (removed) : 말그대로 삭제

 

특징

  • 영속성 컨텍스트는 1차 캐시를 들고 있다.
    • 클라이언트가 10명이면 각자 1차 캐시를 가진다. 트랙잭션 내에서만 공유되는 개념
    • id가 key, entity객체가 value가 된다.
    • find하면 1차 캐시를 먼저 확인 → 1차캐시에 없으면 db조회 → 1차 캐시에 저장 → 반환
  • 영속 엔티티의 동일성을 보장
  • 쓰기 지연 SQL 저장소
  • 변경감지 (Dirty Checking)
    • 영속 상태 엔티티의 속성 변화를 JPA가 추적하여 트랜잭션 커밋 시점에 변경된 내용을 자동으로 UPDATE 쿼리로 만들어 DB에 반영하는 기능
    • flush()하면 엔티티 스냅샷과 비교한다.
    • 스냅샷은 값을 최초에 읽어왔을때 데이터 그리고나서 commit 시점에 바뀐 값이 있다면 UPDATE SQL을 생성한다. 

 

플러시 

  • 영속성 컨텍스트의 변경내용을 데이터베이스에 반영하는 것
  • 플러시발생 → 수정된 엔티티를 쓰기 지연 SQL 저장소에 등록 → 저장소 쿼리를 데이터베이스에 전송
  • 영속성 컨텍스트를 비우는게 아님! 1차 캐시는 남아있다는 것 중요!
  • 트랜잭션이라는 작업 단위가 중요한 것.

수업 다 듣고나서 궁금했던 것 정리

 

 

영속성 컨텍스트의 메모리 위치

핵심: 서버 측 JVM 힙 메모리에 저장

클라이언트(브라우저) ❌
    ↓ HTTP 요청
서버 JVM 힙 메모리 ✅
    ├── 영속성 컨텍스트
    │   ├── 1차 캐시 (Map<ID, Entity>)
    │   └── 쓰기 지연 SQL 저장소 (List<SQL>)

+ Recent posts