에러 안나게 해주세요

JPA + 영속성 관리 본문

Spring/JPA

JPA + 영속성 관리

Coom 2021. 3. 15. 16:46

JPA

1. 1차 캐시와 동일성 보장

- 같은 트랜잭션 안에서는 같은 엔티티를 반환 - 약간의 조회 성능 향상

- DB Isolation Level이 Read Commit이어도 애플리케이션에서 Repeattable Read 보장

 

2. 트랜잭션을 지원하는 쓰기 지연 - INSERT

- 트랜잭션을 커밋할 때까지 INSERT SQL을 모음.

- JDBC BATCH SQL 기능을 사용해서 한번에 SQL 전송.

 

3. 지연 로딩과 즉시 로딩

- 지연 로딩 : 객체가 실제 사용될 때 로딩

- 즉시 로딩 : JOIN SQL로 한번에 연관된 객체까지 미리 조회

 

ORM은 객체와 RDB 두 기둥 위에 있는 기술

 

주의

- 엔티티 매니저 팩토리는 하나만 생성해서 애플리케이션 전체에서 공유

- 엔티티 매니저는 쓰레드간에 공유X (사용하고 버려야 한다);

- JPA의 모든 데이터 변경은 트랜잭션 안에서 실행

 

JPQL 소개

-가장 단순한 조회 방법

> EntityManger.find()

> 객체 그래프 탐색 (a.getB().getC())

- 나이가 18살 이상인 회원을 모두 검색하고 싶다면??

 

JPA에서 가장 중요한 2가지

- 객체와 관계형 데이터베이스 매핑하기

- 영속성 컨텍스트

 

엔티티 매니저 팩토리와 엔티티 매니저

 

EntityManagerFactory

>고객 요청시 EntityManager를 생성해준다.

 

영속성 컨텍스트란 ?? >>> '엔티티를 영구 저장하는 환경'

 

엔티티의 생명주기

 

- 비영속 (new/transient)

> 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태 (객체만 생성한 상태)

 

- 영속 (managed)

> 영속성 컨텍스트에 관리되는 상태 (객체를 저장한 상태 -> em.p)

 

- 준영속 (detached)

> 영속성 컨텍스트에 저장되었다가 분리되는 상태

 

- 삭제 (removed)

> 삭제된 상태

 

 

엔티티 조회, 1차 캐시

> 엔티티 조회 시, 영속 컨텍스트 내의 1차 캐시에서 조회

멤버 엔티티에서 캐시의 값이 있을 경우 1차 캐시에서 값을 반환한다.

 

- 데이터베이스에서 조회

1. 1차 캐시에 없을 경우 

2. DB 조회

3. 1차 캐시에 저장

4. 반환

 

>>>> 사실 큰 도움은 안된다.. 엔티티 매니저는 대단위에서 트랜잭션을 만들고 지워버린다.

여러명의 고객이 사용하는 캐시가 아닌 한 트랜잭션 안에서만 효과가 있다. 성능 이점 X

 

JPA 변경 감지

1.flush()

2. 엔티티와 스냅샷 비교 (1차 캐시)

3. UPDATE SQL 생성 (쓰기 지연 SQL 저장소) em.persist() 사용 x

4. flush

5. commit

 

플러시(flush)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'Spring > JPA' 카테고리의 다른 글

엔티티 매핑 (2)  (0) 2021.03.16
엔티티 매핑 (1)  (0) 2021.03.16
JPA 기초 - 정리 -  (0) 2021.03.16
준영속 상태  (0) 2021.03.16
플러시  (0) 2021.03.15