JPA

엔티티(Entity)의 개념

꾸진 2022. 2. 17. 00:40

엔티티란?

JPA에서 Entity는 테이블과 매핑되는 클래스라고 볼 수 있다. 

@Entity, @Table, @Column 등의 어노테이션을 사용해 엔티티 클래스를 구성할 수 있으며,

완성된 엔티티 클래스는 명세를 기반으로 테이블과 매핑이 된다.

 

아래와 같이 사용할 수 있는데, 해당 Order 클래스는 엔티티 클래스로 ORDERS라는 DB 테이블에 맵핑이 되며,

PK로 ORDER_ID 컬럼을 갖도록 해준다.

@Entity
@Table(name = "ORDERS")
public class Order {

    @Id @GeneratedValue
    @Column(name = "ORDER_ID")
    private Long id;
}

이러한 엔티티는 생명주기를 갖게 되며 총 4가지 상태로 표현하는데, 이를 엔티티의 생명주기라고 한다.

 

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

- New/Transient (비영속)

영속성 컨텍스트와 관계가 전혀 없는 상태로 객체를 "생성"만 한 상태라고 볼 수 있다. 

해당 상태에서 엔티티는 DB와 관계가 전혀 없는 평범한 객체일 뿐이다.

Order order = new Order();
order.setId(1L);

 

- Managed (영속)

영속성 컨텍스트에 저장된 상태로 Entity가 영속성 컨텍스트에 의해 관리되는 상태이다.

엔티티가 트랜잭션 영역에 진입 후 엔티티 매니저의 관리에 들어가게 되면 해당 트랜잭션 동안 엔티티는 영속 상태가 된다.

영속 상태의 엔티티는 몇 가지 특징을 갖게 되는데 1차 캐시 사용, 지연된 쓰기 등이 있다.

EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello"); //EntityManagerFactory 생성
EntityManager em = emf.createEntityManager(); // EntityManager 생성
EntityTransaction tx = em.getTransaction(); // Transaction 생성
tx.begin();

Order order = new Order();
order.setId(1L);
em.persist(order); // order 객체를 DB에 저장한다. 
// 단, 트랜잭션이 커밋된 상태는 아니며 쓰기지연 SQL 저장소에 저장된 상태이다

 

- Detached (준영속)

영속 상태의 엔티티가 영속성 컨텍스트에서 분리(detached)된 상태로 영속성 컨텍스트에서 제공하는 기능을 사용할 수 없음

em.detach(엔티티), em.clear(), em.close() 등으로 사용할 수 있다.

EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello"); //EntityManagerFactory 생성
EntityManager em = emf.createEntityManager(); // EntityManager 생성
EntityTransaction tx = em.getTransaction(); // Transaction 생성
tx.begin();

Order order = new Order();
order.setId(1L);
em.persist(order);

em.detach(order); // order 엔티티를 준영속 상태로 전환
em.clear(); // 영속성 컨텍스트 전체 초기화
em.close(); // 영속성 컨텍스트 종료

 

- Removed (삭제)

엔티티를 영속성 컨텍스트와 DB에서 삭제한 상태이다. 다만, 엔티티를 즉시 삭제하는 게 아니라 쓰기 지연 SQL 저장소에 등록한 후 트랜잭션을 커밋하게 되면 flush를 호출해 실제 DB에 쿼리를 전달하게 되는 것이다.

em.remove(order) // 엔티티 삭제

 

출처: 인프런 자바 ORM JPA 표준 강의