[Spring JPA ] JPA동작방식 개념과 영속성 컨텍스트

JEONG SUJIN·2024년 11월 16일
0

스프링부트 JPA

목록 보기
1/24

구성 요소 설명

관계를 도식으로 표현

JPA (Java Persistence API)
  └─ EntityManagerFactory
       └─ EntityManager
            └─ Persistence Context (영속성 컨텍스트)
  1. JPA (Java Persistence API)

    • ORM(Object-Relational Mapping)을 위한 표준 스펙.
    • 엔터티 관리와 데이터베이스 동기화를 위한 규칙 정의.
  2. EntityManagerFactory

    • 영속성 단위를 기반으로 EntityManager를 생성하는 팩토리 객체.
    • 애플리케이션 전역에서 한 번만 생성.
    • 데이터베이스 연결 설정 및 영속성 단위 정보 포함
    • 영속성 컨텍스트를 생성할 수 있는 EntityManager를 생성하는 팩토리
    • 애플리케이션 전체에서 한 번만 생성되며, 데이터베이스 연결 설정 및 영속성 단위의 정보를 포함.
  1. EntityManager
    • 영속성 컨텍스트(Persistence Context)를 직접 관리하는 객체.
    • 엔터티 저장, 조회, 수정, 삭제와 같은 작업을 수행.
    • 트랜잭션 범위에서 사용되며, 스레드에 안전하지 않음.
    • Transaction 수행 후에는 반드시 EntityManager 를 닫는다.
  1. Persistence Context (영속성 컨텍스트)
    • 가장 중요한 용어
    • 엔터티 객체를 관리하는 1차 캐시 역할.
    • 엔터티의 상태(영속/준영속/비영속)를 추적.
    • 데이터베이스와의 동기화를 책임지는 공간.

관계 정리

  • EntityManagerFactoryEntityManager를 생성하는 팩토리.
  • EntityManager영속성 컨텍스트를 생성 및 관리.
  • 영속성 컨텍스트는 엔터티 객체를 관리하며, 데이터베이스와 동기화.
Item item = new Item(); // 객체생성 비영속 상태, JPA영속성 컨텍스트와 연결되지 않음. 
item.setItemNm("테스트 상품"); //Item 객체의 속성(itemNm)에 값을 설정, 여전히 비영속 상태


/*
EntityManagerFactory를 사용하여 EntityManager 객체를 생성
EntityManagerFactory는 데이터베이스와의 연결을 설정하고 EntityManager를 생성하는 팩토리
EntityManager는 영속성 컨텍스트(Persistence Context)를 관리하는 역할
새롭게 생성된 EntityManager는 데이터베이스와의 작업을 관리
*/
EntityManager em = entityManagerFactory.createEntityManager();


/*
EntityTransaction 객체를 가져옴.
EntityTransaction은 데이터베이스 작업(삽입, 수정, 삭제)을 묶어서 처리하는 트랜잭션을 
시작하거나 커밋/롤백하는 역할
*/
EntityTransaction transation = em.getTransaction();

// 트랜잭션 시작, DB작업 실행 하기전에 준비
transation.begin(); 


//Item 객체를 영속성 컨텍스트에 등록
em.persiste(item); 

transation.commit(); // 트랜잭션을 DB에 반영

em.close(); // 엔티티매니저close()메서드를 호출해 사용한 자원을 반환
emf.close(); // 엔티티매니저팩토리의 close()메서드를 호출해 사용한 자원을 반환

엔티티의 생명주기 (Entity LifeCycle)

  1. 비영속(Transient)
    JPA의 영속성 컨텍스트와 완전히 연관되지 않은 상태
    단순히 메모리 상에서만 존재하며, 데이터베이스와는 전혀 관련이 없다.
    new 키워드로 객체를 생성했을 때 비영속 상태
Item item = new Item(); // 비영속 상태
item.setItemNm("테스트 상품");
  1. 영속(Persistent)
    영속성 컨텍스트에 의해 관리되는 상태
em.persist(item); // 영속 상태로 변경
  1. 준영속 상태 (Detached)
    영속성 컨텍스트에서 관리가 더 이상 이루어지지 않는 상태
    EntityManager.detach(),
    EntityManager.close(),
    EntityManager.clear() 호출되면 준영속 상태로 변경

  2. 삭제 상태 (Removed)
    영속성 컨텍스트에 의해 관리되지만, 삭제가 예약된 상태
    트랜잭션이 커밋되면 데이터베이스에서 삭제

em.remove(item); // 삭제 상태로 변경

생명주기 정리

상태메서드 호출상태 결과
비영속 (Transient)EntityManager.persist()영속 (Persistent)
영속 (Persistent)EntityManager.detach()준영속 (Detached)
영속 (Persistent)EntityManager.remove()삭제 (Removed)
준영속 (Detached)EntityManager.merge()영속 (Persistent)
profile
기록하기

0개의 댓글