JAVA/JPA

[JPA] 영속성 컨텍스트 (Persistence Context) - (1)

4Legs 2021. 3. 30. 21:26

영속성 컨텍스트 (Persistence Context)

영속성 컨텍스트는 JPA에서 매우 중요한 개념으로, 엔티티를 영구 저장하는 환경이라는 의미를 가진다.

영속성 컨텍스트는 논리적인 개념이다. 즉 실제로 존재하는 개념이 아니며, 우리는 코드 내에서 영속성 컨텍스트에 EntityManager을 통해 접근한다.

JPA는 매 요청마다 EntityManagerFactory에서 EntityManager를 생성한다. 이렇게 생성된 EntityManager는 내부적으로 DB 커넥션 풀을 사용해 데이터베이스와 연동된다.

스프링에서 EntityManager를 주입받아 사용할 때, 같은 트랜잭션 범위의 EntityManager들은 동일 영속성 컨텍스트에 접근한다.

 

엔티티의 생명주기 (Entity Lifecycle)

비영속 (New/Transient)

영속성 컨텍스트와 전혀 관계가 없는 상태이다.

//객체를 생성만 한 상태 (비영속)
Member member = new Member();
member.setId("member1");
member.setUsername("회원1");

이 코드에서 새로 생성된 member는 영속성 컨텍스트와 아무런 관련이 없다. EntityManager를 통해 영속성 컨텍스트에 등록하지 않았기 때문이다.

영속 (Managed)

엔티티가 영속성 컨텍스트에 저장된 상태이다. 영속 상태의 엔티티는 영속성 컨텍스트에 의해 관리된다.

EntityManager em = emf.createEntityManager();	//emf : EntityManagerFactory
em.getTransaction().begin();

//객체를 저장한 상태 (영속)
em.persist(member);

persist() 메소드를 통해 엔티티를 영속성 컨텍스트에 저장한다.

이 때, member 객체는 아직 데이터베이스에 저장된 상태가 아니다.

트랜잭션의 커밋 시점에 영속성 컨텍스트 안의 데이터들이 데이터베이스에 쿼리 형태로 전송된다.

 

준영속 (Detached)

영속성 컨텍스트에 저장되었다가 분리된 상태이다. 영속성 컨텍스트에 의해 더는 관리되지 않는다.

즉, 영속성 컨텍스트에서 변경 감지가 발생하지 않는다. (변경 감지에 대해서는 후술한다.)

//회원 엔티티를 영속성 컨텍스트에서 분리 (준영속)
em.detach(member)

 

삭제 (Removed)

객체를 영속성 컨텍스트에서 삭제한다. 데이터베이스 내에서도 해당 객체는 삭제된다.

//객체를 삭제
em.remove(member);

 

 

Reference

자바 ORM 표준 JPA 프로그래밍