JPA에서 가장 중요한 2가지
객체와 관계형 데이터베이스 매핑하기
영속성 컨텍스트
1. 영속성 컨텍스트
JPA를 이해하는데 가장 중요한 용어
“엔티티를 영구 저장하는 환경”이라는 뜻
EntityManager . persist ( entity );
1) 엔티티 매니저? 영속성 컨텍스트?
영속성 컨텍스트는 논리적인 개념
눈에 보이지 않는다.
엔티티 매니저를 통해서 영속성 컨텍스트에 접근
2. 엔티티의 생명주기
1) 비영속 (new/transient)
영속성 컨텍스트와 전혀 관계가 없는 새로운 상태
// 객체를 생성한 상태 (비영속)
Member memeber = new Member ();
member . setId ( "member1" );
member . setUsername ( "회원1" );
2) 영속 (managed)
// 영속
em . persist ( member );
3) 준영속 (detached)
// 회원 엔티티를 영속성 컨텍스트에서 분리, 준영속 상태
em . detach ( member );
4) 삭제 (removed)
// 객체를 삭제한 상태 (삭제)
em . remove ( memeber );
3. 영속성 컨텍스트의 이점
1차 캐시
동일성 (identity) 보장
트랜잭션을 지원하는 쓰기 지연 (transactional write-behind)
변경 감지 (Dirty Checking)
지연 로딩 (Lazy Loading)
1) 앤티티 조회, 1차 캐시
// 엔티티 생성한 상태(비영속)
Member member = new Member ();
member . setId ( "member1" );
member . setUsername ( "회원1" );
// 1차 캐시에 저장됨
em . persist ( member );
// 1차 캐시에서 조회
Member findMember = em . find ( Member . class , "member1" );
// 1차 캐시에서 없으니 데이터베이스에서 조회
Member findMember2 = em . find ( Member . class , "member2" );
2) 영속 엔티티의 동일성 보장
1차 캐시로 반복 가능한 읽기(REPEATABLE READ)등급의 트랜잭션 격리 수준을
데이터 베이스가 아닌 애플리케이션 차원에서 제공
Member a = em . find ( Member . class , "member1" );
Member b = em . find ( Member . class , "member1" );
System . out . println ( a == b ); // 동일성 비교 true
3) 엔티티 등록 (트랜잭션을 지원하는 쓰기 지연)
EntityManager em = emf . createEntityManager ();
EtityTransaction transaction = em . getTransaction ();
// 엔티티 매니저는 데이터 변경시 트랜잭션을 시작해야 한다.
transaction . begin (); // 트랜잭션 시작
em . persist ( memberA );
em . persist ( memberB );
// 여기까지 INSERT SQL을 데이터베이스에 보내지 않는다.
// 커밋하는 순간 데이터베이스의 INSERT SQL을 보낸다.
transaction . commit (); // 트랜잭션 커밋
4) 엔티티 수정 (변경 감지)
EntityManager em = emf . createEntityManager ();
EtityTransaction transaction = em . getTransaction ();
// 엔티티 매니저는 데이터 변경시 트랜잭션을 시작해야 한다.
transaction . begin (); // 트랜잭션 시작
// 영속 엔티티 조회
Member memberA = em . find ( Mmeber . class , "memberA" );
// 영속 엔티티 데이터 수정
memberA . setUsername ( "hi" );
memberA . setAge ( 10 );
transaction . commit (); // 트랜잭션 커밋
출처 : 자바 ORM 표준 JPA 프로그래밍 - 기본편(김영한) 인프런
태그:
JPA
카테고리:
JPA
업데이트: August 27, 2022
댓글남기기