ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JPA (2) - 영속성 관리
    카테고리 없음 2024. 1. 11. 11:15

     

     

    > JPA에서 가장 중요한 것은 1. 객체와 관계형 데이터 베이스 매핑하기 2. 영속성 컨텍스트이다.

    출처: JPA기본편(김영한) - 인프런

     

    - 엔티티 매니저는 요청에 따라 엔티티 매니저를 생성해서 주고, 사용자는 엔티티 매니저를 통해 커넥션풀에서 커넥션을 얻어서 DB에 접근한다.

     

     

    1. 영속성 컨텍스트란?

     

    > 엔티티를 영구 저장하는 환경을 뜻한다. (em.persist())

    > 영속성 컨텍스트는 논리적은 개념이다. (엔티티 매니저를 통해 영속성 컨텍스트에 접근한다.)

     

    1.1 엔티티의 생명주기 

     

    > 비영속 : 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태 

    > 영속 : 영속성 컨텍스트에 관리되는 사애

    > 준영속 : 영속성 컨텍스트에 저장되었다가 분리된 상태

    > 삭제 : 삭제된 상태

     

    출처: JPA기본편(김영한) - 인프런

     

    Member member = new Member(); // 비영속
    em.persist(member) // 영속
    
    em.detach(member) // 준영속
    em.clear()
    em.close()
    
    em.remove(member) // 삭제

     

    1.2 영속성 컨텍스트의 이점

     

    > 1차캐시 :

    DB에서 한번 조회하거나 persist해서 영속성 컨텍스트에서 관리되면, 다시 같은 식별자의 객체 찾을 때 1차캐쉬에서 조회함!

     

    > 동일성 보장 (같은 클래스) : JPA 트랜잭션 내에서 ==비교는 동일성 비교로 같은 class인지 비교하는데, 같은 엔티티라면 동일성 보장해준다! (DB에서 조회한 거랑, new 한거랑 같다고 나옴 ) 

    * 동일성 : 완전 같음 (주소,정보) 

    * 동등성 : 정보가 같다

     

    > 트랜잭션을 지원하는 쓰기 지연 : 실제 DB에 반영을 한번에 함! (commit혹은 SQL 날아가는 시점)

     

    > 변경감지: 영속성 컨텍스트에서 관리하는 엔티티에 변화가 생기면 commit시점에 자동 반영

                        > flush()발생시 1차캐시와 flush된 값을 비교 

     

    > 지연로딩 

     

    - 1차캐시

    출처: JPA기본편(김영한) - 인프런

     

    - 쓰기 지연 sql

    출처: JPA기본편(김영한) - 인프런

     

    - 변경감지 

    출처: JPA기본편(김영한) - 인프런

     

    2. flush

     

    > 영속성 컨텍스트의 변경 내용을 데이터 베이스에 반영 (등록,업데이트,삭제 등등) [어플리케이션 to DB]

    > 변경감지시 작동, 수정된 엔티티 쓰기 지연 SQL 저장소에 등록됨 -> SQL 저장소에 쿼리를 데이터 베이스에 전송

    > flush는 em.flush()직접호출, 트랜잭션커밋, JPQL 실행 시 자동으로 호출 

     

    2.1 플러시 모드 옵션

     

    em.setFlushMode(FlushModeType.COMMIT) -> AUTO : 커밋이나 쿼리 실행시 (기본값)

     

    * 플러시는 영속성 컨텍스트를 비우는 것이 아님 

       변경 내용을 동기화하는 것 (트랜잭션이라는 작업 단위 중요 - > 커밋 직전에만 동기화하면됨)

     

    3. 준영속 상태 

     

    영속 상태의 엔티티가 분리됨 -> 영속성 컨텍스트의 기능 사용 못함 

     

     

     

    * JPA는 동적으로 객체를 생성해야해서 엔티티는 기본 생성자 무조건 필요 

      batch사이즈를 설정하면 쿼리를 몇개까지 모아서 날릴 것인지 설정 가능함!  -> 뒤에 자세히 나옴 

Designed by Tistory.