티스토리 뷰

[스터디] 김영한]

03. 영속성 관리

monimoni 2022. 11. 30. 21:03

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
댓글
«   2024/09   »
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
최근에 올라온 글
Total
Today
Yesterday
공지사항