JPA 핵심
- 객체와 관계형 데이터베이스 매핑
- 영속성 컨텍스트
영속성 컨텍스트
의미 : 엔티티를 영구 저장하는 환경
영속성 컨텍스트는 논리적인 개념
엔티티 매니저를 통해 영속성 컨텍스트에 접근
J2SE 환경
엔티티 매니저 1 : 1 영속성 컨텍스트
J2EE, 스프링 프레임 워크같은 컨테이너 환경
엔티티 매니저 N : 1 영속성 컨텍스트
🌿 엔티티의 생명주기
- 비영속
- 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태
- new / transient
- ex) 객체를 생성한 상태
- 영속
- 영속성 컨텍스트에 관리되는 상태
- managed
- ex) persist(객체); - 객체는 영속상태이기에 관리 대상
- 준영속
- 영속성 컨텍스트에 저장되었다가 분리된 상태
- detached
- 준영속 상태로 만드는 법
- em.detach(객체) // 특정 엔티티만 준영속 상태로 전환
- em.remove(객체) // 삭제
- em.clear() // 영속성 컨텍스트를 완전히 초기화
em.close() // 영속성 컨텍스트를 종료- 하이버네이트5.4.1Final 부터 영속성 컨텍스트 종료 후에도 트랜잭션이 종료상태가 아니라면 프록시를 초기화할 수 있다.
- 삭제
- 삭제된 상태
- removed
💠 영속성 컨텍스트의 이점
- 1차 캐시
- { @Id : Entity } 형식으로 저장됨
- em.find(id) 값으로 조회시 1차 캐시에 있다면 Entity 반환
- 캐시에 없으면 DB에서 조회후 1차 캐시에 저장한 다음 반환
- 동일성(identity) 보장
- 1차 캐시로 반복 가능한 읽기(REPEATABLE READ) 등급의 트랜잭션 격리수준을 애플리케이션 차원에서 제공
- 같은 객체 조회 후 비교시 True
- 트랜잭션을 지원하는 쓰기 지연
- persist(객체)하면 쓰기 지연 SQL 저장소에 Insert SQL을 담는다. (버퍼)
- 트랜잭션 시작후 commit()로 커밋 시 Insert SQL을 보낸다.
- 변경 감지 (Dirty Checking)
- 영속상태 엔티티의 한해서 데이터 수정시 자동으로 Update SQL을 생성한다.
- 지연 로딩(Lazy)
✔️ 플러시
영속성 컨텍스트의 변경내용을 데이터베이스에 반영
플러시 발생 과정
- 변경 감지
- 수정된 엔티티 쓰기 지연 SQL 저장소에 등록
- 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송
플러시 하는 법
em.flush() // 직접 호출
트랜잭션 커밋 // 플러시 자동 호출
JPQL 쿼리 실행 // 플러시 자동 호출
💠 모드 옵션
em.setFlushMode(FlushModeType)
- FlushModeType.AUTO : 커밋이나 쿼리 실행시 플러시 (default)
- FlushModeType.COMMIT : 커밋할 때만 플러시
❗ 플러시 유의점
- 영속성 컨텍스트를 비우지 않음
- 영속성 컨텍스트의 변경내용을 데이터베이스에 동기화
- 트랜잭션 작업단위가 중요
- 커밋 직전에만 동기화 하면 됨
🔖 학습내용 출처
자바 ORM 표준 JPA 프로그래밍 - 기본편 / 김영한
자바 ORM 표준 JPA 프로그래밍 - 기본편 강의 | 김영한 - 인프런
김영한 | JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., 실무에서도
www.inflearn.com
'Back-End > JPA' 카테고리의 다른 글
JPA - 1:N 단방향과 양방향에 대해서 (0) | 2024.07.09 |
---|---|
JPA - 다양한 연관관계 매핑 (0) | 2024.07.09 |
JPA - 연관관계 매핑 기초 (0) | 2024.07.05 |
JPA - 엔티티 매핑 (0) | 2024.07.05 |
JPA 소개 (0) | 2024.07.01 |