엔티티(Entity)의 개념
엔티티란?
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 표준 강의