JPA | EntityManager, EntityManagerFactory, Entity, PersistenceUnit

2024. 1. 17. 09:33

내가 JPA 강의를 보고 작성한 VELOG 시리즈

영속성 컨텍스트

이전에 내가 그린 그림

영속성 컨텍스트 ( Persistence Context ) :  자바에서 데이터 베이스 테이블과 Mapping 할 객체 ( Entity ) 를 관리하는 환경
영속성 컨텍스트에 대한 이해를 위해 알아야할 내용들이다.

 

PersistenceUnit

maven 빌드를 사용하는 자바 어플리케이션에서의 PersistenceUnit
SpringBoot 어플리케이션에서 application.yml 파일에 정의한 PersistenceUnit

JPA 를 사용하는 설정 정보와 DB 접속 정보를 담고 있는 단위로써 Persistence.xml 파일 형식으로 구성하거나 
Spring 환경의 경우 application.yml 등의 어플리케이션 설정 파일에 정의할 수 있다.

( 사실상 SpringBoot 환경을 많이 사용하면 application.properties 나 application.yml 에 DB 접속 정보 및 JPA 설정 정보를 정의하기 때문에, PersisteneceUnit 에 대해서는 이번에 공부하면서 알게 되었다. Spring 에서 내부적으로 많은 기능들이 내장되어 있음을 실감했다.)

 

EntityManagerFactory 와 EntityManager

https://docs.oracle.com/javaee%2F7%2Fapi%2F%2F/javax/persistence/EntityManagerFactory.html
https://docs.oracle.com/javaee%2F7%2Fapi%2F%2F/javax/persistence/EntityManager.html

EntityManagerFactory : PersistenceUnit 의 내용을 사용하여 EntityManager 인스턴스를 생성, 관리하는 객체
어플리케이션 실행 시 한번 만 실행된다.

EntityManger : EntityMangerFactory 객체로 부터 생성된 객체.
특정 트랜잭션 범위에서 엔터티(Entity)에 대한 작업을 수행하는데 사용하며 엔티티의 생명주기를 관리한다.
JPA 에 핵심적인 기술을 사용할 수 있다.

- 영속성 관리 
- 트랜잭션 관리
- 쿼리 수행
- 로딩 관리 
- 캐싱 관리 

 

예시

import javax.persistence.*;
import java.util.List;

public class getResultListT {
    public static void main(String[] args)
    {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
        EntityManager        em  = emf.createEntityManager();
        EntityTransaction    tx  = em.getTransaction();
        tx.begin();
        ...
     }
  }
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.2"
             xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd">
    <persistence-unit name="hello">
    ...
        </persistence-unit>
</persistence>

 

 

Entity 

import javax.persistence.*;

@Entity
public class Member
{
    @Id @GeneratedValue
    private Long id;
    ...   
}
import jakarta.persistence.*;
import lombok.*;
import java.util.ArrayList;
import java.util.List;

@Entity
@Getter
@Builder
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Table(uniqueConstraints = @UniqueConstraint(columnNames = {"loginId"}))
public class Auth extends BaseEntity
{

    @Id @GeneratedValue
    @Column(name = "auth_pid")
    private Long pid;
    
 }
@Entity
어노테이션을 활용하여 해당 객체가 Entity 임을 선언한다.

선언된 객체만 영속성 컨텍스트에서 관리가 된다. 

@Id
엔티티의 식별자 필드임을 선언하는 어노테이션이다.

영속성 컨텍스트 내부 식별자이며 테이블에서 PK 이다. 

 

정리 

정리해보면 ..
PersistenceUnit 에 JPA 설정 정보 및 접속 정보를 설정하고 어플리케이션을 동작시키면
EntityManagerFactory 객체가 PersistenceUnit 의 이름을 사용하여 EntityManager 인스턴스를 생성한다.
EntityManger 는 @Entity 로 선언된 객체를 관리하며 @Id 로 정의된 엔티티 객체의 필드를 식별자로 사용한다.

기본적인 내용이여서 까먹진 않겠지만 
글을 작성하며 배웠던 내용을 상기시킬 수 있어서 좋았다.

이후 1차 캐시 나 더티 채킹 정도만 작성할 예정이다. 
 

 

BELATED ARTICLES

more