📍 GitHub 바로가기

1 영속성컨텍스트

📌 영속성컨텍스트 : Entity를 영구 저장하는 환경

1️⃣ 영속성컨텍스트 역할

  • 애플리케이션과 데이터베이스 사이 → 객체를 보관하는 가상의 데이터베이스 역할

  • Entity manager → Entity를 저장 및 조회
    ➡️ 영속성컨텍스트에 Entity를 보관 및 관리

2️⃣ 영속성컨텍스트 특징

  • Entity manager 생성 시 1개가 만들어짐

    • Entity manager를 통해 영속성컨텍스트에 접근하고 관리함
  • 영속성컨텍스트 → Entity를 식별자(Id)로 구분함

    • 영속상태는 식별자(Id) 값 필수
  • Flush : 영속성컨텍스트에 새로 저장된 Entity → 데이터베이스에 반영하는 것

3️⃣ 영속성컨텍스트 구조

  • JPA

    • 객체 - ORM - DB
    • 객체 - 영속성컨텍스트매니저 (entity context manager) - DB
  • 영속성컨텍스트매니저 : 객체와 데이터베이스의 소통을 효율적으로 관리함


2 Entity 생명주기

1️⃣ 비영속 (New)

  • 영속성컨텍스트와 전혀 관계 ❌

  • Entity 객체를 생성했으나, 영속성컨텍스트에 저장하지 않은 상태

Member member = new Member();

2️⃣ 영속 (Managed)

  • 영속성컨텍스트에 저장된 상태

  • Entity manager → Entity를 영속성컨텍스트에 저장한상태

  • 영속성컨텍스트에 의해 관리된다는 의미

em.persist(member);

3️⃣ 준영속 (Detached)

  • 영속성컨텍스트에 저장되었다가 분리된상태

  • 영속상태의 Entity를 더이상 관리하지 않는 것

  • 영속성컨텍스트 제공기능 (1차캐시, 쓰기지연, 변경감지, 지연로딩) → 동작 ❌

  • 식별자 값을 가지고있음

// Entity -> 준영속상태
em.detach(member);

// 영속성컨텍스트를 비우면 관리되던 Entity -> 준영속상태
em.clear();

// 영속성컨텍스트 종료 -> 준영속상태
em.close();

4️⃣ 삭제 (Removed)

  • Entity를 영속성컨텍스트와 DB에서 삭제
em.remove(member);

3 영속성컨텍스트 장점

1️⃣ 1차캐시

📌 1차캐시 : 영속성컨텍스트 내부의 캐시

  • 영속상태 Entity → 1차캐시에 저장함
구분해당 값
1차캐시 key식별자 값 (Id)
1차캐시 valueEntity 인스턴스(객체)

💡 1차캐시 조회

  • ① 1차캐시에서 Entity 찾음
  • ② 존재하면 → 메모리에 있는 1차캐시에서 Entity 조회
  • ③ 없으면 → 데이터베이스에서 조회
  • ④ 조회한 데이터 → Entity 생성 → 1차캐시에 저장
    (Entity를 영속상태로 만드는 것)
  • ⑤ 조회한 Entity 반환

💡 1차캐시 조회code

// em.find(Entity클래스타입, 식별자값);
Member member = em.find(Member.class, "member1");

2️⃣ 동일성보장

📌 동일성비교 : 실제 인스턴스(객체)가 같음 → == 사용해 비교
📌 동등성비교 : 실제 인스턴스(객체) 다르지만, 인스턴스(객체) 값이 같음 → equals() 사용해 비교

  • 영속성컨텍스트는 Entity의 동일성을 보장함
Member a = em.find(Member.class, "member1");
Member b = em.find(Member.class, "member2");

System.out.println(a == b); // True

3️⃣ 쓰기지원

📌 쓰기지원 : 트랜잭션 커밋 → 모아둔 Query 한번에 DB에 전송

  • 트랜잭션을 지원함

  • em.find(member) 사용해 member를 저장해도, 바로 INSERT SQL이 DB에 전송되는 것 ❌

  • Entity manager → 트랜잭션 커밋 전까지 내부 Query 저장소에 INSERT SQL을 모아둠

4️⃣ 변경감지

📌 변경감지 : 영속성컨텍스트가 관리하는 영속상태의 Entity에만 적용

  • JPA로 Entity 수정 → 단순히 Entity 조회 후, 데이터 변경

💡 변경감지흐름

  • ① 트랜잭션 커밋 → Entity manager 내부에서 Flush 호출
  • ② Entity와 스냅샷 비교 → 변경부분 탐지
  • ③ 변경된 Entity → 수정 Query 생성 → 쓰기지연 SQL저장소에 저장
  • ④ 쓰기지연 저장소의 SQL → Flush
  • ⑤ 데이터베이스 트랜잭션 커밋
profile
🐱Sunyeon-Jeong, mallang developer🐰

1개의 댓글

comment-user-thumbnail
2023년 7월 27일

잘 읽었습니다. 좋은 정보 감사드립니다.

답글 달기