Spring

JPA(1), EntityManager

Noooodle 2024. 6. 1. 13:42

JPA(Java Persistence API)

- ORM(Object-Relational Mapping)을 실행하기 위한 Java 표준 API

- Entity로 정의된 Java 객체와 데이터베이스 사이의 mapping 방법을 설정한다.(annotation이용)

- EntityManager: 설정된 mapping에 따라 Java 객체를 테이블에 저장하고, 수정, 삭제, 검색할 수 있는 인터페이스를 제공

- Java 객체 중심의 데이터 관리 기능

 

Persistence(영속성)

- Java 객체를 데이터베이스를 통해 저장 및 관리함으로써 객체의 영속성을 보장한다.

 

Persistence Provider

- JPA의 기능을 구현한 라이브러리: Hibernate, DataNucleus, EclipseLink 등..

- SQL문 자동 생성 및 실행

 

<구성요소>

1. Entity 

- ORM 기술을 통해 데이터베이스에 영속적으로 저장, 관리되는 객체

2. ORM 설정

- Entity와 데이터베이스 테이블들 간의 mapping 방법을 정의

- Annotationd 또는 XML 이용

3. EntityManager

- 메소드로 Entity에 대한 CRUD 기능 실행

4. JPQL(Java Persistence Query Language)

- SQL과 유사한 질의 언어

- Entity들에 대한 검색, 수정, 삭제 실행

5. Criteria API

- Java code(method)를 이용한 질의 생성 방법 제공

 


<Entity>

- 영속적인 데이터를 포함하는 POJO(Plain Old Java Object) 객체

- Entity 클래스 내에서 annotation을 이용하여 ORM 설정 가능

- EntityManager에 의해 영속적으로 관리되는 객체 단위

 

<ORM 설정을 위한 주요 annotations>

  • Entity 정의
    • @Entity, @Embeddable, @Embedded
  • Entity의 식별자 속성 정의
    • @Id, @IdClass, @EmbeddedId
  • Entity와 테이블 간의 mapping 정의 
    • @Table, @SecondaryTable, @Column, @JoinColumn, @PrimaryKeyJoinColumn, @Transient, @Temporal, @Enumerated, @GeneratedValue, @AttributeOverides, @Inheritance 등
  • Entity들 사이의 연관 관계 정의
    • @OneToOne, @OneToMany, @ManyToMany, @JoinTable 등

<EntityManager>

- Entity의 생명주기(life-cycle)를 관리

  • 생명주기: 비영속, 영속, 준영속, 삭제

- Entity를 영속 컨텍스트 안에서 영속적인 객체로 관리

- 영속 컨텍스트(persistence context): 영속성을 갖는 객체들의 저장 공간, 영구 저장, 캐시(cacing)기능

 

영속성 컨텍스트(Entity Cache)

🤔 영속성 컨텍스트는 일종의 JPA 컨테이너 안에서 동작하는 entity의 맥락을 관리하는 것이다. 이 안에서 entity는 생성되고 지워지고 조회된다. 그 context 안에서 가장 중요한 역활을 하는 것이 Enti

velog.io

 

- 영속적 객체에 대해 데이터베이스 저장, 갱신, 삭제 실행

- 트랜잭션 완료(commit) 시 영속적 객체와 테이블(레코드) 간에 동기화 실행 

- Entity 검색

  • 필요한 SQL 질의 생성 및 실행
  • 질의 결과에 대해 영속적 객체 생성

참고한 관련 링크: 

https://private-space.tistory.com/81#%EC%98%81%EC%86%8D%EC%84%B1%20%EC%BB%A8%ED%85%8D%EC%8A%A4%ED%8A%B8%20(Persistence%20Context)-1

 

[JPA] EntityManager, 영속성 컨텍스트

김영한 님의 [자바 ORM 표준 JPA 프로그래밍]을 읽고 내용을 정리한 것입니다. 교보문고 링크 EntityManager와 영속성 컨텍스트 mybatis처럼 직접 SQL을 작성하거나 JPA를 활용한 개발을 할 때는 눈에 보이

private-space.tistory.com

 

Entity를 이용해 EntityManager가 DB와 결과를 주고받음

 

 

<EntityManager 종류 및 생성 방법>

1. Application-managed EntityManager(스프링 아니여도 가능)

  • EntityManager를 응용 프로그램에서 직접 생성, 이용 및 종료
    • EntityManagerFactory를 통해 EntityManager 객체 생성
  • 트랜잭션을 직접 시작 및 종료 처리 필요
    • javax.persistence.EntityTransaction 객체 이용

