JPA 기초) 02. 코드 구조 & 영속 컨텍스트

meteorfish·2022년 11월 27일

JPA&SpringJPA기초

목록 보기
2/18

본 강의는 JPA & Spring Data JPA 기초 강의 공부용 정리입니다.


저번 시간에 작성했던 코드에 대해 더 자세히 알아보자.

코드 구조 분석

	// 1
	EntityManagerFactory emf =
                Persistence.createEntityManagerFactory("jpabegin");
        EntityManager entityManager = emf.createEntityManager();
        EntityTransaction transaction = entityManager.getTransaction();

        try{
            transaction.begin();
            User user = new User("user@user.com", "user", LocalDateTime.now());
            entityManager.persist(user); 
            transaction.commit(); 
        } catch (Exception ex){
            ex.printStackTrace();
            transaction.rollback();
        }finally {
            entityManager.close();
        }

		// 2
        emf.close();

1

EntityManagerFactory emf =
                Persistence.createEntityManagerFactory("jpabegin");
  • persistence.xml 파일에 정의한 영속 단위 기준으로 초기화
  • 필요한 자원을 생성
  • 어플리케이션 처음 실행 시 한번만 실행

2

emf.close();
  • 팩토리 닫기
  • 사용한 자원 반환 후, 팩토리 닫아야함!

EntityManager로 DB 연동



UserUpdateMain에서 쿼리문이 언제 실행될까?

저장과 쿼리 실행 시점

INSERT 쿼리는 persist() 가 아닌 commit() 시에 실행됨!
( 식별자를 직접 설정한 경우 ??)

수정과 쿼리 실행 시점

INERT와마찬가지로 changeName은 commit() 시에 실행됨!

이렇게 commit 시에 해당 쿼리를 실행하도록 하는 주체를 영속 컨텍스트라고 한다.

영속 컨텍스트

  • 응용프로그램이나 DB에서 오는 객체를 EntityManager로 가지고 있음.
  • 커밋하는 시점에 변경이 발생하면 이를 DB에 반영(쿼리 실행)


정리

  • 기본 구조
    - EntityManagerFactory 초기화
    • DB 작접이 필요할 때마다
      • EntityManager 생성
      • EntityManager로 DB 조작
      • EntityTransaction으로 트랜잭션 관리
    • 하지만 스프링과 연동할 때는
      • 대부분 스프링이 대신 처리하므로 매핑 설정 중심으로 작업
  • 영속 컨텍스트
    - 엔티티를 메모리에 보관
    • 변경을 추적해서 트랜잭션 커밋 시점에 DB에 반영

0개의 댓글