[Spring JPA] JPA, 영속성 컨텍스트

Eunho·2023년 4월 23일

spring

목록 보기
2/7

JPA란?

JPA(Java Persistence API)는 Java에서 사용하는 ORM 기술 표준 인터페이스 모음이다. JPA는 인터페이스이기 때문에, JPA를 구현한 Hibernate, EclipseLink, DataNucleus 등이 있다.
JPA는 반복적인 CRUD SQL을 처리해준다.

ORM : Object Relational Mapping의 약자로, 자바의 object와 관계형 DB를 매핑해주는 것

영속성 컨텍스트(persistence context)

1차 캐시

: 엔티티 정보 저장. 테이블에 저장, 조회, 수정, 삭제하는 데 사용

쓰기 지연 SQL 저장소

: 엔티티 CRUD에 대한 쿼리 저장

JPA 이용한 영속성 컨텍스트

사전 작업

spring initializr 이용해서 springboot 프로젝트 생성하고 !!

<applicaion.yml>
spring:
  h2:
    console:
      enabled: true
      path: /h2
  datasource:
    url: jdbc:h2:mem:test
  jpa:
    hibernate:
      ddl-auto: create
    show-sql: true
    
<build.gradle에 추가>
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'

영속성 컨텍스트에 데이터 추가

@Configuration
public class JpaConfig {
    private EntityManager entityManager;
    private EntityTransaction entityTransaction;

    @Bean
    public void JpaConfigTest(EntityManagerFactory emf) {
        this.entityManager = emf.createEntityManager();
        this.entityTransaction = entityManager.getTransaction();

		// 이 곳에 이후 등장하는 코드를 추가한다.        
    }
}

entityManager.persist(Entity)

        Member member = new Member("CheolSoo");
		entityManager.persist(member);

entityManager의 persist 메서드를 호출하면 member 객체가 영속성 컨텍스트의 1차 캐시에 저장되고, 쓰기 지연 SQL 저장소에 member 객체 insert 쿼리가 저장된다. member 객체가 영속성 컨텍스트에 저장되었으므로, 이후 member 엔티티는 entityManger 관리 하에 있다.

entityTransaction.begin(), commit()

		entityTransaction.begin();
        Member member = new Member("CheolSoo");
		entityManager.persist(member);
        entityTransaction.commit();

트랜잭션은 알다시피 한 작업 단위이다. entityTransaction의 begin() 메서드는 트랜잭션 시작점을 나타낸다. 이후 commit() 메서드를 호출할 때, 영속성 컨텍스트에 저장되어 있던 member 객체 insert 쿼리가 전송된다.

사실 쓰기 지연 SQL 저장소가 실제로 존재하는 게 아니라, commit()할 때 Entity에 대한 SQL이 동적으로 생성된다. 쓰기 지연 SQL 저장소는 이해를 돕기 위한 개념일 뿐이다.

profile
🌱우당탕탕 메모장 (●'◡'●)🌱

0개의 댓글