<aside>
1️⃣ 영속성이란?
</aside>
- JPA의 **
영속성(Persistence)
**은 데이터를 생성한 프로그램의 실행이 종료되더라도 사라지지 않는 데이터의 특성을 의미한 여기서 말하는 데이터는 주로 데이터베이스에 저장되는 데이터를 말한다.
JPA에서는 이 영속성을 다루기 위해 여러 개념과 기능을 제공하는데, 그 중에서 가장 중요한 것이 '엔티티의 생명주기'와 '영속성 컨텍스트'이다.
<aside>
2️⃣ 엔티티의 생명주기
</aside>
- JPA에서 엔티티는 특정한 생명주기를 가지며, 이 생명주기는 엔티티의 상태에 따라 변화한다.
엔티티의 상태는 크게 '비영속 (new/transient)', '영속 (managed)', '준영속 (detached)', '삭제 (removed)'의 4가지 상태로 나눌 수 있다.
- 비영속 (new/transient): 아직 영속성 컨텍스트에 저장되지 않은 새로운 상태의 엔티티를 말한다.
- 영속 (managed): 영속성 컨텍스트에 저장된 상태의 엔티티를 말한다. 이 상태의 엔티티는 데이터베이스에 반영되며, 영속성 컨텍스트가 관리하는 범위 안에 있다.
- 준영속 (detached): 영속성 컨텍스트에 저장되었다가 분리된 상태의 엔티티를 말한다. 이 상태의 엔티티는 더 이상 영속성 컨텍스트에 의해 관리되지 않는다.
- 삭제 (removed): 영속성 컨텍스트에 의해 관리되고 있지만, 삭제하기로 한 상태의 엔티티를 말한다. 이 상태의 엔티티는 트랜잭션 커밋 시점에 데이터베이스에서 삭제된다.
<aside>
3️⃣ 영속성 컨텍스트
</aside>
- 영속성 컨텍스트(Persistence Context)는 JPA에서 매우 중요한 역할을 하는 개념으로, '엔티티를 영구 저장하는 환경'이라는 뜻이다. 이는 엔티티가 영속화되면서 생명주기를 관리하며, 엔티티의 CRUD 작업을 처리한다.
- 영속성 컨텍스트는 EntityManager 인스턴스를 생성할 때 하나씩 만들어지며, 이 EntityManager를 통해 엔티티를 데이터베이스에 저장하거나 검색할 수 있다.
EntityManagerFactory emf = Persistence.createEntityManagerFactory("persistence-unit");
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
// 영속 상태
Member member = new Member();
member.setId("ID1");
member.setName("홍길동");
em.persist(member);
em.getTransaction().commit();
- 위의 코드에서 **
em.persist(member);
**라는 메서드가 호출되면, member
엔티티는 영속성 컨텍스트에 의해 관리되는 영속 상태가 된다.
이후 커밋(commit)되면, 해당 변경 사항은 데이터베이스에 반영된다.
- 영속성 컨텍스트는 이 외에도 다양한 이점을 제공하는데, 대표적으로 1차 캐시, 동일성 보장, 트랜잭션을 지원하는 쓰기 지연, 변경 감지(Dirty Checking), 지연 로딩(Lazy Loading) 등의 기능을 제공한다.
이러한 기능들 덕분에 개발자는 데이터베이스에 직접 접근하여 작업을 처리하는 것보다 훨씬 효과적이고 안전하게 데이터를 관리할 수 있다.
<aside>
4️⃣ EntityManager와 영속성 컨텍스트 - 자세한 설명
</aside>
JPA의 영속성은 "EntityManager"를 중심으로 구성된다.
EntityManager는 영속성 컨텍스트에 엔티티를 저장하고 관리하는 역할을 한다.
EntityManager와 영속성 컨텍스트
- EntityManager 인스턴스는 클라이언트 요청이 올 때마다 생성되며, 그 요청이 끝나면 종료된다.
그래서 일반적으로 EntityManager 인스턴스와 같은 수명 주기를 갖게 된다.
// EntityManager 생성
EntityManager em = emf.createEntityManager();
// 엔티티 영속화
Member member = new Member("id1", "John Doe");
em.persist(member);
// EntityManager 종료 (영속성 컨텍스트도 종료됨)
em.close();
- EntityManager를 생성하면 자동으로 영속성 컨텍스트도 생성된다. 그리고 이 영속성 컨텍스트는 EntityManager가 종료될 때까지 유지된다. EntityManager의
persist()
메서드를 통해 엔티티를 영속성 컨텍스트에 저장하면, 그 엔티티는 '영속 상태'가 된다.
영속성 컨텍스트의 이점
- 1차 캐시: 영속성 컨텍스트는 내부에 1차 캐시를 가지고 있다. 이는 엔티티의 ID를 키로, 엔티티 인스턴스를 값으로 가지는 맵으로 구현되어 있다. 이를 통해 같은 트랜잭션에서 동일한 엔티티를 조회할 경우, 데이터베이스에 접근하지 않고 1차 캐시에서 조회하여 성능 향상을 이뤄낸다.
- 동일성 보장: 같은 트랜잭션 내에서는 영속성 컨텍스트가 1차 캐시를 통해 동일성(==)을 보장한다.
즉, 같은 엔티티 인스턴스에 대한 비교는 항상 true를 반환한다.