JPA #3

KimSeonGyu·2023년 7월 29일
0

JPA

목록 보기
3/5
post-thumbnail

JPA 내부 동작 방식

영속성 컨텍스트는 Entity Manager 단위로 관리된다.
영속성 컨텍스트에는 1차캐시와 SQL 저장소 등이 존재한다.


Create

  • EntityManager.Persist()를 통한 영속 객체 등록은 우선 해당 객체가 1차 캐시에 저장되고 일반적으로 트랜잭션이 커밋되는 시점에 Insert 쿼리가 데이터베이스에 반영된다.

Read

  • EntityManager.find()를 통한 테이터 검색은 우선 1차 캐시를 통해 해당 객체를 검색하고 없을 경울 Select 쿼리를 통해 데이터 베이스에서 검색을 수행

Update

  • 영속 컨텍스트를 통해 관리되는 영속 객체의 상태 변경에 따라 Update 쿼리가 생성되고 커밋 시점에 데이터베이스에 반영된다. 1차 캐시에 있는 snapshot 정보를 통해 변경사항을 판별한다. 즉 1차캐시에 저장된 정보와 영속객체가 다를 경우 UPDATE 쿼리를 생성해 SQL 저장소에 저장한다. 쉽게 객체의 속성이 바뀌게 되면 자동으로 UPDATE가 생성된다.

Delete

  • EntityManager.remove() 메서드

플러시 (flush)

영속성 컨텍스트의 변경 내용을 데이터베이스에 동기화하는 작업을 플러시라고 한다. 플러시가 발생하면 변경된 엔티티를 데이터베이스에 반영하여 일관성을 유지하게 된다.
쉽게 플러시가 되면 SQL 저장소의 쿼리들이 진행이돼고 데이터베이스와 1차캐시의 내용이 동기화 된다.

플러시의 3가지 방법
1. Entity.Manager.flush()을 통한 플러시
2. 커밋을 통한 자동 플러시
3. JPQL 쿼리 실행을 통한 자동 플러시

Entity Lifecycle

영속 객체의 4가지 상태

  1. 비영속(New) : 영속성 컨텍스트로 관리되기 이전 순수 객체 상태. (일반적인 자바 객체의 상태)
  2. 영속(Managed) : 영속성 컨텍스트로 등록되고 관리되는 상태 (EntityManager의 persistnect()메서드로 등록한 상태 혹은 데이터 베이스에 find()메서드로 읽어온 상태)
  3. 준영속(Detached) : 영속성 컨텍스트의 관리에 있다가 분리된 상태(Managed > Detached)
  4. 삭제(Removed) : 영속 데이터의 삭제를 위한 상태(EntityManager.removel)
		tx.begin();

        try{
            Customer customer = new Customer("ID0002", "Park");  // 비영속 상태(New)

            em.persist(customer);   //  영속 상태 (Managed)
            em.detach(customer);    // Customer 객체를 준영속 상태로 만든다. 이렇게 하면 Select SQL 문이 나간다.(Detached)
            Customer foundcustomer = em.find(Customer.class, "ID0002");
            System.out.println(foundcustomer);
            tx.commit();
        } catch (Exception e) {
            tx.rollback();
        } finally {
            em.close();
        }

        emf.close();

위의 예시 코드를 보면 EntityManager로 객체를 영속성 컨텍스트에 등록하게되면 영속 상태(Managed)가 된다. 그리고 이 객체를 준영속 상태로 만들기 위해선 detach()메서드를 사용하면된다. 이때 customer객체를 찾을때 Select 문이 사용된다. 그리고 비영속상태가 되면 영속성 컨텍스트의 관리를 받지 않게된다.
이상태에서 find()메서드를 사용해서 같은 객체를 찾으려하면 1차 캐시에 해당 객체가 존재하지 않기 때문에 Select 쿼리문이 사용된다.

profile
공부한 내용을 작성하는 블로그 입니다. 수정할 부분이 있다면 편하게 댓글 작성부탁드립니다!

0개의 댓글