영속성 컨텍스트란?
- 엔티티를 영구 저장하는 환경
- 애플리케이션과 DB사이에서 객체를 보관하는 논리적 개념
영속성 컨텍스트 장점
1차 캐시
1차캐시는 처음에 persist(user1)로 데이터를 넣으면 DB에 바로 저장되는 것이 아니라 1차 캐시라는 곳에 들어가 있는데 이때 만약 다름 쿼리가 em.find(User.class,user1)인 경우 DB에서 조회를 할 필요없이 1차 캐시에서 발견하였기 때문에 빠르게 반환가능
동일성 보장
두 개의 엔티티가 서로 같은 엔티티인지 DB차원에서 할 필요없이 바로 애플리케이션 차원에서 확인이 가능
트랜잭션을 지원하는 쓰기 지연
만약 em.persist(user1); em.persist(user2); 를 하였을경우 각각 DB에 커밋을 하는 것이 아니라 쓰기 지연 저장소에 모아두었다가 커밋이 되는 순간 쓰기 지연 저장소에 있는 엔티티를 DB에 날린다.
변경 감지(더티 체킹)
- 말그대로 기존에 있던 엔티티에 변경이 생긴 경우 update쿼리를 직접 날려주지 않아도 flush()를 통해 자동으로 update문 쿼리를 날려줌
- DB에 커밋이 실행되면 flush()가 되는데 이때 엔티티와 스냅샷을 비교함 →
1차캐시에는 스냅샷이 있는데 값을 읽어왔을 때 최초 시점을 저장함(스냅샷) →
비교해서 엔티티와 스냅샷을 비교해서 바뀐 엔티티가 있으면 변경을 함
플러시가 발생하는 경우
- 변경 감지
- 수정된 엔티티 쓰기 지연 SQL저장소에 등록
- 쓰기 지연 SQL저장소의 쿼리를 DB에 전송(등록, 수정, 삭제 쿼리)
플러시의 특징
- 플러시가 되어도 영속성 컨텍스트를 비우지 않음
- 영속성 컨텍스트의 변경내용을 DB에 동기화
준영속 상태란?
- 영속성 컨텍스트를 사용하지 않는 상태를 의미
영속 상태의 엔티티가 영속성 컨텍스트에서 분리(detatch) → 영속성 컨텍스트가 제공하는 기능을 사용하지 못함
(ex. update, delete등)
객체와 테이블
@Entity
- @Entity가 붙은 클래스는 JPA가 관리
- 기본 생성자가 필수
- final클래스, enum, interface, inner클래스에는 사용 못함
- 저장할 필드에 final사용X
DDL생성기능
- @Column(length=10) → 길이가 10초과 X
- DDL생성기능은 DDL을 자동 생성할 때만 사용되고 JPA의 실행로직에는 영향X
- 즉 런타임에 영향X
@Column종류
- @Enumerated 기본 값이 ORDINAL이므로 반드시 STRING으로 변경!
기본 키 매핑
직접 할당
- @Id만 사용
자동 생성
- @GeneratedValue
- strategy = GenerationType.IDENTITY)
- 기본 키 생성을 데이터베이스에 위임, auto-increment적용
- (strategy = GenerationType.AUTO)
- 방언에 따라 자동 지정, 기본값
IDENTITY전략
- JPA는 보통 트랜잭션 커밋 시점에 INSERT SQL 실행
- AUTO_ INCREMENT는 데이터베이스에 INSERT SQL을 실행 한 이후에 ID 값을 알 수 있음
- IDENTITY 전략은 em.persist() 시점에 즉시 INSERT SQL 실행하고 DB에서 식별자를 조회
'JPA' 카테고리의 다른 글
JPA_DataSource (1) | 2023.10.17 |
---|---|
JPA_값 타입 (0) | 2023.10.05 |
JPA_프록시와 연관관계관리 (0) | 2023.09.26 |
JPA_연관 관계 매핑 (0) | 2023.09.23 |