모르지 않다는 것은 아는것과 다르다.

Spring Jpa

영속성 컨텍스트

채마스 2022. 2. 27. 00:58

영속성 컨텍스트란?

  • 엔티티를 영구 저장하는 환경 이라는 뜻이다.
  • EntityManager.persist(entity); -> DB에 저장한다는 뜻이 아니라 엔티티를 영속성 컨텍스트에 저장한다는 말이다.
  • 영속성 컨텍스트는 눈에 보이지 않는 논리적인 개념이다.
  • 엔티티 메니저를 통해서 영속성 컨텍스트에 접근한다.
  • 애플리케이션과 DB 사이에 있다고 생각하면 된다.

 

엔티티 컨텍스트 동작 방식

  • 위와 같이 고객이 요청으하면 entityManagerFactory가 entityManager를 생성한다.
  • entityManager는 내부적으로 DB connection을 통해서 DB와 통신한다.

 

엔티티의 생명주기

  • 비영속 (new/transient) -> 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태
  Member member = new Member();
  member.setId("member1");
  member.setUsername("회원1");
  • Member 라는 객체만 생성했을분 영속성 컨텍스트에 반영되어 있지 않은 상태
  • 영속 (managed) -> 영속성 컨텍스트에 관리되는 상태 -> 이때 디비에 저장되는건 아니다.
  em.persist(member);
  • 준영속 (detached) -> 영속성 컨텍스트에 저장되었다가 분리된 상태
  em.detach(member);
  • 삭제 (removed) -> 삭제된 상태
  em.remove(member);

 

영속셩 켠텍스트의 이점

  • 1차 캐시
    • 만약 엔티티를 조회한다고 했을때, 먼저 1차 캐시 에서 Id값으로 조회를 하고, 캐시에 있다면 캐시에 있는 값을 반환해준다.
    • 캐시에 없다면 DB에서 엔티티를 조회해서 1차캐시에 넣고 그 값을 반환해 준다.
    • 실제로 em.persist() 한 값을 바로 조회해보면 select 쿼리가 발생하지 않은 것을 확인할 수 있다. -> DB에서 조회를 하지 않았다는 뜻.
    • 하지만 1차캐시는 DB 트랜젝션 안에서 잠깐 발생하는 캐시이기 때문에 로직이 엄청 복잡하지 않는 상황이 아니라면 성능적인 이점이 있는 것은 아니다. -> 하지만 성능보다는 컨셉이 좋다 (참고로 2차캐시도 있다 -> 모두 공유)
  • 트랜잭션을 지원하는 쓰기 지연

  • 위와 같이 만약 memberA가 생성 됐다고 했을때, 먼저 1차 캐시에 생성되고, 동시에 insert 쿼리를 생성하고 쓰기지연 SQL 저장소에 저장한다.
  • memberB도 마찬가지다.
  • 트랜젝션 안에서 엔티티가 여러개 생성됐다고 했을때, 생성될때마다 insert 쿼리문이 나가지 않는다. -> 커밋하는 순간 쿼리가 발생한다.
  • 이렇게 되면 버퍼링이라는 기능을 사용할 수 있게된다. -> 대용량 배치작업을 할때는 이득을 얻을 수 있다.
  • 변경감지

  • 트랜잭션이 커밋되는 시점에서 1차 캐시에있는 스냅샷을 이용해서 변경을 감지하고 변경이 일어났을때 update 쿼리문을 쓰기지연 SQL 저장소에 저장한다.

 

플러시

  • 영속성 컨텍스트의 변경내용을 데이터베이스에 반영
  • 플러시가 발생하면 아래와 같은 작업을 한다.
    • 변경 감지
    • 수정된 엔티티 쓰기 지연 SQL 저장소에 등록
    • 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송
  • 플러시를 발생시키는 방법
    • em.flush()
    • 트랜잭션 커밋
    • JPQL 쿼리 실행
  • 플러시 된다고 1차캐시가 지워지는 것은 아니다. -> 영속성 컨택스트의 변경내용을 데이터베이스에 반영한다.

 

준영속 상태

  • 영속 상태의 엔티티가 영속성 컨텍스트에서 분리된 상태를 말하고, 이 상태에서는 당연히 영속성 컨텍스트의 기능을 사용할 수 없다.
  • 준영속 상태를 만드는 방법
    • em.detach(entity);
    • em.clear();
    • em.close();

 

 

REFERENCES

  • 김영한님의 자바 ORM 표준 JPA 프로그래밍 - 기본편

'Spring Jpa' 카테고리의 다른 글

프록시와 연관관계 관리  (0) 2022.02.27
JPA Id 생성전략 설정하기  (0) 2022.02.27
조회 성능 최적화  (0) 2022.02.27
값타입  (0) 2022.02.27
OSIV  (0) 2022.02.27