기본편(3) - 영속성 관리

bin1225·2021년 9월 28일
0

JPA

목록 보기
3/12

영속성 컨텍스트

JPA에서 가장 중요한 2가지
_• 객체와 관계형 데이터베이스 매핑하기
(Object Relational Mapping)
• 영속성 컨텍스트

영속성 컨텍스트란?

  • "엔티티를 영구 저장하는 환경" 이라는 뜻

  • 논리적인 개념이기 때문에 눈에 보이지 않는다.

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

엔티티의 생명주기


Entity : 관계형 데이터베이스에서, entity는 저장될 수 있는 어떤 데이터에 관한 사람, 장소, 또는 사물이다.

출처: https://linuxism.ustd.ip.or.kr/45 [linuxism]

객체지향 프로그래밍에서 객체와 비슷한 의미를 가진다.

비영속 (new/transient)

  • 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태

영속 (managed)

  • EntityManager를 통해 객체를 저장한 상태
Member member = new Member();

EntityManager em = emf.createEntityManager():
em.getTransaction().bigin();

em.persist(member);
// member는 영속상태

준영속 (detached)

  • 영속돼있던 엔티티를 영속성 컨텍스트에서 분리한 상태
em.detach(member); 
//특정 엔티티만 준영속 상태로 전환

em.clear();
//영속성 컨텍스트를 완전히 초기화

• em.close();
//영속성 컨텍스트를 종료

삭제 (removed)

  • 객체를 삭제
em.remove(member);

영속성 컨텍스트의 이점

• 1차 캐시

Member member = new Member();
member.setId("member1");
member.setUsername("회원1");
//1차 캐시에 저장됨
em.persist(member);
//1차 캐시에서 조회
Member findMember = em.find(Member.class, "member1");

- 영속상태가 아닌 데이터를 DB에서 가져오는 경우에도 1차 캐시에 저장한다.

동일성(identity) 보장
1차 캐시와 같은 원리로 캐시에 저장된 데이터는 이미 존재하는 데이터이기 때문에 동일성을 보장한다.

Member a = em.find(Member.class, "member1"); 
Member b = em.find(Member.class, "member1");
System.out.println(a == b); //동일성 비교 true

트랜잭션을 지원하는 쓰기 지연
(transactional write-behind)

em.persist() 시에는 데이터가 DB에 저장되는 게 아니라 영속성 컨텍스트에 있는 1차 캐시에 저장된다.
그리고 이에 대한 SQL은 따로 저장소에 저장돼있다가 transaction commit시에 한 번에 flush 된다.

변경 감지(Dirty Checking)

쓰기 지연과 비슷한 원리로 처음 영속시킬 때 그 데이터의 스냅샷을 저장해두고,
flush 할 때 비교하고 바뀐 데이터들에 대한 UPDATE SQL을 생성하여 데이터를 변경해준다.

* 플러시란?( flush )
- 영속성 컨텍스트의 변경내용( 등록, 수정, 삭제) 을 데이터베이스에 반영

- 영속성 컨텍스트를 플러시하는 방법
• em.flush() - 직접 호출
• 트랜잭션 커밋 - 플러시 자동 호출
• JPQL 쿼리 실행 - 플러시 자동 호출

- 플러시는 영속성 컨텍스트를 ㅂ비우지 않는다.

지연 로딩(Lazy Loading)

0개의 댓글

관련 채용 정보