ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JPA] Persistence(영속성) 정리
    자바/JPA 2024. 1. 2. 17:45

     


    | Persistence(영속성)란?

     

    이전 글에서 JPA는 프레임워크이며 인터페이스라고 설명드린 내용이 기억나실까요? 이러한 JPA를 구현체(본 블로그에서는 Hibernate를 사용)를 통해 구현하며, 구현하는 객체 중 하나가 Persistence입니다. Persistence는 데이터를 영속성 상태인 데이터와 그렇지 않은 상태로 구분하며, 영속성 상태인 데이터는 별도 관리해 빠른 조회 및 변화를 감지해 데이터 베이스에 업데이트를 진행할 수 있게 해줍니다. 즉, 데이터 베이스와 연결시켜주는 JPA 객체라고 이해하시면 되겠습니다. 영속성 상태에 대해서는 다른 용어들의 설명 이후에 말씀드리도록 하겠습니다.

     

     

     

     

    | Persistence 설정

     

    Persistence를 사용하기 전에 어느 데이터 베이스와 연결할지, 사용하고자 하는 데이터 베이스의 방언이 무엇인지 필수적인 설정이 필요하며, 데이터 베이스에서 실제로 동작하는 구문을 콘솔에 표시하는 방법 등도 추가적으로 설정할 수 있습니다. 이러한 설정은 사용하는 툴마다 작성하는 곳이 다르며, Maven의 경우 resources > META-INF > persistence.xmlGradle의 경우 build.gradle에 작성하는 것이 통상적입니다.

     

     

     

     

    | Entity Manager Factory

     

    JPA에서 인식하는 객체(@Entity Annotation을 통해 인식)를 엔티티(Entity)라 하며, 이러한 엔티티들은 Entity Manager(EM)라는 객체를 통해 영속성으로 등록되어야 JPA에서 관리할 수 있습니다. EM은 Entity Manager Factory(EMF)를 통해 생성될 수 있으며, EMF는 Persistence의 createEntityManagerFactory() 메서드를 통해 생성될 수 있습니다. EMF 생성은 DB당 한 번 생성하며 하나의 EMF를 애플리케이션 전체 공유합니다.

     

     

     

     

    | Entity Manager

     

    Entity Maneger(EM)은 EMF에서 createEntityManager() 메서드를 통해 생성할 수 있으며, persist() 메서드를 통해 엔티티를 영속성 상태로 만들어 영속성 컨텍스트에 저장할 수 있습니다. EM은 싱글톤 패턴으로 사용돼 생성 후 꼭 close() 메서드를 통해 닫아주어 동시성 문제를 피해야합니다.

     

     

     

     

    | Entity

     

    엔티티란 JPA에서 인식하고 관리하는 객체를 의미하며, 객체 Class에 @Entity Annotation을 통해 엔티티를 인식할 수 있습니다. 엔티티로 등록된 객체는 연결된 데이터 베이스에서 하나의 테이블로 관리되며, 엔티티간 연관관계를 별도의 String 키값을 통해 설정하지 않아도 된다는 점(객체 지향 언어를 그대로 사용할 수 있음)에서 큰 장점을 가지고 있습니다.

     

     

     

     

    | 영속성 상태란?

     

    EM을 통해 엔티티를 영속성 상태로 만든다는 의미는 영속성 컨테스트에 엔티티를 넣어 엔티티를 관리한다고 이해하시면 됩니다. 영속성 컨테이너에 있는 엔티티는 모든 변경 사항을 추적해 flush되는 순간 JPA가 자동으로 데이터 베이스와 연결해 엔티티의 정보를 데이터 베이스에서 create, update 등을 동작해줍니다. 변경 사항을 추적하기 위해서 주의할 점으로 모든 동작이 Transaction과 Commit 사이에 있어야 한다는 점을 주의해야합니다.

     

    즉, 영속성 상태란 '데이터를 데이터 베이스에 영구적으로 저장하기 위해 영속성 컨텍스트에서 관리하는 엔티티를 의미한다'라고 정의하겠습니다.

     

     

     

     

    | 영속성 컨텍스트

     

    영속성 컨텍스트란 물리적인 공간을 뜻하는 것이 아닌, 영속성 엔티티를 관리하는 논리적인 개념입니다. 영속성 컨텍스트는 다음과 같은 특징을 가지고 있습니다.

     

     

    • 1차 캐시
      영속성 컨텍스트에 등록된 엔티티들은 모두 1차 캐시에 저장되며, 영속성 상태의 자료를 조회할 때 먼저 1차 캐시를 탐색해 네트워크 연결을 최소화 해줍니다.

      예를 들어 EM.find(entityA)를 통해 엔티티A에 대한 정보를 조회할 때, 1차 캐시를 먼저 탐색하며, 정보가 없을 경우 데이터 베이스와 연결해 엔티티A에 대한 정보를 영속성 컨텍스트 내에 있는 1차 캐시에 저장합니다. 이후 다시 EM.find(entityA)를 동작할 경우 1차 캐시에 있는 정보를 반환해 네트워크 연결을 최소화합니다.

    • 동일성 보장
      Java의 Collection과 비슷한 개념으로 이해하시면 좋을 것 같습니다. 영속성 컨텍스트에 저장된 엔티티A를 서로 다른 참조 변수 refA1, refA2에 저장 했을 때, refA1 == refA2를 비교하면 동일성이 보장되어 true가 반환됩니다.
    • 변경 감지
      영속성 컨텍스트에 등록된 엔티티의 모든 변경은 감지되어 EM이 종료될 때(flush될 때) 변경 사항을 반영해 데이터 베이스에 create, update 등을 자동으로 동작해 별도의 Mapper를 작성하지 않아도 됩니다.

     

     

     

    | 전반적인 흐름

     

    1. Persistence에 대한 설정을 완료(Maven: persitence.xml, Gradle: build.gradle)
    2. Entity Managet Factory(EMF) 생성
    3. Entity Manager(EM) 생성
    4. @Entity Annotation을 입력해 엔티티를 인식
    5. em.persist()로 엔티티를 영속성 컨텍스트에 저장
    6. 엔티티는 영속성 컨텍스트 1차 캐시에 저장되며, 모든 변경 사항을 추적
    7. em.close()시 flush되며 엔티티에 대한 정보를 데이터 베이스에 기록

     

     

     

     

    JPA를 공부하기에 있어 주로 사용되는 용어들과 흐름을 살펴보았습니다. 이외에도 엔티티간 연관관계와 지연로딩 Fetch Join 등 JPA에 대한 특징이 많이 남아 있어 정리 후 공유 드릴 수 있도록 하겠습니다.

Designed by Tistory.