[Section 3] JPA

Kim·2022년 11월 1일
0

Boot Camp

목록 보기
40/64
post-thumbnail

Day 47. Spring Data JDBC

이 날은 Spring Data JDBC를 이용한 실습을 진행했기에 따로 글을 작성하진 않았다.
페이지네이션(Pagination) 기능을 적용해보았는데 많이 어렵게 느껴졌다.
Reference : Pagination for JDBC
Reference : Pagination for JPA


JPA(Java Persistence API)

JPA는 Java 진영에서 사용하는 ORM(Object-Relational Mapping) 기술의 표준 사양 또는 명세이다.
즉, Java의 인터페이스로 사양이 정의되어 있어 JPA라는 표준 사양을 구현한 구현체는 따로 있다는 것이다.

JPA는 Java Persistence API의 약자이지만 현재는 Jakarta Persistence라고도 말한다.

Hibernate ORM

JPA 표준 사양을 구현한 구현체 중 하나는 Hibernate ORM이다.
Hibernate ORM은 JPA에서 정의해둔 인터페이스를 구현한 구현체로, JPA에서 지원하는 기능 이외에 Hibernate 자체적으로 사용할 수 있는 API도 지원한다.

데이터 액세스 계층에서의 JPA 위치

JPA는 그림에서 알 수 있듯이 데이터 액세스 계층의 상단에 위치한다.
데이터 저장, 조회 등의 작업은 JPA를 거쳐 JPA의 구현체인 Hibernate ORM을 통해 이루어지고, Hibernate ORM은 내부적으로 JDBC API를 이용해서 DB에 접근한다.

JPA의 P(Persistence)의 의미

Persistence란 영속성, 지속성이란 의미를 갖고 있다. 무언가가 사라지지 않고 오래 지속되게 한다는 것이 Persistence의 목적이다.

영속성 컨텍스트(Persistence Context)

ORM은 객체와 DB 테이블 매핑을 통해 엔티티 클래스 객체 안에 포함된 정보를 테이블에 저장하는 기술이다.
JPA에서는 테이블과 매핑되는 엔티티 객체 정보를 영속성 컨텍스트라는 곳에 보관해 애플리케이션 내에서 오래 지속되게 한다. 이렇게 보관된 엔티티 정보는 DB 테이블에 데이터를 저장 및 수정, 조회, 삭제하는데 사용된다.

영속성 컨텍스트에는 1차 캐시 영역과 쓰기 지연 SQL 저장소 영역이 있다.
JPA API 중 엔티티 정보를 영속성 컨텍스트에 저장하는 API를 사용하면, 영속성 컨텍스트의 1차 캐시에 엔티티 정보가 저장된다.

JPA API를 사용하기 위한 사전 준비

dependencies {
	...
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
}

build.gradle에 위와 같이 PA를 사용하기 위한 의존 라이브러리 코드를 추가해준다.
spring-boot-starter-data-jpa를 추가하면 기본적으로 Spring Data JPA 기술을 포함해서 JPA API를 사용할 수 있다.

spring:
	...  
  datasource:
    url: ...
  jpa:
    hibernate:
      ddl-auto: create  # (1) 스키마 자동 생성
    show-sql: true      # (2) SQL 쿼리 출력

application.yml에 (1)과 (2) 설정을 추가해준다.

  • (1) : JPA에서 사용하는 엔티티 클래스를 정의하고 애플리케이션 실행 시, 이 엔티티와 매핑되는 테이블을 데이터베이스에 자동으로 생성해준다.

  • (2) : JPA의 동작 과정을 이해하기 위해 JPA API를 통해서 실행되는 SQL 쿼리를 로그로 출력해준다.
    또한, JPA가 자동으로 DB에 테이블을 생성한다.

    . . .

// 실습 코드 생략
  • em.persist()를 호출하면 영속성 컨텍스트의 1차 캐시에 엔티티 클래스의 객체가 저장되고, 쓰기 지연 SQL 저장소에 INSERT 쿼리가 등록된다.

  • tx.commit()을 하는 순간, 쓰기 지연 SQL 저장소에 등록된 INSERT 쿼리가 실행되고, 실행된 INSERT 쿼리는 쓰기 지연 SQL 저장소에서 제거된다.

  • em.find()를 호출하면 먼저 1차 캐시에서 해당 객체가 있는지 조회하고, 없으면 테이블에 SELECT 쿼리를 전송해서 조회한다.

EntityManager의 flush() API
tx.commit() 메서드가 호출되면, JPA 내부적으로 em.flush() 메서드가 호출되어 영속성 컨텍스트의 변경 내용을 DB에 반영한다.

🔑Key Summary

  • JPA(Java Persistence API)는 Java 진영에서 사용하는 ORM(Object-Relational Mapping) 기술의 표준 사양 혹은 명세이다.

  • Hibernate ORM은 JPA에서 정의해둔 인터페이스를 구현한 구현체로써 JPA에서 지원하는 기능 이외에 Hibernate 자체적으로 사용할 수 있는 API 역시 지원하고있다.

  • JPA에서는 테이블과 매핑되는 엔티티 객체 정보를 영속성 컨텍스트(Persistence Context)에 보관해서 애플리케이션 내에서 오래 지속 되도록 한다.

  • 영속성 컨텍스트 관련 JPA API
    em.persist()를 사용해서 엔티티 객체를 영속성 컨텍스트에 저장할 수 있다.
    엔티티 객체의 setter 메서드를 사용해서 영속성 컨텍스트에 저장된 엔티티 객체의 정보를 업데이트 할 수 있다.
    em.remove()를 사용해서 엔티티 객체를 영속성 컨텍스트에서 제거할 수 있다.
    em.flush()를 사용해서 영속성 컨텍스트의 변경 사항을 테이블에 반영할 수 있다.
    tx.commit()을 호출하면 내부적으로 em.flush()가 호출된다.


참고 자료

📕 JPA 연관 관계 한방에 정리 (단방향/양방향, 연관 관계의 주인, 일대일, 다대일, 일대다, 다대다)

🍃 Initialize a Database Using Hibernate

0개의 댓글