[JPA]
JPA(Java Persistence API)
: Java 진영에서 사용하는 ORM(Object-Relational Mapping) 기술의 표준 사용(또는 명세, Specification)
* 표준사양 : Java 인터페이스로 사양이 정의되어 있기에 JPA라는 표준 사양을 구현한 구현체는 따로 있다는 것을 의미
* Persistence : 영속성, 지속성의 의미로 무언가를 금방 사라지지 않고 오래 지속되게 한다는 것
즉, JPA 표준 사양을 구현한 구현체를 학습하는 것
데이터 액세스 계층(Data Access Layer)
: JPA는 데이터 액세스 계층 상단에 위치 (JPA >> Hibernate ORM >> JDBC API)
: 데이터 저장/조회 등의 작업은 JPA를 거쳐 구현체인 Hibernate ORM을 통해 진행되며, JDBC API를 이용해 DB에 접근함
Hibernate ORM
: JAP에서 정의해 둔 인터페이스를 구현한 구현체로서 JPA에서 지원하는 기능 이외 Hibernate 자체적으로 사용할 수 있는 API를 지원함
[영속성 컨텍스트]
영속성 컨텍스트(Persistence Context)
: JPA에서 테이블과 매핑되는 엔티티 객체 정보를 보관하는 곳으로, 애플리케이션 내에서 오래 지속되도록 함
* ORM : 객체외 DB 테이블의 매핑을 통해 엔티티 클래스 객체 안에 포함된 정보를 테이블에 저장하는 기술
내부)
'영속성 컨텍스트 = 1차 캐시 + 쓰기 지연 SQL 저장소' 로 이루어져 있음
1차 캐시 : JPA API 중에서 엔티티 정보를 영속성 컨텍스트에 저장하는 API를 사용하면 엔티티 정보가 저장되는 영역
[JPA API 영속성 컨텍스트 진행]
사전준비
1) build.gradle 설정에 추가 필요
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
2) JPA 설정 (application.yml)
jpa:
hibernate:
ddl-auto: create # (1) 스키마 자동 생성
show-sql: true # (2) SQL 쿼리 출력
EntityManager 클래스
: JPA 영속성 컨텍스트를 관리
1) EntityManager 클래스 객체는 EntityManagerFactory 객체를 Spring으로부터 DI 받을 수 있음
2) EntityMangerFactory의 createEntityManger() 메서드를 이용해 EntityManger 클래스 객체를 얻을 수 있음
>> EntityManager 클래스를 통해 JPA의 API 메서드 사용이 가능해짐
private EntityManager em; //EntityManager 객체 생성
private EntityTransaction tx; // EntityTransaction 객체 생성
em.persist() //(1)
em.remove() //(2)
em.flush() //(3)
tx.commit() //(4)
em.find(조회할 엔티티 클래스, 조회할 엔티티 클래스 식별자) //(5)
1. persist()
: 영속성 컨텍스트에 객체 정보를 저장
: 1차 캐시에 객체를 저장하며, 쓰기 지연 SQL 저장소에 INSERT 쿼리 형태로 등록
: 영속성 컨텍스트에 객체를 저장하지만 실제 테이블에 저장하지는 않음
: setter 메서드를 사용해 영속성 컨텍스트에 저장된 객체의 정보를 업데이트 가능
2. remove()
: 엔티티 객체를 영속성 컨텍스트에서 제거
3. flush()
: commit() 메서드가 호출될 경우 내부적으로 flush() 메서드가 호출되어 영속성 컨텍스트의 변경 내용을 DB에 반영
4. commit()
: 해당 시점에 영속성 컨텍스트에 존재하는 객체는 DB 테이블에 저장
5. find()
: 영속성 컨텍스트에 객체가 잘 저장되었는지 조회
** JPA는 Transaction 객체를 기준으로 DB 테이블에 데이터를 저장하기 때문에 EntityManager에서 Transaction 객체를 얻어야 함.
'공부 자료 > Spring' 카테고리의 다른 글
[Spring MVC] 트랜잭션 전파/격리 레벨 (0) | 2022.11.05 |
---|---|
[Spring MVC] 트랜잭션 기본 및 적용 (0) | 2022.11.04 |
[Java MVC] DDD(Domain Driven Design) (0) | 2022.10.30 |
[Spring MVC] About 'Spring Data JDBC' (0) | 2022.10.27 |
[Spring MVC] About JDBC(Java Database Connectivity) (0) | 2022.10.27 |