728x90
JPA란 ?
Java 진영에서 사용하는 ORM 기술의 표준 사양 - Java의 인터페이스로 사양이 정의되어 있음
Java Persistence API의 약자이지만 현재는 Jakarta Persistence라고도 불림
Hibernate ORM
JPA 표준 사양을 구현한 구현체 (이 외에도 EclipseLink, DataNucleus 등이 있음)
데이터 액세스 계층에서의 JPA 위치
데이터 액세스 계층의 상단에 위치함
데이터 저장, 조회 등의 작업은 JPA를 거쳐 JPA의 구현체인 Hibernate ORM을 통해서 이루어지며 Hibernate ORM은 내부적으로 JDBC API를 이용해서 데이터베이스에 접근한다
영속성 컨텍스트 (Persistence Context)
JPA의 P에해당하는 Persistence의 의미는 영속성, 지속성이라는 뜻으로
테이블과 매핑되는 엔티티 객체 정보를 Persistence Context 라는 곳에 보관하여
애플리케이션 내에서 오래 지속되도록 한다
이곳에 보관된 엔티티 정보는 데이터베이스 테이블에 데이터를 저장, 수정, 조회, 삭제하는데 사용된다
영속성 컨텍스트 관련 JPA API
EntityManager 클래스
- persist() : 엔티티 객체를 영속성 컨텍스트에 저장
- 1차 캐시에 엔티티 객체가 저장되고 쓰기지연SQL저장소에 DB에 날릴 쿼리문이 저장된다
- 엔티티 객체의 setter 메서드를 이용하여 영속성 컨텍스트에 저장된 엔티티 객체의 정보를 업데이트 할 수 있음
- remove() : 엔티티 객체를 영속성 컨텍스트에서 제거한다
- 1차 캐시에 등록된 엔티티 객체를 제거하고 쓰기지연SQL저장소에 DB에 날릴 쿼리문을 저장한다 (DELETE 쿼리)
- flush() : 영속성 컨텍스트의 변경사항을 테이블에 반영한다
- 쓰기지연SQL저장소의 쿼리문을 날려 보낸다
- find() : 먼저 1차 캐시에서 해당 객체가 있는지 조회하고, 없으면 테이블에 SELECT 쿼리를 전송해서 조회한다
EntityTransaction 클래스
- commit() : 쓰기지연SQL저장소에 등록된 쿼리문을 날려보낸다
- 내부적으로 flush() 메서드가 호출된다
예시)
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();
this.tx = em.getTransaction();
return args -> {
example();
};
}
private void example05() {
tx.begin();
// 영속성 컨텍스트의 1차 캐시에 엔티티 객체를 저장하고 쓰기지연SQL저장소에 INSERT 쿼리문을 등록한다
em.persist(new Member("test@test.com"));
tx.commit(); // 쓰기지연SQL저장소의 INSERT 쿼리문을 날려보냄
tx.begin();
// 1차 캐시에서 조회합니다 (1차 캐시에 객체가 있으므로 쿼리문을 날려보내지 않음)
Member member = em.find(Member.class, 1L);
// 1차 캐시의 엔티티 객체를 제거하고 DELETE쿼리문을 쓰기지연SQL저장소에 등록
em.remove(member);
tx.commit(); // DELETE 쿼리문을 날려보냄
}
}
728x90
'개발일지 > Spring' 카테고리의 다른 글
Spring JPA 연관 관계 매핑 (0) | 2022.11.05 |
---|---|
Spring JPA 엔티티 매핑 (0) | 2022.11.05 |
Spring - Pagination (0) | 2022.10.31 |
Spring - AOP (0) | 2022.10.23 |
Spring MVC의 동작 방식과 구성 요소 (0) | 2022.10.22 |