우선 코드 구조를 살펴보자.
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 |