본문 바로가기

공부 자료/Spring

[Spring MVC] JPA / 영속성 컨텍스트 관련 JPA API

[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 객체를 얻어야 함.