JPA

JPA 영속성과 생성주기

✨✨✨✨✨✨✨ 2022. 1. 6. 20:42
반응형

영속성 관리

JPA에서 가장 중요한 2가지는 아래와 같습니다.

  • 객체와 관계형 데이터베이스 매핑하기()
    • DB를 어떻게 설계하고 매핑할 것인지
  • 영속성 컨텍스트
    • 실제 JPA는 어떻게 동작하는지 이해하기

 

JPA를 쓰게되면 엔티티 매니저 팩토리와 엔티티 매니저를 이해해야합니다.

 

웹 어플리케이션 개발 시 고객의 요청이 온다면 EntityManager 생성이 됩니다.

EntityManager는 DB Connection을 생성합니다.

 

영속성 컨텍스트란?

JPA를 이해하는데 가장 중요한 용어로써 엔티티를 영구 저장하는 환경 이라고 합니다

아래 코드는 해당객체를 DB저장하는것 뿐만 아니라, 엔티티 매니저를 통해 엔티티를 영속성 컨텍스트라는 공간에 저장한다는 의미입니다.

EntityManager.persist(entity);

만약 J2SE라는 DB와 JPA가 연결된다면

엔티티 매니저와 영속성컨텐트가 1:1 로 매핑됩니다.

 

 

Spring 컨테이너 환경이라면 아래처럼 연결되겠지만 일단은 넘어갑니다.

 

 

엔티티의 생명주기먼저 알아보겠습니다.

  1. 비영속(new/transient)
    • 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태이다.
    • 소스로 표현하자면 아래와같다
      • Member member = new Member();
        member.setId("member1");
        member.setUsername("회원");
    • 다음과 같이 JPA와는 아무 상관없이 member객체만 생성한것이다.

 

 

2. 영속(managed)

  • 영속성 컨텍스트에 관리되는 상태다음과 같이 EntityManager 객체에 들어가 JPA가 관리해준다
  • EntityManager em = emf.createEntityManger(); em.getTransaction().begin(); //객체를 저장한 상태(영속) em.persist(member); em.getTransaction().commit();

  • 또 신기한것은 em.persist(member); 라인 실행 시 바로 DB에 들어가지 않는다.
    Member member = new Member();
    member.serId("mId");
    member.setName("Hello");
    
    System.out.println("=== BEFORE ===");
    em.persist(member);
    System.out.println("=== AFTER ===");
    • 다음과 같이 ===BEFORE===, ===AFTER=== 실행 후에 SQL문이 실행된다.
  • ​ 즉, 영속상태가 된다고 바로 DB에 데이터가 들어가는것이 아니다!! (em.getTransaction().commit() 실행 시 DB에 들어감)

 

  1. 준영속 (detached)
    • 영속성 컨텍스트에 저장되었다가 분리된 상태
      • member.persist(member);
        em.detach(member);
  2. 삭제(removed)
    • 객체를 삭제한 상태(삭제)
    • em.remove(member);

 

그렇다면 영속성으로 인해 어떤 이점들이 발생할까?

  1. 캐시
  2. 동일성(identity) 보장
  3. 트랜잭션을 지원하는 쓰기 지연(transactional write-behind)
  4. 변경 감지(Dirty Checking)
  5. 지연 로딩(Lazy Loading)

자세한 내용은 다음시간에..

반응형