HomeAboutMeBlogGuest
© 2025 Sejin Cha. All rights reserved.
Built with Next.js, deployed on Vercel
🛁
공부기록
/
🧑🏻‍💻
TIL
/
TIL - 24

TIL - 24

태그
Spring
JPA
날짜
May 10, 2022
속성

영속성 컨텍스트

  • ORM - Object Relation Mapper
    • 테이블과 자바의 오브젝트를 매핑해주는 프레임워크

Entity

  • RDB의 테이블에 해당하는 자바 오브젝트
@Entity@Table(name = "customers") public class CustomerEntity { @Id private Long id; private String firstName; private String lastName; // getter / setter ~~ }

EntitiyManagerFactory,

  • Entity를 관리하는 EntityManager 생성하는 공장
  • 스레드에 안전하다.
  • 비용이 비싸 하나만 만들어 두고 엔티티를 관리해 줄 수 있는 EntityManager를 생성하는 팩토리성 클래스이다.

EntityManager

  • EntityManager는 엔티티를 저장하고, 수정, 삭제 CRUD 등 엔티티와 관련된 모든 일을 처리한다.
  • 스레드에 안전하지 않다. 여러 스레드에서 동시에 접근할 경우 동시성 이슈가 발생할 수 있다.
  • 엔티티 매니저는 스레드가 시작할 때 커넥션을 획득한다. > 각각 다른 스레드의 요청 스레드 세이프 하지 않기 때문에 팩토리가 각각 요청에 맞는 매니저를 생성한다. > 엔티티 메니저는 디비 커넥션 풀을 관리하는 녀에서 커넥션을 각각 가져와 디비와 연결작업을 한다. > 커넥션들은 디비 커밋이 일어날 때 그때 커넥션을 가져와 사용하는 구조로 되어있다.
    • notion image

영속성 컨텍스트

  • JPA를 이용하는데 가장 중요한 요소이다.
  • 엔티티를 영구 저장하는 환경이라는 뜻이다.
  • 엔티티매니저는 엔티티 영속성 컨텍스트에 보관하고 관리한다.
  • 엔티티는 엔티티매니저에 의해 영속성 컨텍스트에서 관리된다.
    • notion image

영속성 컨텍스트의 특징

  • 영속성 컨텍스트와 식별자 값
    • 영속성 컨텍스트 안에서 관리되는 엔티티는 식별자 값을 반드시 가져야한다.
    • key-value로 엔티티를 관리하기 때문이다.
  • 영속성 컨텍스트와 데이터베이스 저장
    • JPA는 트랜잭션을 커밋하는 순간 영속성 컨텍스트에 새로 저장된 엔티티를 DB에 반영한다. (FLUSH)
    • 플러쉬는 영속성 컨텍스트의 변경 내용을 DB에 동기화하는 작업인데, 이때 등록, 수정, 삭제한 엔티티를 DB에 반영한다.
  • 영속성 컨텍스트가 엔티티를 관리함으로 얻는 이점
    • 1차 캐시
    • 동일성 보장
    • 트랜잭션을 지원하는 쓰기지연
    • 변경 감지
    • 지연 로딩

엔티티의 생명주기

notion image
* 비영속(new / transient) * 영속성 컨텍스트와 전혀 관계가 없는 상태
// 데이터베이스와 무관한 상태 Customer customer = new Customer(); customer.setId(1L); customer.setFirstName("uk"); customer.setLastName("kim");
  • 영속(managed)
    • 영속성 컨텍스트에 저장된 상태
    • Customer customer = new Customer(); customer.setId(1L); customer.setFirstName(“uk”); customer.setLastName(“kim”); // 영속성 컨텍스트에서 관리되도록 함 em.persist(customer)
  • 준영속(detached)
    • * 영속성 컨텍스트에 저장되었다가 분리된 상태
      java Customer customer = new Customer(); customer.setId(1L); customer.setFirstName(“uk”); customer.setLastName(“kim”); // 관리되는 상태 em.persist(customer); // 준영속으로 만들고 싶을때 // 영속상태의 customer 객체를 영속성 컨텍스트에서 분리 em.detach(customer); // 영속 상태의 모든 객체를 영속성 컨텍스트에서 분리 em.clear(); // 영속성 컨텍스트 종료 em.close();
  • 삭제(remove)
    • 삭제된 상태
    • // customer 엔티티를 영속성 컨텍스트에서 분리하고 디비에서도 삭제 em.remove(customer)

Cusotomer 엔티티를 통한 영속성 컨텍스트 이해

  • 저장
EntityManagerFactory emf = Persistence.createEntityManagerFactory("customers"); EntityManager em = emf.createEntityManager(); EntityTransaction transaction = em.getTransaction(); transaction.begin(); Customer customer = new Customer(); // 비영속상태 customer.setId(1L); customer.setFirstName("hyounguk"); customer.setLastName("kim"); em.persist(customer); // 영속상태 transaction.commit(); // 트랜잭션 커밋 // 커밋이 되는 순간 쿼리가 수행됨 flush ! db와 동기화됨
notion image