JPA는 Java진영에서 사용하는 ORM기술의 표준사양(또는 명세)
JAVA의 인터페이스로 사양이 정의되어있기때문에 JPA라는 표준 사양을 구현한 구현체는 따로 있다는 것을 의미.
JPA에서 정의해둔 인터페이스를 구현한 구현체로써 JPA에서 지원하는 기능 외에
Hibernate자체적으로 사용할수있는 API를 지원하고있다
JPA는 Java Persistence API의 약자이지만 , 현재는 Jakarta Persistence라고도 불린다
데이터 저장, 조회 등의 작업은 JPA를 거쳐 구현체인 Hibrenate ORM를 통해 이루어진다. 해당 DB는 내부적으로 JDBC API를 이용해서 DB에 접근하게 된다.
영속성 컨텍스트
ORM은 객체와 데이터베이스 테이블의 매핑을 통해 엔티티 클래스 객체 안에 포함된 정보를 테이블에 저장하는 기술
JPA에서는 테이블과 매핑되는 엔티티 객체 정보를 영속성 컨텍스트 라는 곳에 보관해서 애플리케이션 내에서 오래 지속되도록 한다.
그림으로 표현된 영속성 컨텍스트
1차 캐시, 쓰기지연 SQL저장소의 영억이있다
JPA API중에서 엔티티 정보를 영속성 컨텍스트에 저장하는 API를 사용하면 1차 캐시에 엔티티 정보가 저장
영속성 컨텍스트에 엔티티를 저장하는 클래스
import lombok.Getter;
import javax.persistence.*;
@Getter
@Setter
@NoArgsConstructor
@Entity // (1)
public class Member {
@Id // (2)
@GeneratedValue // (3)
private Long memberId;
private String email;
public Member(String email) {
this.email = email;
}
}
@Entity 애너테이션과 @Id애너테이션을 추가해주면 JPA에서 해당클래스를 엔티티 클래스로 인식함
@GemeratedValue애너테이션은 식별자를 생성해주는 전략을 지정할때 사용
=>기본키가 되는 식별자를 자동으로 설정해준다
package com.codestates.basic;
import org.springframework.boot.CommandLineRunner;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
@Configuration
public class JpaBasicConfig {
private EntityManager em;
private EntityTransaction tx;
@Bean
public CommandLineRunner testJpaBasicRunner(EntityManagerFactory emFactory) {
this.em = emFactory.createEntityManager();
// (1)
this.tx = em.getTransaction();
return args -> {
example02();
};
}
private void example02() {
// (2)
tx.begin();
Member member = new Member("hgd@gmail.com");
// (3)
em.persist(member);
// (4)
tx.commit();
// (5)
Member resultMember1 = em.find(Member.class, 1L);
System.out.println("Id: " + resultMember1.getMemberId() + ", email: " + resultMember1.getEmail());
// (6)
Member resultMember2 = em.find(Member.class, 2L);
// (7)
System.out.println(resultMember2 == null);
}
}
위 코드는 Member 엔티티 클래스의 객체를 JPA의 영속성 컨텍스트에 저장하는 예제코드
영속석 컨텍스트는 EntityManager클래스에 의해서 관리됨
해당 객체는 EntityManagerFactory객체를 Spring으로부터 DI를 받을수있다 -> 스프링 의존
EntityManager클래스의 객체를 통해 API메서드를 사용할수있다
persist(member)메서드를 호출하면 영속성 컨텍스트에 member 객체의 정보들이 저장됨