본문 바로가기
웹 개발/jpa

[jpa] JPA 영속성 컨텍스트란? with EntityManager #1

by dani0312 2023. 12. 23.

본 글에 앞서 JPA의 구동 방식과 EntityManager, EntityManagerFactory에 대해 잘 모른다면 아래 글을 먼저 참고하시는 것이 좋습니다.  

2023.12.19 - [웹 개발/Jpa] - [jpa] JPA구동 방식 + EntityManager, EntityManagerFactory 란?

 

📌 JPA 영속성 컨텍스트

EntityManager

영속성 컨텍스트를 이해하기에 앞서, JPA구동 방식 포스팅에서 EntityManager에 대해 알아보았지만 다시 짧게 요약하면, EntityManager는 엔티티를 관리하는 역할을 하여 데이터베이스에 CRUD를 할 수 있게 하는 JPA의 핵심적인 역할을 하는 녀석이다.

 

'엔티티매니저는 생성될 때 영속성 컨텍스트라는 것을 함께 생성해 이것을 통해 관리한다.' 라고 하였다. 이 말은 텍스트 그대로 엔티티매니저가 생성될 때 영속성 컨텍스트라는 것도 함께 생성이 된다는 것이다. 

그렇다면 영속성 컨텍스트란 무엇일까?

 

 

영속성 컨텍스트

JPA 학습에 있어 가장 중요한 것 2가지를 말한다면 아래와 같다고 한다.

1. 객체와 관계형 데이터베이스 매핑하기

2. 영속성 컨텍스트

 

1번은 DB를 어떻게 설계하고, 객체를 어떻게 설계하여 이 두 가지를 어떻게 JPA로 매핑해서 쓸 것인지에 대한 설계와 관련된 부분이라면 2번은 JPA가 어떻게 동작하는가?와 관련이 있다. 이것을 명확히 이해하면 JPA가 내부적으로 어떻게 동작하는지를 이해할 수 있다. 영속성 컨텍스트는 아래와 같은 특징이 있다.


💧객체를 관리하는데 사용되는 중요한 개념

💧JPA를 이해하기 위한 핵심요소

💧"엔티티를 영구 저장하는 환경"이라는 뜻

💧 EntityManager.persist(entity);

 

영속성 컨텍스트는 '엔티티를 영구 저장하는 환경'이라는 뜻이다. 엔티티매니저를 이용하여 인스턴스 변수를 em이라하였을때 데이터베이스의 데이터를 변경하는 코드를 작성하고 em.persist(entity)를 호출하여 엔티티를 넣었다. 

            //등록
            Member member = new Member();
            member.setId(2L);
            member.setName("hello!JPAAAA");
            em.persist(member);

그렇다면 em.persist()를 통해 db에 저장이 되는것일까? 정확히 말하면 그렇지 않다. persist()는 db에 저장하는 것이 아니라 엔티티를 영속성 컨텍스트에 저장한다는 의미이다. db에 반영되는 시점이 궁금하다면 바로 아래를 참조하자

 

 

💡DB에 반영되는 시점

그렇다면 db에 언제 반영되는것일까? 실제로 데이터베이스에 저장되는 시점은 트랜잭션이 커밋될 때이다. JPA는 트랜잭션 단위로 데이터베이스와의 작업을 처리하므로, persist()를 호출하더라도 그 변화는 트랜잭션이 커밋되는 시점에 데이터베이스에 반영된다. -> 만일 트랜잭션이 롤백된다면 영속성 컨텍스트에 있는 변경 사항도 롤백되어 테이터베이스에는 아무런 영향을 미치지 않는다.

 

 

엔티티를 생성하면 그 안에 1:1로 영속성 컨텍스트라는 공간이 생성이 된다. 

em.persist(entity)를 호출하게 되면 영속성 컨텍스트(persistence context)안에 객체를 저장하게 되는 것이다. 객체, 엔티티는 아래와 같은 생명주기를 가진다.

 

 

 

엔티티의 생명주기

• 비영속 (new/transient)

엔티티 객체가 생성되고, 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태이다.

→ 처음에 멤버 객체를 생성한 직후의 상태로, new상태라 하고 비영속이라한다. 영속성 컨텍스트와 전혀 관계없는 상태이다.

 

• 영속 (managed) 상태(영속성 컨텍스트에 관리되는 상태)

→ entityManager.persist()를 사용하여 엔티티를 저장하면  영속 상태가 된다. 영어로는 managed. 영속성 컨텍스트에 의해 관리되는 상태이다. 이 상태에서 엔티티의 상태 변경이 자동으로 감지되고 데이터베이스와 동기화된다.

 

• 준영속 (detached)

영속 상태의 엔티티가 영속성 컨텍스트에서 분리되어 더 이상 관리되지 않는 상태이다. 엔티티매니저의 detach()메서드를사용하거나 트랜잭션이 종료될 때 해당 엔티티는 준영속 상태로 전환된다. 

 

• 삭제 (removed)

엔티티가 삭제되는 상태이다. 엔티티매니저의 remove()메서드를 사용하여 엔티티를 삭제하면 해당 엔티티는 삭제 상태가 된다. 

->삭제 상태의 엔티티는 영속성 컨텍스트에서 분리되고, 향후 엔티티의 상태 변경이나 삭제를 데이터베이스에 반영한다.

 


출처/참고 

자바 ORM 표준 JPA 프로그래밍 - 기본편 / 김영한 / 인프런 강의


/* 내가 추가한 코드 */ /* 내가 추가한 코드 끝끝 */