2. Container-managed EntityManager(스프링 사용)

  • EntityManager를 container(EJB 또는 Spring) 가 생성 및 관리 
    • EntityManager 생성, JNDI binding, lookup, open, close 등 실행
  • 응용 프로그램에서는 @PersistenceContext annotation을 통해 EntityManager 객체를 주입 받아 이용 (DI)
  • Container에서 트랜잭션 처리
    • 트랜잭션 시작 및 종료 수행
    • Container가 관리하는 트랜잭션에 EntityManager가 참여함

<주요 method>

https://docs.oracle.com/javaee/7/api/javax/persistence/EntityManager.html

 

EntityManager (Java(TM) EE 7 Specification APIs)

Interface used to interact with the persistence context. An EntityManager instance is associated with a persistence context. A persistence context is a set of entity instances in which for any persistent entity identity there is a unique entity instance. W

docs.oracle.com

  • persist
    • 새로 생성된 entity의 값을 entity와 mapping되어 있는 테이블(들)에 저장
      • SQL INSERT 문 생성 및 실행 -> 테이블에 새로운 레코드 추가(저장)
      • 트랜잭션이 commit될 때 데이터베이스에 최종적으로 반영됨 
    • Primary Key 등 테이블의 제약조건을 만족해야 함
      • INSERT 실패 시 javax.persistence.PersistenceException 발생
    • 수행 후 entity는 persistence context에 포함되어 영속성을 갖게 됨: "Managed" 상태
    • 연관 관계가 있고 cascade(종속)속성이 정의된 entity들도 함께 저장됨
      • 예: @OneToOne(cascade = CascadeType.PERSIST)

 

  •  find
    • Entity의 ID 값을 통해 entity 검색
      • Entity의 class 타입과 ID 값을 파라미터로 전달
        • Entity ID가 복합 식별자인 경우 해당 복합 키 클래스의 객체를 전달
        • 예: @IdClass나 @EmbeddedId를 이용하여 지정한 경우
      • 검색 결과로 entity 객체를 반환
        • 주어진 ID 값을 갖는 entity 정보가 존재하지 않는 경우 null 반환 
      • 데이터베이스 검색을 위해 SQL 질의(SELECT 문) 생성 및 실행
        • User user = entityManager.find(User.class, userId); 
        • = 같음 = SELECT * FROM USER WHERE USER_ID = userId;
      • Persistence provider는 생성된 entity 객체들을 cache에 저장
      • fetch : https://somuchthings.tistory.com/140 (설명 대체)
  • merge
    • “detached” 상태에 있는 entity는 merge()에 의해 “managed” 상태로 전이 가능
    • 전이된 후 변경된 값들이 데이터베이스에 반영됨
    • DB에 이미 존재하는 entity에 대해서만 merge() 수행 가능
    • 존재하지 않는 entity에 대해 실행 시 IllegalArgumentException 발생
    • 연관 관계가 있는 entity들에 대해 "cascading merge" 실행 가능
    • 추가 설명: https://velog.io/@sorzzzzy/JPA-%EB%B3%80%EA%B2%BD-%EA%B0%90%EC%A7%80%EC%99%80-%EB%B3%91%ED%95%A9merge

위 링크가 출처입니다

  • remove
    • 데이터베이스에서 entity 데이터 삭제
      • SQL DELETE 문 생성 및 실행
      • 트랜잭션 완료(commit) 시 데이터베이스에 반영됨 
    • “managed” 상태의 entity에 대해서만 remove() 실행 가능
      • Detached entity에 대해 실행할 경우 IllegalArgumentException 발생
    • 연관 관계가 있는 entity들에 대해 "cascading remove" 실행 가능
      • 일반적으로 one-to-one 또는 one-to-many 관계에 있는 entity들이 대상
      • 삭제되는 entity가 다른 entity들과 연관 관계가 있는 경우 주의

<생명주기>

  • 비영속
    • 영속성을 갖지 않는 단순한 객체 상태
    • new로 생성한 객체
  • 영속(Managed)
    • Entity가 영속성 컨텍스트에 저장되고 관리되는 상태
    • em.persist(entity); // 영속상태로 변경, DB에 저장 안된 상태
    • transaction.commit(); // commit을 해야 영속성 컨텍스트에 있는 값이 DB에 저장됨
    • find와 JPQL 쿼리문으로 값을 Read할 수 있음
    • EntityManager가 불러온 값 cache에 저장함(관리함)
  • 준영속
    • 영속성 컨텍스트에서 벗어나 영속성을 갖지 않는 상태
    • commit을 해도 DB와 동기화가 일어나지 않음
    • em.detach(Entity);
  • 삭제
    • 영속컨텍스트에서 삭제된 상태
    • DB에서 해당 객체가 사라짐
    • em.remove(Entity);

잘 설명해주신 글: https://gmlwjd9405.github.io/2019/08/08/jpa-entity-lifecycle.html

 

[JPA] 엔티티의 생명주기 (Entity LifeCycle) - Heee's Development Blog

Step by step goes a long way.

gmlwjd9405.github.io