티스토리 뷰
1. JPA에서 가장 중요한 2가지
- 1 ) 객체와 관계형 데이터 베이스 메핑하기
- 2 ) 영속성 컨텍스트 ( <<< 오늘 배울 것! )
2. 엔티티 매니저 펙토리와 엔티티 매니저
- 엔티티 매니저 펙토리에서 요청이 들어올 때마다 엔티티 매니저를 생성한다.
- 엔티티 매니저는 내부적으로 DB 커낵션을 사용하여 DB에 접근한다.
3. 영속성 컨텍스트란?
- JPA를 이해하는데 가장 중요한 용어이다.
- "엔티티를 영구 저장하는 환경"이라는 의미를 지닌다
- EntityManager.persist(entity);
- 엔티티 매니저를 통해서 영속성 컨텍스트에 접근한다.
- 내부에 1차 캐시를 지니고 있다. ( DB에서 조회하는 것이 아니라 1차 캐시에서 조회하게 된다. )
- + 만약, 1차 캐시에 조회하고자 하는 것이 없다면 DB로 넘어가서 조회하고 이를 1차 캐시에 저장해 반환하게 된다.
4. 엔티티의 생명주기
- 비영속 ( new / transient )
- : 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태
- : 객체를 생성만한 상태 ( ex. member을 생성한 후 setId나 setName만 한 상태 )
- 영속 ( managed )
- : 영속성 컨텍스트에 의해 관리되는 상태
- : 객체를 생성한 후, manager.persist(member);을 한 상태
- 준영속 ( detached )
- : 영속성 컨텍스트에 저장되었다가 분리된 상태
- 삭제 ( removed )
- : 삭제된 상태
5. 영속성 컨텍스트의 이점
- 1 ) 영속 엔티티의 동일성을 보장해 준다.
- : 우리가 보통 객체를 비교할 때에는 참조타입의 비교처럼 주소를 대상으로 비교하기에 같은 값을 가져도 == 비교를 하게 되면 동일하지 않다고 나오게 되는데, 영속성 컨텍스트는 이러한 문제를 해결해 준다. ( 1차 캐시가 있기에 가능 )
- 2 ) 엔티티를 등록할 때, 트랜잭션을 지원하는 쓰기 지연이 가능해 진다.
- : 커밋을 하기 전까지, INSERT SQL을 데이터베이스( DB )에 보내지 않는다.
- 3 ) 엔티티 수정이 간편하다.
- : 엔티티를 수정할 때, 값만 바꿔준다면 업데이트를 해주지 않아도 DB의 값이 변경된다.
6. 플러시란?
- 영속성 컨텍스트의 변경내용을 데이터베이스에 반영하는 것
- 플러시가 발생하면 생기는 일 :
- 1 ) 변경 감지
- 2 ) 수정된 엔티티를 쓰기 지연 SQL 저장소에 등록
- 3 ) 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 등록
- 영속성 컨텍스트를 플러시하는 방법 :
- 1 ) manager.flush() : 직접 호출 ( 강제로 플러시하는 방법 )
- 2 ) 트랜잭션 커밋( tx.commit ) : 플러시가 자동으로 호출
- 3 ) JPQL 쿼리 실행 : 플러시가 자동으로 호출
- + JPQL 쿼리가 실행될 때 플러시가 자동으로 호출되는 이유는 만약 쓰기 지연 SQL 저장소에만 등록이 되어있을 경우, JPQL을 실행하다가 DB에 잘못 접근할 가능성이 있기에 플러시가 자동으로 호출이 된다.
- + 플러시를 하게 된다고 하여도, 1차 캐시에 있는 것이 사라지는 것은 아니다. (**)
- 플러시 모드 옵션 2가지 :
- 1 ) FlushModeType.AUTO : 커밋이나 쿼리를 실행할 때, 플러시가 자동으로 된다. ( 기본값 )
- 2 ) FlushModeType.COMMIT : 커밋할 때만 플러시가 된다.
- 정리 :
- 1 ) 플러시는 영속성 컨텍스트를 비우지 않는다.
- 2 ) 플러시는 영속성 컨텍스트의 변경내용을 데이터베이스에 동기화시켜준다.
- 3 ) 플러시에서는 트랜잭션이라는 작업 단위가 중요하다. ( 커밋 직전에만 동기화해주면 된다. )
7. 준영속 상태란?
- 영속( manager.persist( entity ) )상태의 엔티티가 영속성 컨텍스트에서 분리되는 것( detached )
- 준영속 상태일 경우 영속성 컨텍스트가 제공하는 기능을 활용하지 못한다.
- 준영속 상태로 만드는 방법 :
- 1 ) manager.detach( entity ) : 특정 엔티티만 준영속 상태로 전환한다.
- 2 ) manager.clear() : 영속성 컨텍스트를 완전히 초기화한다. ( 1차 캐시를 완전히 지워버린다. )
- 3 ) manager.close() : 영속성 컨텍스트를 완전히 닫아버린다. ( 종료시켜 버린다. )
728x90
'[스터디] 김영한]' 카테고리의 다른 글
05. 데이터베이스 스키마 자동 생성 (0) | 2022.12.15 |
---|---|
04. 엔티티 매핑 ( 1 ) - 엔티티 매핑의 종류 (0) | 2022.12.14 |
02. Hello JPA 프로젝트 - JPA 연습 (0) | 2022.11.21 |
01. JPA와 모던 자바 데이터 저장 기술 (0) | 2022.11.16 |
댓글