데브코스 W9D2

코끼릭·2022년 5월 10일
0

TIL

목록 보기
26/36

EntityManagerFactory

관계형 데이터베이스와 매핑되는 객체인 Entity를 관리하는 EntityManager 빈을 생성하는 팩토리 객체로 thread safe 하다.

EntityManager

Entity의 저장, 수정, 삭제, 조회와 관련된 모든 일을 처리하는 빈으로 영속성 컨텍스트에 관리되는 엔티티의 변화를 감지하여 데이터베이스에도 동기화가 될 수 있게 자동으로 SQL문을 실행하는 역할을 수행한다.

영속성 컨텍스트

  • 1차 캐시
    영속성 컨텍스트에 등록된 엔티티는 식별자 값과 엔티티를 키-값으로 관리하고 있어 동일한 엔티티를 조회할 때 DB에 접근하여 값을 가져오지 않고 1차 캐시를 사용하여 빠르게 조회할 수 있다.
  • 동일성 보장
    트랙잭션을 커밋하는 순간 영속성 컨텍스트에 새롭게 등록, 수정, 삭제된 엔티티를 DB에 반영한다. (FLUSH)
  • 트랙잭션을 지원하는 쓰기 지연
    영속성 컨텍스트 안에서 발생한 쿼리가 저장되고 commit이 일어나는 순간 저장된 쿼리가 수행한다.
  • 변경 감지(Dirty Checking)
    엔티티를 영속성 컨텍스트에 보관할 때 최초의 상태를 복사해서 저장하고 이 스냅샷을 바탕으로 변경된 엔티티를 찾아 update 쿼리를 수행한다.
  • 지연로딩(Lazy Loading)
    연관관계를 가진 엔티티의 또다른 엔티티 값을 바로 DB에서 가져와서 값을 채우는 것이 아닌 프록시를 사용하여 실제로 값을 사용하는 경우에만 값을 가져오는 전략을 기본으로 사용하고 있어 성능을 높였다.

엔티티생명주기

  • 비영속
    영속성 컨텍스트와 전혀 관계 없는 상태로 데이터베이스에 저장하지 않은 엔티티 객체가 이에 해당된다.

  • 영속
    persist를 통해 영속성 컨텍스트에 entity를 등록할 수 있다. 기본적으로 EntityManager의 find나 createQuery를 통해 조회된 Entity는 영속성 컨텍스트에 포함된다.

  • 준영속
    detach를 통해 영속성 컨텍스트를 분리할 수 있고 준영속 상태에 있는 entity를 다시 영속성 컨텍스트에 편입시키려면 merge를 해야한다.

  • 삭제
    remove를 통해 영속성 컨텍스트에서 분리하고 DB에서 삭제가 가능하다.

Entity

Entity 객체를 생성할 때 아노테이션으로 설정된 단일 엔티티 매핑을 통해 데이터베이스에 대한 자료형 지정이 가능하다.

@Entity
@Table(name = "orders")
public class Order {
	//영속성 컨텍스트에 1차 캐쉬에 저장되기 위한 필수 속성
    @Id
    //auto increment(mysql)
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private String uuid;
    
	//time stamp 속성
    @Column(name = "order_datetime", columnDefinition = "TIMESTAMP")
    private LocalDateTime orderDatetime;
	
    //enum type
    @Enumerated(EnumType.STRING)
    private OrderStatus orderStatus;
	
    //varchar(255) 이상의 긴 문자열을 저장하기 위한 속성
    @Lob
    private String memo;
}
profile
ㅇㅅㅇ

0개의 댓글