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 질의 생성 및 실행
- 질의 결과에 대해 영속적 객체 생성
참고한 관련 링크:
[JPA] EntityManager, 영속성 컨텍스트
김영한 님의 [자바 ORM 표준 JPA 프로그래밍]을 읽고 내용을 정리한 것입니다. 교보문고 링크 EntityManager와 영속성 컨텍스트 mybatis처럼 직접 SQL을 작성하거나 JPA를 활용한 개발을 할 때는 눈에 보이
private-space.tistory.com

<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)
- 새로 생성된 entity의 값을 entity와 mapping되어 있는 테이블(들)에 저장

- 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 (설명 대체)
- Entity의 class 타입과 ID 값을 파라미터로 전달
- Entity의 ID 값을 통해 entity 검색
- 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들과 연관 관계가 있는 경우 주의
- 데이터베이스에서 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
'Spring' 카테고리의 다른 글
| JPA(2), ORM Annotation (0) | 2024.06.10 |
|---|---|
| [Spring] XML기반의 Bean 설정(Configuration) (0) | 2024.03.21 |
| [Spring]#12 이전 실습 정리&마무리 (0) | 2024.02.22 |
| [Spring]#11 객체 지향 원리와 적용 (1) | 2024.02.18 |
| [Spring]#10 순수 Java 개발 실습 (0) | 2024.02.03 |