자바 ORM 표준 JPA 프로그래밍(기본편) - 영속성 관리

최준석·2022년 10월 24일
0

영속성 관리


엔티티매니저팩토리와 엔티티매니저

작동방식)

애플리케이션 구동과 함께 EntityManagerFactory가 생성되고 클라이언트의 요청이 들어오면 EntityManager를 생성해 해당 클라이언트와 DB를 연결해주는 커넥션풀을 생성한다.

영속성 컨텍스트

  • JPA를 이해하는데 가장 중요한 용어
  • 엔티티를 영구 저장하는 환경이라는 뜻
  • EntityManager.persist(entity)

엔티티 매니저? 영속성 컨텍스트?

  • 영속성 컨텍스트는 놀리적인 개념
  • 눈에 보이지 않는다
  • 엔티티 매니저를 통해서 영속성 컨텍스트에 접근

예시)



엔티티의 생명주기

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

  • 영속(managed)
    영속성 컨텍스트에 관리되는 상태

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

  • 삭제(removed)
    삭제된 상태

예시)

객체를 생성한 후 .persist()를 통해 영속성을 부여해 EntityManager가 관리하게 만든다. 영속성이 부여된 Entity.detach().remove()를 통해 영속성을 해제할 수 있으며 .flush()를 통해 영속성이 부여된 Entity데이터들을 DB에 입력하고 .commit()을 통해 트랜잭션을 완료할 수 있다.

비영속, 영속, 준영속에 대해

비영속

  • 생성된 Entity가 한번도 영속성은 부여받은 적 없는 상태

예시)

Member member = new Member();
member.setId("member1");
member.setUsername("회원1");

영속

  • Entity가 생성되어 .persist().find()등을 통해 EntityManager에 의해 관리되고 있는 상태

예시)

Member member = new Member();
member.setId("member1");
member.setUsername(“회원1”);

EntityManager em = emf.createEntityManager();
em.getTransaction().begin();

//객체를 저장한 상태(영속)
em.persist(member);

준영속

  • 영속 상태였던 Entity가 .detach().clear(), .close()에 의해 더 이상 EntityManager의 관리를 받고 있지 않는 상태

비영속과 준영속의 차이점

  • 둘 다 EntityManager의 관리를 받고있지 않는 상태라는건 동일하지만 준영속의 경우에는 영속성을 부여받은 적이 있기 때문에 Id(PrimaryKey)가 존재한다. 비영속의 경우에는 Id(Primarykey)가 존재할수도 있고 아닐수도 있다.

영속성 컨텍스트의 이점

  • 1차 캐시
  • 동일성 보장
  • 트랜잭션을 지원하는 쓰기 지연(transactional write-behind)
  • 변경 감지(Dirty Checking)
  • 지연 로딩(Lazy Loading)

1차 캐시

  • 영속화된 Entity는 기본적으로 1차캐시에 저장된다. 1차캐시에 저장되어있는 Entity를 조회할 일이 생기면 쿼리문을 통해 DB에서 가져오는게아니라 1차캐시에서 가져오게 되고 최적화에 도움이 된다

영속 엔티티의 동일성 보장

  • 영속화된 동일한 Entity는 몇번을 DB에서 읽어와도 동일성을 가진다.

트랜잭션을 지원하는 쓰기 지원

  • EntityManeger는 Entity를 영속화 할 때 마다 각각 쿼리문을 작성해 DB로 보내지 않는다. DB의 변경이 필요한 Entity변경 사항은 모든 영속화 과정이 끝나고 트랜잭션이 .commit()될 때 한꺼번에 쿼리문을 작성해 변경사항을 갱신한다.

변경 감지

  • DB의 데이터를 Update해야할 때, EntityManager는 관리되고 있는 Entity들의 변경사항을 체크(Dirty Checking)한 후 트랜잭션 .commit()때 변경된 부분들에 대해서만 Update 쿼리문을 작성해 DB에 보내는 방식을 취한다.

플러시

  • 영속성 컨텍스트의 변경내용을 데이터베이스에 반영하는 과정
  • 기본적으로는 .commit()바로 전에 일어남

플러시가 실행되면 일어나는 일들

  • 변경감지
  • 수정된 엔티티 쓰기 지연 SQL저장소에 등록
  • 쓰기 지연 SQL저장소의 쿼리를 데이터베이스에 전송(CUD 쿼리)

영속성 컨텍스트를 플러시하는 방법

  • em.flush() - 직접호출
  • 트랜잭션 커밋 - 플러시 자동 호출
  • JPQL 쿼리 실행 - 플러시 자동 호출

플러시 모드 옵션

em.setFlushMode(FlushModeType.COMMIT)

  • FlushModeType.AUTO
    커밋이나 쿼리를 실행할 때 플러시(기본값)

  • FlushModeType.COMMIT
    커밋할 때만 플러시

플러시의 특징

  • 영속성 컨텍스트를 비우지 않음
  • 영속성 컨텍스트의 변경내용을 데이터베이스에 동기화
  • 트랜잭션이라는 작업 단위가 중요 -> 커밋 직전에만 동기화 하면

출처 : https://www.inflearn.com/course/ORM-JPA-Basic/dashboard
(자바 ORM 표준 JPA 프로그래밍 - 기본편)

profile
Back-End Web Developer

0개의 댓글