[SpringBoot] Entity와 영속성 컨텍스트

예돌이·2023년 10월 10일
0

Spring

목록 보기
2/3

1. Entity

RDB의 Table과 직접적으로 매핑되는 객체이다

  • EntityManagerFactory

    • Entity를 관리하는 EntityManager를 생산하는 공장이다
    • Thread Safe하다
  • EntityManager

    • EntityManager는 Entity를 저장하고, 수정하고, 삭제하고, 조회하는(CRUD)등 Entity와 관련된 모든 일을 처리한다.
    • read Safe 하지 않다. 동시에 접근할 경우 동시성 이슈가 발생할 수있다
    • EntityManager는 트랜잭션을 시작할때 커넥션을 획득한다.

2. 영속성 컨텍스트

  • JPA를 이용하는데 가장 중요한 요소이다

  • 엔티티를 영구 저장하는 환경이라는 뜻이다.

  • 엔티티 매니저는 엔티티를 영속성 컨텍스트에 보관하고 관리한다.
    *엔티티는 엔티티 매니저에 의해 영속성 컨텍스트에서 관리된다.

  • 1차 캐시의 조회 동작
    (1) 조회 시에 1차 캐시에 데이터가 이미 있는지 확인하고, 데이터가 있으면 가져온다.
    (2) 1차 캐시에 데이터가 없다면, 데이터 베이스에 데이터를 요청한다.
    (3) 데이터 베이스에서 받은 데이터를 다음에 재사용 할 수 있도록 1차 캐시에 저장한다.

3. 연속성 컨텍스트의 특징

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

    • 영속성 컨텍스트 안에서 관리되는 엔티티는 식별자 값을 반드시 가져야 한다.
      : key-value로 엔티티를 관리하기 때문이다
  • 영속성 컨텍스트와 데이터 베이스 저장

    • JPA는 트랜잭션을 커밋하는 순간 영속성 컨텍스트에 새로 저장된 엔티티를 DB에 반영한다.
      : 플러시(Flush)는 영속성 컨텍스트의 변경 내용을 DB에 동기화하는 작업인데, 이때 등록, 수정, 삭제한 엔티티를 DB에 반영한다.

4. 엔티티 생명 주기

  • 비영속 New
    객체가 영속성 컨텍스트와 전혀 관계가 없는 상태
    Member member = new Member();
    member.setId(1L);
    member.setName("Yeji");
  • 영속 Managed
    영속성 컨텍스트에 저장된 상태
    Member member = new Member();
    member.setId(1L);
    member.setName("Yeji");
    EntityManager em = new EntityManager();
    em.persist(customer); //영속화
  • 준영속 Detached
    영속성 컨텍스트에 저장되었다가 분리된 상태
    // 영속상태의 객체 member를 영속성 컨텍스트에서 분리
    em.detach(member);
    // 영속상태의 모든 객체를 영속성 컨텍스트에서 분리.
    em.clear();
    // 영속성 컨텍스트를 종료한다.
    em.close();`
  • 삭제 Removed
    삭제된 상태
    // member 객체를 영속성 컨텍스트에서 분리하고, DB에서 삭제한다
    em.remove(member);

5. Member 엔티티를 통한 영속성컨텍스트 이해

// 엔티티 매니저 생성
EntityManagerFactory emf = new EntityManagerFactory();
EntityManager em = emf.createEntityManager();

// 트랜잭션 획득
EntityTransaction transaction = em.getTransaction();

// 트랜잭션 시작 (엔티티 매니저는 트랜잭션을 시작할때 커넥션을 획득)
transaction.begin();

// 비영속 상태
Member member = new Member():
member.setId(1L);
member.setName("Yeji");

// 영속화
em.persist(member)

// 트랜잭션 commit (트랜잭션이 커밋되는 순간 쿼리가 수행된다)
transaction.commit();

이 모든 과정을 추후에 @Repository라는 어노테이션 하나로 EntityManager를 사용하지 않아도 된다. 왜냐하면 해당 어노테이션은 JpaRepositroy를 상속받은 인터페이스를 사용하기 떄문에 EntityManager가 자동으로 주입되기 때문이다.

6. 엔티티 매니저를 이용한 객체의 데이터 조회 (CRUD 중 Read)

@Test
void 조회(){
	EntityManager em = emf.createEntityManager();
    EntityTransaction transaction = em.getTransaction();
    transaction.begin();
    
    Member member = new Member();
    member.setId(1L);
    member.setName("Yeji");
    
    em.persist(member);
    transaction.commit();
    
    //em.clear(); //영속성 컨텍스틀로 초기화(1차캐쉬 사라짐, DB조회 해야함)
    
    Member getMember = em.find(Member.class, 1L);
    log.info("{}", entity.getName());
}

프로그래머스 JPA강의를 듣고 혼자 끄적이는 글입니다..
다음편은 언젠가 돌아올게요..

0개의 댓글

관련 채용 정보