JPA 영속성

SeungJoo
|2023. 11. 7. 00:19
728x90

JPA 영속성 컨텍스트 

객체가 생명이나 공간을 자유롭게 유지하고 이동할 수 있는 객체의 성질이며 객체와 데이터베이스 간의 상호작용을 관리하는 중요한 역할을 합니다. 엔티티를 영구 저장하는 환경

개념

  • 영속성 컨텍스트는 엔티티 객체의 생명주기를 관리합니다. 엔티티 객체가 생성되면, 영속화, 수정, 삭제 과정을 추적 및 관리합니다.
  • 엔티티 객체를 메모리에 1차 캐시 보관하며 엔티티의 식별자(PK)를 기반으로 저장하고 데이터베이스에서 불필요한 반복적인 조회를 피할 수 있게 합니다.
  • 지연 로딩을 지원하여 연관된 엔티티를 실제로 필요할 때만 가져오는 방식을 제공합니다.
  • 엔티티 식별자를 기반으로 1차 캐시를 유지하며 엔티지 객체를 식별자를 사용하여 효율적으로 조회, 저장할 수 있습니다.

비영속성

영속성과는 반대 개념으로 데이터를 일시적으로 유지하고 저장하지 않는 것을 의미합니다.

쉽게 생각해 보면 데이터베이스나 다른 영구적인 저장 공간에 저장되지 않는 상태를 말합니다!!

public class User {
    private String name;
    private String email;

    public User(String name, String email) {
        this.name = name;
        this.email = email;
    }

    public String getName() {
        return name;
    }

    public String getEmail() {
        return email;
    }
}

public class Main {
    public static void main(String[] args) {
        // 사용자의 입력 데이터를 객체로 저장 (비영속 상태)
        User user = new User("JOO", "joo@email.com");

        // 객체를 메모리에서 사용
        System.out.println("사용자 이름: " + user.getName());
        System.out.println("이메일 주소: " + user.getEmail());

        // 데이터베이스에 저장하지 않음
    }
}

준영속성

영속성 컨텍스에서 분리되거나 분리된 상태의 객체를 나타내며 영속성 컨텍스트가 제공하는 기능을 사용하지 못합니다.

 

준영속성이 되는 상태

 

객체를 영속성 컨텍스트에서 분리시키기 위해 entityManger.detach를 호출하게 되는 경우이거나 영속성 컨텍스트를 entityManager.clear()를 사용해 완전히 초기화되는 경우가 있습니다.

public class Main {
    public static void main(String[] args) {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("my-persistence-unit");
        EntityManager em = emf.createEntityManager();

        MyEntity entity = em.find(MyEntity.class, 1L);// 1L=Pk

        em.detach(entity); // 엔티티를 준 영속 상태로 만듦

        em.close();
        emf.close();
    }
}

///아래 코드 출처 : https://velog.io/@seongwon97/Spring-Boot-%EC%98%81%EC%86%8D%EC%84%B1-%EC%BB%A8%ED%85%8D%EC%8A%A4%ED%8A%B8Persistence-Context////////////
    // 영속 -> 준영속
    // user엔티티를 영속성 컨텍스트에서 분리하면 준영속 상태가 된다.
    entityManager.detach(user);
    // 영속성 콘텍스트를 비우면 관리되고 있던 엔티티들은 준영속 상태가 된다. (대기 상태에 있는 변경 데이터들도 삭제)
    entityManager.clear();
    // 영속성 콘텍스트를 종료해도 관리되던 엔티티들은 준영속 상태가 된다.
       entityManager.close();

    // 준영속 -> 영속 
    // detach를 하여 준영속상태에 빠진 entity를 merge를 하면 다시 영속 상태가 된다.
    entityManager.merge(user);

삭제(remove)

em.remove();

 

간단 정리

영속 상태

  • 엔티티 객체가 영속성 컨텍스트에서 관리되는 상태
  • 1차 캐시에 저장되어 영속성 컨텍스트에서 식별자를 쉽게 조회 가능
  • 변경된 엔티티는 트랜잭션 커밋 시에 쓰기 지연에서 SQL 쿼리를 생성하여 데이터 베이스에 반영
  • em.persist나 em.find 등의 메서드를 통해 엔티티를 영속 상태로 만듦

준 영속 상태

  • 엔티티 객체가 영속성 컨텍스트에서 분리된 상태를 의미
  • 1차 캐시 및 쓰기 지연 SQL 저장소에서 제거되어, 영속성 컨텍스트에서 더 이상 관리되지 않음
  • 변경된 엔티티는 트랜잭션 커밋 시에 SQL 쿼리 생성되지 않으며 데이터베이스에 변경 사항 반영되지 않음
  • em.detach메서드를 사용하여 특정 엔티티를 준 영속 상태로 만들거나, em.clear()를 사용하여 영속성 컨텍스트로 초기화 가능

em.close() 메서드를 호출하면 영속성 컨텍스트가 닫히므로, 해당 영속성 컨텍스트의 모든 엔티티가 준 영속 상태가 됨

728x90

'Spring(Boot & FrameWork)' 카테고리의 다른 글

Entity 연관 관계  (0) 2023.11.09
IoC와 DI  (0) 2023.11.06
서버와 클라이언트  (0) 2023.11.02