Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 상속관계 매핑
- 동시 세션 제어
- form login
- 기본값 타입
- AnonymousAuthenticationFilter
- 기본 키 매핑
- 세션 생성 정책
- 값 타입 컬렉션
- spring jpa
- SessionManagementFilter
- field column mapping
- Remember-me
- Database
- 세션 고정 보호
- 임베디드 타입
- 다대다
- orphanRemovel
- MySQL
- Spring Security
- 객제지향 쿼리 언어
- TABLE
- jpa
- JPQL
- 양방향 매핑
- 지연 로딩
- concurrentsessionfilter
- ddl-auto
- 값 타입 비교
- 즉시 로딩
- @MappedSuperclasss
Archives
- Today
- Total
hoondev
[Spring JPA] 영속성 컨텍스트 본문
영속성 컨텍스트
영속성 컨텍스트는 엔티티를 영구히 저장하는 환경이라는 뜻이다.
엔티티의 생명 주기
비영속 (new / transient)
영속성 컨텍스트와 관계없는 새로운 상태.
영속 (managed)
em.persist(entity);
영속성 컨텍스트에 관리되는 상태.
준영속 (detached)
em.detach(entity);
영속성 컨텍스트에 저장되었다가 분리된 상태.
삭제 (removed)
em.remove(entity);
삭제된 상태.
영속성 컨텍스트 사용 이점
1차 캐시
JPA는 엔티티를 persist하고 다시 조회하면 데이터베이스에서 조회하지 않고 1차캐시에서 엔티티를 조회한다.
만약 1차캐시에 엔티티가 없으면 데이터베이스에서 조회하고 1차캐시에 저장한다. 그후 다음 요청부턴 1차 캐시에 저장된 값을 불러온다.
영속 엔티티의 동일성 보장
영속 엔티티의 동일성을 보장한다. 예를 들어
Member a = em.find(Member.class, "member1");
Member b = em.find(Member.class, "member2");
System.out.println(a == b) // true
트랜잭을 지원하는 쓰기 지연
엔티티를 저장하면 바로 inser query를 날리지 않고 쓰기 지연 SQL 저장소에 insert query를 저장해두었다가 커밋을 할때 쓰기 지연 저장소에 있던 쿼리들이 flush되면서 db에 저장된다.
transaction.begin();
em.persist(memberA);
em.persist(memberB);
// 여기까지 INSERT SQL을 데이터베이스에 보내지 않는다.
transaction.commit(); // 커밋하는 순간 DB에 INSERT SQL이 보낸다.
엔티티 수정
엔티티를 수정할때 em.update()같은 코드가 없어도 자동으로 수정을 해준다.
바로 변경감지(Dirty Checking) 기능덕분이다.
커밋을하면 플러시가 호출되고 1차캐시에 있는 엔티티와 스냅샷을 비교하게 된다. 스냅샷은 엔티티 최조 조회시점의 엔티티를 저장해놓은 값이다.
만약 비교한값이 차이가 있다면 update쿼리를 생성하고 쓰기 지연 SQL 저장소에 저장한다.
커밋이 일어날때 쓰기 지연 SQL 저장소에 있던 쿼리들을 db에 보내면서 수정이 완료된다.
Reference
'Spring JPA' 카테고리의 다른 글
[Spring JPA] 데이터베이스 스키마 자동 생성 (0) | 2023.01.20 |
---|---|
[Spring JPA] 객체와 테이블 매핑 (0) | 2023.01.19 |
[Spring JPA] 준영속 (0) | 2023.01.18 |
[Spring JPA] 플러시 (0) | 2023.01.17 |
[Spring JPA] ORM, JPA (0) | 2023.01.13 |
Comments