소소한개발팁
article thumbnail
Published 2023. 9. 1. 23:38
JPA - 영속성 컴퓨터 언어/Java
반응형

JPA 영속성(Persistence)이란?

영속성은 JPA에서 개체(엔티티)가 데이터베이스에 저장되고 관리되는 상태를 나타냅니다. JPA에서 영속성을 관리하는 것은 엔티티의 생명주기와 관련이 있으며, 아래와 같은 주요 개념을 포함합니다.

 

JPA 영속성 생명주기

비영속 상태(Transient)

엔티티 객체가 생성된 직후나 데이터베이스에서 조회되지 않은 경우 비영속 상태입니다. 비영속 상태의 엔티티는 영속성 컨텍스트와 관련이 없으며, 데이터베이스에 저장되지 않습니다.

 

영속 상태(Persistent)

엔티티 객체가 영속성 컨텍스트에 의해 관리되는 상태입니다. 이 상태에서는 엔티티의 변경 사항이 추적되고, 데이터베이스와의 동기화가 이루어집니다. 엔티티 매니저를 통해 데이터베이스에 저장하거나 업데이트할 수 있습니다.

 

준영속 상태(Detached)

영속 상태의 엔티티가 영속성 컨텍스트에서 분리되는 상태입니다. 이렇게 되면 엔티티 매니저의 관리를 받지 않게 되며, 데이터베이스 동기화나 변경 감지가 불가능합니다. 주로 트랜잭션을 벗어난 후에 엔티티는 준영속 상태가 됩니다.

 

삭제 상태(Removed)

 엔티티가 삭제되는 상태입니다. 삭제된 엔티티는 영속성 컨텍스트에서 관리 대상에서 제외되며, 데이터베이스에서도 삭제됩니다.

 

 

JPA 영속성 생명주기 관리 방법

  • 엔티티 저장: 엔티티 매니저를 사용하여 엔티티를 데이터베이스에 저장하면 엔티티는 영속 상태로 전환됩니다.
  • 엔티티 조회: 엔티티 매니저를 사용하여 데이터베이스에서 엔티티를 조회하면 엔티티는 영속 상태로 전환됩니다.
  • 엔티티 수정: 영속 상태의 엔티티를 수정하면 영속성 컨텍스트가 변경 사항을 추적하고, 트랜잭션 종료 시 데이터베이스에 변경 사항을 반영합니다.
  • 엔티티 삭제: 엔티티 매니저를 사용하여 엔티티를 삭제하면 엔티티는 삭제 상태로 전환되며, 트랜잭션 종료 시 데이터베이스에서도 삭제됩니다.
  • 엔티티 분리: 준영속 상태로 전환하려면 엔티티를 영속성 컨텍스트에서 분리해야 합니다.

예제 코드

Entity

import javax.persistence.*;

@Entity
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String username;
    private String email;

    // getters and setters

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", email='" + email + '\'' +
                '}';
    }
}

 

Main

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;

public class Main {

    public static void main(String[] args) {
        // EntityManagerFactory 생성
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("example-unit");
        EntityManager em = emf.createEntityManager();

        // 엔티티 매니저를 사용한 트랜잭션 시작
        EntityTransaction tx = em.getTransaction();
        tx.begin();

        // 1. 엔티티 생성 (비영속 상태)
        User user = new User();
        user.setUsername("john_doe");
        user.setEmail("john@example.com");

        // 2. 엔티티 저장 (영속 상태)
        em.persist(user);

        // 3. 엔티티 조회 (영속 상태)
        User savedUser = em.find(User.class, user.getId());
        System.out.println("Saved User: " + savedUser);

        // 4. 엔티티 수정 (영속 상태)
        savedUser.setEmail("new_email@example.com");

        // 5. 엔티티 삭제 (삭제 상태)
        em.remove(savedUser);

        // 트랜잭션 커밋
        tx.commit();

        // 엔티티 매니저 및 팩토리 종료
        em.close();
        emf.close();
    }
}

 

반응형

'컴퓨터 언어 > Java' 카테고리의 다른 글

JPA - 상속 관계 및 MappedSuperclass  (0) 2023.09.07
JPA - 연관관계  (0) 2023.09.01
JPA - 주요 엔티티 12가지  (0) 2023.08.29
JPA - 엔티티 매핑  (0) 2023.08.29
JPA 기본 개념과 활용 방법  (0) 2023.08.29
profile

소소한개발팁

@개발자 뱅

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!