시뻘건 개발 도전기

Entity와 영속성 #1 본문

API/JPA

Entity와 영속성 #1

시뻘건볼때기 2020. 11. 29. 17:26
반응형

  JPA를 사용하기 위한 설정과 동작 원리에서 언급했던가?

엔티티 매니저 팩토리는 여러 스레드가 동시에 접근해도 안전하기 때문에 서로 다른 스레드 간에 공유해서 사용이 가능 하지만 엔티티 매니저는 여러 스레드가 동시에 사용하게 되면 동시성 문제가 발생하여 스레드 간의 공유가 불가능하다.

 

  영속성 컨텍스트

  영속성 컨텍스트는 JPA를 이해하기에 가장 중요하다고 할 수 있다. 영속성 컨텍스트는 '엔티티를 영구적으로 저장하는 환경'이라고 정의되어 있으나 도통 이 말이 이해가되지 않는다. 말로 풀어서 이야기 한다면 엔티티 매니저로 엔티티를 저장하거나 조회하면 엔티티 매니저는 데이터베이스가 아닌 어떠한 공간에 보관하고 관리하는데 이 공간이 영속성 컨텍스트다. 지금까지 살펴본 persist(member)의 메소드가 바로 영속성 컨텍스트에 저장하는 코드가 되겠다.

  엔티티에는 4가지의 상태가 있다.

- 비영속 상태 : 영속성 컨텍스트와 전혀 관계가 없는 상태

- 영속 상태 : 영속성 컨텍스트에 저장된 상태

- 준영속 상태 : 영속 상태였다가 분리된 상태

- 삭제 상태 : 삭제된 상태

엔티티 생명주기

엔티티의 4가지 상태에 대해 알아보자.

- 비영속

Member member = new Member();
member.setName("dotori");

비영속 예시

member를 생성 했으나 영속 컨텍스트에는 저장하지 않았다. 그러므로 member는 비영속 상태에 있다고 할 수 있다.

 

- 영속

Member member = new Member();
member.setName("dotori");
em.persist(member);

영속 예시

엔티티 메니저를 통해서 member를 영속 컨텍스트에 저장했다. 그러므로 member는 영속상태에 있다고 할 수 있다. 영속 상태라는 것은 영속 컨텍스트에 의해 관리된다는 것을 명심하자.

 

- 준영속

Member member = new Member();
member.setName("dotori");
em.persist(member);

em.detach();
em.close();
em.clear();

엔티티 매니저로부터 detach 혹은 close, clear를 하게 되면 준영속 상태에 있다고 할 수 있다.

 

- 삭제

Member member = new Member();
member.setName("dotori");
em.persist(member);

em.remove(member);

엔티티를 영속성 컨텍스트와 데이터베이스에서 제거한다. 그러므로 삭제 상태에 있다고 할 수 있다.

 

 

영속성 컨텍스트의 특징

- 영속성 컨텍스트와 식별자 값

  엔티티의 식별자(@Id로 맵핑이 된 필드)로 영속성 컨텍스트를 구분한다. 그 말은 즉슨 영속 상태는 반드시 식별자 값이 있어야 한다는 것이다.

 

- 영속성 컨텍스트와 데이터베이스 저장

  영속성 컨텍스트와 데이터베이스는 별개의 공간이다. 그렇다면 JPA는 영속성 컨텍스트의 엔티티를 데이터베이스에 언제 저장할까? 보통 트랜잭션을 커밋하는 순간 영속성 컨텍스트에 새로 저장된 엔티티를 데이터베이스에 반영하는데 이것을 flush라고 한다.

 

- 영속성 컨텍스트가 엔티티를 관리하면 다음과 같은 장점이 있다.

  • 1차 캐시
  • 동일성 보장
  • 트랜잭션을 지원하는 쓰기 지연
  • 변경 감지
  • 지연 로딩

 

 

반응형

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

Entity와 영속성 #3  (0) 2020.11.29
Entity와 영속성 #2  (0) 2020.11.29
JPA를 사용하기 위한 설정과 동작 원리  (0) 2020.09.29
JPA란?  (0) 2020.09.24
DB 연동 시 유의할 점 #2  (0) 2020.09.18
Comments