본 글에 앞서 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 프로그래밍 - 기본편 / 김영한 / 인프런 강의
'웹 개발 > jpa' 카테고리의 다른 글
[jpa] 준영속이란? + 준영속 상태가 되는 법 (0) | 2024.01.28 |
---|---|
[jpa] 영속성 컨텍스트란 with 1차 캐시 #2 (0) | 2024.01.11 |
[jpa] JPA구동 방식 + EntityManager, EntityManagerFactory 란? (0) | 2023.12.19 |
[jpa] JPA란? ORM, Hibernate란? (0) | 2023.12.12 |