JPA(1)

김성수·2022년 11월 29일
0

SEB_BE

목록 보기
15/31

JPA(Java Persistence API)

Java Persistence API의 약자이지만 현재는 Jakarta Persistence라고도 불린다.

Hibernate ORM

  • JPA 표준 사양을 구현한 구현체로는 Hobernate ORM, EclipseLink, DataNucleus 가 있는데, 일반적인 것은 Hibernate ORM이다.
  • JPA에서 정의해둔 인터페이스를 구현한 구현체이지만, JPA에서 지원하는 기능 이외에 Hibernate 자체적으로 사용할 수 있는 API 역시 지원한다.

Persistence

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

영속성 컨텍스트(Persistence Context)

  • JPA는 테이블과 매핑되는 엔티티 객체 정보를 영속성 컨텍스트(Persistence Context)라는 곳에 보관해서 애플리케이션 내에서 오래 지속되도록 한다.
  • 영속성 컨텍스트(Persistence Context)에는 1차 캐시 영역쓰기 지연 SQL 저장소 영역이 있다.
  • JPA API 중에서 엔티티 정보를 영속성 컨텍스트에 저장(Persist)하는 API를 사용하면 영속성 컨텍스트의 1차 캐시에 엔티티 정보가 저장된다.

JPA API를 사용하려면 다음과 같은 의존 라이브러리를 추가해야한다.

implementation 'org.springframework.boot:spring-boot-starter-data-jpa' // (1)

위 라이브러리를 추가하면 Spring Data JPA 기술을 포함해서 JPA API를 사용할 수 있다.

  • application.properties or yml 에 다음과 같이 지정해 줄 수 있는데..
    jpa:
      hibernate:
        ddl-auto : create # (1) 스키마 자동 생성
      show-sql : true     # (2) SQL 쿼리 출력
  • (1)과 같이 설정해주면, 애플리케이션 실행 시, 엔티티와 매핑되는 테이블을 데이터베이스에 자동으로 생성해준다.
  • (2)의 설정을 추가하면 JPA API를 통해서 실행되는 SQL 쿼리를 로그로 출력해준다.

yml 파일에 들여쓰기 잘 하자!!

JPA의 EntityManager 흐름.

  1. JPA의 영속성 컨텍스트를 관리하는 클래스EntityManagerEntityManagerFactory를 통해서 생성
  2. EntityManager를 통해서 Transaction 객체를 얻는다.
  • EntityManager를 통해서 얻은 Transaction객체를 기준으로 데이터베이스의 테이블에 데이터를 저장한다.

JPA의 영속성 컨텍스트 흐름.

영속성 컨텍스트(Persistence Context)1차 캐시쓰기 지연 SQL 저장소가 있다.

먼저 EntityManeger를 통해서 Transaction 객체를 얻어와야 한다.
Transaction 객체를 얻어오면, (얻어온 Transaction 객체의 인스턴스를 가리키는 변수를 tx라고 하겠다)

tx.begin()메서드를 통해서 트랜잭션을 시작하고, EntityManager의 객체Persistence에 저장할 객체를 저장하면, 1차캐시에 객체가 저장되고, 그 객체를 DB에 (디비 자고 싶네 또..) 저장하기 위해, 1차캐시에 저장된 객체정보와 테이블의 속성에 맞춰서 쓰기 지연 SQL 저장소에 1차캐시에 저장된 객체를 테이블에 저장하기 위한 SQL문을 작성해놓는다. 그리고 tx.commit()을 하면 SQL문을 데이터베이스로 날리면서 쓰기 지연 SQL 저장소는 비워진다.

JPA 관련 애너테이션

@Id

  • 이 애너테이션을 추가한 멤버 변수는 해당 엔티티의 고유 식별자 여할을 하고, 이 식별자는 데이터베이스의 Primary key(PK)로 지정한 컬럼에 해당된다.
  • JPA사용시 필수 애너테이션이다.

@Table

  • 이 애너테이션을 추가하지 않으면 기본적으로 클래스 명이 테이블의 이름과 매핑된다.
  • 해당 애너테이션의 값으로 테이블명을 정해줄 수 있다.
  • 애트리뷰트
    • name
      • 테이블 이름을 설정할 수 있다.
      • name을 설정하지 않으면 기본값으로 클래스 이름을 테이블 이름으로 사용한다.
      • 주로 테이블 이름이 클래스 이름과 달라야 할 경우에 추가해준다.

@GeneratedValue

  • 애너테이션은 식별자를 생성해주는 전략을 지정할 때 사용한다.
  • 식별자에 해당하는 멤버 변수에 @GeneratedValue애너테이션을 추가하면 데이터베이스 테이블에서 기본키가 되는 식별자를 자동으로 설정해준다.

@Entity

  • 이 애너테이션을 이용해서 엔티티 클래스와 테이블을 매핑한다.
  • 이 애너테이션을 클래스 앞에 붙이면 해당 클래스는 JPA의 관리 대상 엔티티가 된다.
  • JPA 사용시 필수 애너테이션이다.
  • 애트리뷰트
    • name
      • 엔티티 이름을 설정할 수 있다.
      • name을 설정하지 않으면 기본값으로 클래스 이름을 엔티티 이름으로 사용한다.
profile
쌩수 Git >> https://github.com/SsangSoo?tab=repositories

1개의 댓글

comment-user-thumbnail
2022년 12월 1일

커밋 ㅇ

답글 달기