[JPA 기본] 02-영속성관리

heyhey·2023년 2월 23일
0

JPA

목록 보기
2/7

JPA에서 가장 중요한 2가지
1. ORM(Object Relational Mapping) : 객체와 관계형 데이스 매핑
2. 영속성 컨텍스트

CRUD


  • 엔티티매니져 팩토리는 하나만 생성해야하고, 애플리케이션 전체에서 공유한다.
  • 엔티티매니저는 쓰레드 간에 공유하면 안된다.
  • JPA의 모든 데이터 변경은 트랜잭션 안에서 진행된다.

영속성 관리


  • JPA를 이해하는데 가장 중요한 언어이다.

  • '엔티티를 영구 저장하는 환경' 이라는 뜻이다.
    EntityManager.persist(entity)

  • 엔티티 매니저를 통해 영속성 컨텍스트에 접근한다.

엔티티의 생명주기

  • 비영속 : 완전 새로운 상태
  • 영속 : 영속성 컨텍스트에 관리되는 상태
  • 준영속 : 영속성 컨텍스트에 저장됐다가 분리된 상태(제거)
  • 삭제 : 삭제된 상태

멤버 엔티티

@Entity
public class Member {
  @Id
  private Long id;
  private String name;
  constructor(Long id,String name){
    this.id = id;
    this.name = name;
  }
}

비영속 (em.persist)

객체를 생성한 상태라고 보면 쉽겠다.

Member member = new Member(1L,"회원");

객체를 생성하고 엔티티매니저를 생성해주고 실행시켜준다.

EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();

em.getTransaction().begin();

객체를 저장한다 => 영속

em.persist(member)

준영속 삭제 (em.detach(member))

detach는 회원 엔티티를 영속성 컨텍스트에서 분리하는 것이다 : 준영속

삭제 (em.remove)

remove 는 객체를 삭제한 상태이다.

조회

Member member = em.find(Member.class,1L)

수정

Member member = em.find(Member.class,1L)
member.setName ="LALA";

객체를 변경시키고 em.update 나 em.persist를 해주지 않아도 반영이 된다..
오..

영속성 컨텍스트의 이점

1. 1차 캐시

  • em.persist를 하거나 조회를 하게 되면 1차 캐시에 저장된다.
  • 그 상황에서 조회를 했을때 1차 캐시에 있다면 그 값을 불러온다.
  • 값이 없다면 DB에서 조회한다.

2. 동일성 보장

  • 영속 엔티티의 같은 값을 조회하면 같은 객체라고 인식

3. 트랜잭션을 지원하는 쓰기 지연

  • 앤티티매니저는 데이터 변경시 트랜잭션을 시작해야 한다.
  • conmmit() 트랜잭션 커밋 순간 까지 SQL을 보내지 않고 있다가 한번에 보내준다.

4. 변경 감지 (Dirty Checking) => 수정기능

플러시

  • 플러시 : 영속성 컨텍스트 변경 내용을 DB에 반영한다.
  • 플러시 발생 : 변경이 감지되거나, 수정된 엔티티 쓰기지연 SQL 저장소 등록
  • 쓰기 지연 SQL 저장소의 쿼리를 DB에 전송

플러시를 하더라도 변경 내용을 DB에 동기화만 하고 영속성 컨텍스트를 비우지 않는다.
커밋 직전에만 동기화 하면 됨

영속성 컨텍스트를 플러시하는 법
1. em.flush() - 직접 호출
2. 트랜잭션 커밋 - 플러시 자동 호출
3. JPQL 쿼리 실행 - 플러시 자동 호출 => SQL로 db가 변경됐는데 예전 값을 그대로 들고 있으면 안되기 때문에 플러시가 발생한다.

5. 지연 로딩

profile
주경야독

0개의 댓글