#03 영속성 관리

김영한 저 "자바 ORM 표준 JPA 프로그래밍, 2015"을 읽고 정리한 내용입니다.

영속성 컨택스트 = JPA가 애플리케이션서버와 DB서버 사이에서 엔티티를 관리하는 공간.

영속성 상태 4가

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

  2. 영속(managed): 영속성 컨텍스트에 저장된 상태

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

  4. 삭제(removed): 삭제된 상태

생명주기

김영한, 「자바 ORM 표준 JPA 프로그래밍」, 에이콘, 2015

비영속 - 객체만 생성하고 아직 영속성컨택스트에 저장하지 않음.

영속 - 영속성 컨텍스트 관리하는 상

준영속 - 엔티티를 영속성 컨텍스트가 더이상 관리하지 않으면 준영속 상태

삭제 - 엔티티를 영속성 컨텍스트와 데이터베이스에서 삭제

영속성 컨텍스트는의 특징

  1. 엔티티를 식별자 값으로 구분 (식별자값은 데이터베이스 기본 키와 매핑)

  2. flush로 데이터베이스에 반영 (커밋해도 플러시 포)

  3. 다양한 장점 (중)

    • 1차캐시

    • 동일성 보장

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

    • 변경 감지

    • 지연 로딩

다양한 장점 맛보기

1차캐시

  • commit이나 flush 할 때까지 데이터베이스에 저장 X

  • 1차 캐시의 키는 식별자의 값

  • 티티를 조회할 때 1차 캐시 먼저

동일성 보장

  • 메모리 낭비 방지

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

  • 트랜잭션을 커밋하기 직전까지 내부 쿼리 저장소에 SQL을 차곡차곡 저

변경 감지

  • 관리하는 영속 상태의 엔티티에만 적용

  • 따로 UPDATE SQL 없이 엔티티를 find()해서 setter로 수정만 해줘도 DB 반영

    • 플러시 시점에 스냅샷(저장된 엔티티 최초상태)과 엔티티를 비교해서 DB에 반영

지연 로딩

  • 자신과 연관된 엔티티를 실제로 사용 시점 연관된 엔티티를 조회

코드 전체 분석전 부분 분석

하나의 데이터베이스는 하나의 엔티티 매니저 팩토리(EntityManagerFactory)를 가진다.

엔티티 매니저는 여러 스레드가 동시에 접근해도 안전하므로 서로 다른 스레드 간에 공유해도 된다. 트랜잭션을 시작시 데이터베이스 연결하여 커넥션을 획득한다.

전코드 분석

< JpaMain.class >

< Member.class >

< persistence.xml >

콘솔로 본 내부과정 정

1. setter()들 (아직 INSERT가 날아가지 않는다.) 2. persist( ) 데이터베이스에 바로 저장하지 않고 @Id 값으로 영속성 컨택스트 내에서 유일한 식별자값을 만든다. (아직 INSERT가 날아가지 않는다.) 3. setAge(20) - 업데이트문이 날아가지 않는다. 4. em.find(Member.class, id) - 1차캐시에서 찾아온다. 아직도 데이터베이스까지의 통신이 없다. 5. em.createQuery("select m from Member m", Member.class).getResultList(); 리스트 조회 시 콘솔을 보니 insert -> update -> select 문이 차례대로 날아갔다.궁

궁금? - 왜 insert -> update -> select로 할까 1차캐시에서 나이를 20으로 변경했으면 insert -> select 만 해도 되는 것 안닌가?

Last updated