JPA - 영속성의 이해(persistence)

JungSik Heo·2022년 10월 12일
0
post-custom-banner

1.영속성(영속성 컨텍스트)이란?

  • JPA 에서의 영속성은 위의 단어 해석처럼 Entity를 영구적으로 저장해주는 환경

2.EntityManagerFactory 와 EntityManager

  • 데이터베이스를 하나만 사용하는 어플리케이션은 일반적으로 EntityManagerFactory를 하나만 생성한다.
  • EntityManager
    • 실제 Transaction 단위를 수행할 때마다 생성한다.
    • 즉, 고객의 요청이 올 때마다 사용했다가 닫는다.
    • thread 간에 공유하면 안된다. (사용하고 버려야 한다.)

3.엔티티 생명주기

1.비영속(new/ transient ) 상태 : 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태

-객체를 단순히 '생성만' 한 상태로, 영속성 컨텍스트와는 전혀 관계가 없다.

Member member = new Member();
member.setId("member1");
member.setUsername("회원1");

2.영속(managed) 상태 : 영속성 컨텍스트에 관리 되는 상태

-영속성 컨텍스트에 저장되어있는 상태

-persist는 DB에 쿼리를 날려 DB에 저장하는 작업이 아닌, 객체(Entity)를 영속성 컨텍스트에 저장하는 작업

// 객체를 생성한 상태 (비영속)
Member member = new Member();
member.setId("member1");
member.setUsername("회원1");
EntityManager entityManager = entityManagerFactory.createEntityManager();
entityManager.getTransaction().begin();
// 객체를 저장한 상태 (영속)
entityManager.persist(member);

  1. 준영속(detached) 상태 : 영속성 컨텍스트에 있다가 빠져나온(분리)된 상태

-영속성 컨텍스트에서 지운 상태

// 회원 엔티티를 영속성 컨텍스트에서 분리, 준영속 상태
entityManager.detach(member);
  1. 삭제(removed) 상태 : 삭제된 상태
    -실제로 DB에서 삭제를 요청한 상태
// 객체를 삭제한 상태
entityManager.remove(member);

★1차캐시 : 영속성 컨텍스트에는 1차캐시라는것이 존재하는데, 1차캐시를 영속성 컨텍스트라고 이해해도 좋다.

1차 캐시
//엔티티를 생성한 상태(비영속) 
Member member = new Member(); 
member.setId("member1"); 
member.setUsername("회원1");   
//엔티티를 영속(1차캐시에 저장)
em.persist(member);

영속성 컨텍스트는 아래와 같은 메커니즘을 가지고 동작한다. Member라는 객체로 예를 들겠다.

먼저 JPA에서 member라는 객체를 조회하면, DB에 select 쿼리문을 날려서 조회를 하기 전에 1차캐시에 조회하려던 member가 저장되어있는지 확인한다.
만약 1차캐시에 이미 저장되어있다면 조회 쿼리를 날리지 않고 1차 캐시에 있는 데이터를 가져온다.
만약 1차 캐시에 데이터가 존재하지 않는다면 조회 쿼리를 날린 후 DB에서 조회를 하고 1차캐시에 저장한 다음에 값을 반환한다.

profile
쿵스보이(얼짱뮤지션)
post-custom-banner

0개의 댓글