728x90

우선 코드 구조를 살펴보자.

import jakarta.persistence.*;
import jpabasic.reserve.domain.User;
import java.time.LocalDateTime;

public class UserSaveMain {
    public static void main(String[] args) {
        EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("jpabegin");
        EntityManager entityManager = entityManagerFactory.createEntityManager();
        EntityTransaction transaction = entityManager.getTransaction();

        try{
            transaction.begin();
            User user = new User("hello@gmail.com", "hello", LocalDateTime.now());
            entityManager.persist(user);
            transaction.commit();
        } catch(Exception exception){
            exception.printStackTrace();
            transaction.rollback();
        }finally {
            entityManager.close();
        }

        entityManagerFactory.close();
    }
}

데이터를 추가하는 코드는 저번에도 보았듯 이렇게 작성이 되었었다.

 

해당 코드 구조를 하나씩 살펴보면

EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("jpabegin");

EntityManagerFactory는 영속 단위 기준으로 생성을 한다.

Persistence.xml에 작성했던 영속 단위 기준이다.

애플리케이션을 처음 구동할 때 딱 한 번만 생성하게 된다.

그렇게 애플리케이션을 모두 사용하고 close 메서드를 이용하여 닫아서 자원을 반환한다.

 

EntityManager entityManager = entityManagerFactory.createEntityManager();
EntityTransaction transaction = entityManager.getTransaction();

try{
	transaction.begin();
	User user = new User("hello@gmail.com", "hello", LocalDateTime.now());
	entityManager.persist(user);
	transaction.commit();
} catch(Exception exception){
	exception.printStackTrace();
	transaction.rollback();
}finally {
	entityManager.close();
}

EntityManager는 JPA에서 핵심 역할을 한다.

Factory를 이용해서 EntityManager를 생성하고

트랜젝션이 필요한 작업을 할 때는 entityTransaction을 구한다.

 

여기서 insert 쿼리는 commit을 하는 순간에 실행이 된다.

 

수정도 마찬가지로

transaction.begin();
User user = entityManager.find(User.class, "hello@gmail.com");
if(user == null) System.out.println("User 없음");
else user.setName("hi");

//수정도 커밋 시점에 update 쿼리를 실행
transaction.commit();

조회하는 순간에 select 쿼리가 실행이 되고  트랜젝션 사이에서 데이터를 변경하고 commit하는 순간에 update 쿼리를 실행한다.

 

이렇게 commit 시점에서 쿼리를 실행하는 게 영속 컨텍스트 때문이다.

영속 컨텍스트는 DB에서 읽어온 객체, 응용프로그램에서 저장한 객체, entityManager를 읽어온 객체를 저장하고 있는 메모리 공간이다.

이 객체들을 보관하고 있다가 commit 시점에 변경이 발생했는 지를 확인하고 그 변경된 내용을 DB에 반영한다.

그렇기 때문에 바로 DB에 저장이 되는 것이 아니라 영속 컨텍스트에서 저장되어 있다가 나중에 commit()을 실행하는 시점에 DB에 반영이 되는 것이다.

'백엔드 > JPA' 카테고리의 다른 글

JPA 6장 (@Embeddable)  (0) 2023.03.17
JPA 5장 (Entity 식별자 생성 방식)  (0) 2023.03.16
JPA 4장 (Entity에 대하여)  (0) 2023.03.16
JPA 3장 (간단한 CRUD 구현해보기)  (0) 2023.03.16
JPA 1장 (우선 시작해보기)  (0) 2023.03.15

+ Recent posts