본문 바로가기

JPA

영속성 컨텍스트

JPA에서 정말 중요한 개념 중 하나인 영속성 컨텍스트!!!!

무엇인지 파헤쳐보자~~~

 

웹에서의 JPA

JPA가 웹 환경에서 동작할 때 웹으로 오는 각 요청마다 EntityManagerFactory에 의해 EntityManager 객체가 생성된다.

또한 생성된 EntityManager 객체는 DB connection pool을 활용해 DB와 접속한다.

우리는 이렇게 DB에 접속된 EntityManager를 활용해서 각종 쿼리를 날리며 DB와 통신한다.


package hellojpa;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import java.util.List;

public class JpaMain {
    public static void main(String[] args) {
        //애플리케이션 로딩 시점에 DB당 딱 하나만 만들어야 하며, 애플리케이션 전체에서 공유한다.
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");

        //트랜잭션마다 EntityManager를 만들어줘야 한다.
        EntityManager em = emf.createEntityManager(); // 고객요청 시마다 생성(쓰레드 간에 공유 X)

        EntityTransaction tx = em.getTransaction();
        tx.begin(); //트랜잭션 시작

        try {
            //비영속 상태
            Member member = new Member();
            member.setId(1L);
            member.setName("codeMania");

            //영속 상태
            System.out.println("=== BEFORE ===");
            em.persist(member);
            System.out.println("=== AFTER ===");
            tx.commit();
        } catch (Exception e) {
            tx.rollback();
        } finally {
            em.close(); //사용 후 반드시 닫아줘야 한다
        }
        emf.close(); //애플리케이션이 끝나면 EntityManagerFactory를 닫아줘야 한다.
    }
}

 

프로젝트 설정이 궁금하면 [JPA로 CRUD해보기]를 참고하자!!!!!!!!!

 

JPA로 CRUD해보기(1) DB 구축하기 :: 코드매니아

 

code-mania.tistory.com

 

persist와 insert 쿼리

자 위와 같은 코드에서 insert 쿼리가 DB로 날아가는 시점은 언제일까? insert 쿼리가 콘솔에 언제 찍히는지 생각하면 된다.

persist는 Entity를 DB에 저장하기 위한 함수이니 BEFORE와 AFTER 사이일까???

애석하게도 아니다. AFTER가 콘솔에 출력되고 나서 insert 쿼리가 출력된다. 왜 이렇게 되는 걸까??

다른 말로 하면 AFTER가 출력되고 나서야 insert 쿼리가 DB로 날아간다는 뜻이다.

사실 persist 메서드는 DB에 insert 쿼리를 날리기 위한 함수가 아니다. 정확하게 말하면 Entity 객체를 영속성 컨텍스트에 저장하는 메서드이다.

쉽게 생각하면 된다. 영속성컨텍스트는 논리적 개념으로 눈에 보이지 않고, EntityManager를 통해서 접근가능한 가상공간이다.

EntityManager와 이 가상공간(영속성컨텍스트)은 1대1의 관계를 가지는데, persist 메서드는 이 가상공간에 Entity를 저장하겠다는 뜻이다.

JPA는 이렇게 영속성컨텍스트에 저장된 Entity를 트랜잭션 커밋 시점에 DB에 insert쿼리로 날아가는 것이다.

 

엔티티의 생명주기

persist 메서드는 영속성컨텍스트에 Entity 객체를 저장한다고 했다.

이렇게 Entity 객체가 영속성컨텍스트에 저장된 상태를 영속(managed) 상태라고 한다.

쉽게 생각하자. JPA가 관리한다는 뜻이다.

이렇게 persist에 의해 영속상태(JPA가 관리하는)가 된 Entity 객체는 트랜잭션 커밋 시점에 DB에 insert되는 것이다.

 

그러면 persist하기 전 Entity의 상태는 뭐라고 할까? 위 코드를 예로 들면 BEFORE를 찍을 때까지가 해당된다.

이렇게 영속 상태가 아닌 순수 Entity 객체를 보고 비영속 상태에 있다고 한다.

그리고 비영속 상태의 Entity 객체는 트랜잭션 커밋을 하여도 DB에 어떤 변화도 일으키지 않는다.

 

그러면 영속성컨텍스트는 왜 있어야 될까??? 그냥 persist할 때 바로바로 insert 쿼리 날리면 안 되나???

이건 다음 글에서 알아보도록 하자~~~~

 

참고강의: 배달의 민족 개발팀장 김영한 강사님의 JPA 강의

'JPA' 카테고리의 다른 글

flush  (0) 2021.02.13
영속성 컨텍스트의 장점  (0) 2021.02.13
JPA로 CRUD해보기(4) JPQL  (0) 2021.02.09
JPA로 CRUD해보기(3) Entity와 CRUD 코드 작성해보기  (0) 2021.02.08
JPA로 CRUD해보기(2) 틀 코드 작성하기  (0) 2021.02.08