JPA(Java Persistence API)는 Java 진영에서 사용하는 ORM(Object-Relational Mapping) 기술의 표준 사양(또는 명세, Specification)이다.
표준 사양(또는 명세)이라는 의미는 다시 말하면 Java의 인터페이스로 사양이 정의되어 있기 때문에 JPA라는 표준 사양을 구현한 구현체는 따로 있다는 것을 의미한다.
JPA 표준 사양을 구현한 구현체로는 Hibernate ORM, EclipseLink, DataNucleus 등이 존재한다.
ORM은 객체(Object)와 데이터베이스 테이블의 매핑을 통해 엔티티 클래스 객체 안에 포함된 정보를 테이블에 저장하는 기술이다.
JPA에서는 테이블과 매핑되는 엔티티 객체 정보를 영속성 컨텍스트(Persistence Context)라는 곳에 보관해서 애플리케이션 내에서 오래 지속 되도록 한다.
그리고 이렇게 보관된 엔티티 정보는 데이터베이스 테이블에 데이터를 저장, 수정, 조회, 삭제하는데 사용된다.
영속성 컨텍스트에는 1차 캐시라는 영역과 쓰기 지연 SQL 저장소라는 영역이 있다.
JPA API 중에서 엔티티 정보를 영속성 컨텍스트에 저장(persist)하는 API를 사용하면 영속성 컨텍스트의 1차 캐시에 엔티티 정보가 저장된다.
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
}
spring-boot-starter-data-jpa
를 추가하면 기본적으로 Spring Data JPA 기술을 포함해서 JPA API를 사용할 수 있다.
spring:
h2:
console:
enabled: true
path: /h2
datasource:
url: jdbc:h2:mem:test
jpa:
hibernate:
ddl-auto: create # (1) 스키마 자동 생성
show-sql: true # (2) SQL 쿼리 출력
(1) 과 같이 설정을 추가해 주면 우리가 JPA에서 사용하는 엔티티 클래스를 정의하고 애플리케이션 실행 시, 이 엔티티와 매핑되는 테이블을 데이터베이스에 자동으로 생성해준다.
(2) 와 같이 설정을 추가해주면 JPA의 동작 과정을 이해하기 위해 JPA API를 통해서 실행되는 SQL 쿼리를 로그로 출력해준다.
@GeneratedValue
식별자를 생성해주는 전략을 지정할 때 사용하며, 필드 위에 작성한다.
.begin()
Transaction
을 시작하기 위해서 사용한다.
.commit()
호출하는 시점에 영속성 컨텍스트에 저장되어 있는 객체를 데이터베이스의 테이블에 저장한다.
INSERT 쿼리가 실행되어 쓰기 지연 SQL 저장소에서 사라진다.
.persist(abc)
영속성 컨테스트의 1차 캐시에 abc 객체가 저장되고, 이 abc 객체는 쓰기 지연 SQL 저장소에 INSERT 쿼리 형태로 등록이 된다.
.find(a, b)
영속성 컨텍스트의 1차 캐시에서 해당 객체가 있는지 조회한다.
첫 번째 파라미터 a
는 조회할 엔티티 클래스의 타입
두 번째 파라미터 b
는 조회할 엔티티 클래스의 식별자 값
영속성 컨텍스트에 식별자 값인
b
가 존재하지 않는다면 테이블에 직접 SELECT 쿼리를 전송한다.
.remove(a)
영속성 컨텍스트의 1차 캐시에 있는 엔티티 a
의 제거를 요청한다.
.flush()
.commit()
메서드가 호출되면 JPA 내부적으로 .flush()
메서드가 호출되어 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영한다.