JPA

[JPA] 영속성 컨텍스트란?

엄지성 2024. 3. 10. 00:33

JPA의 기본 중에 기본이고 이해하기 위해서는 영속성 컨텍스트(persistence context)라는 단어이다.

 영속성 컨텍스트를 번역하자면 '엔티티를 영구 저장하는 환경'이라는 뜻이다.

엔티티를 저장하거나 조회할 때 엔티티 매니저를 사용하여 영속성 컨텍스트에 엔티티를 저장또는 보관한다.

 

엔티티의 생명주기

엔티티에는 4가지 상태가 있다.

1. 비영속

2. 영속

3. 준영속

4. 삭제

 

이 4가지를 하나하나 자세히 알아보자.

// 코드에서의 em은 엔티티 매니저의 약자

1. 비영속(new/transient)

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

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

만약 엔티티 객체를 생성했다고 가정해 보면 그 엔티티는 순수하게 객체 상태이지 디비에 저장이 되지 않은 상태이다. 저장되지 않은 상태이면 당연히 영속성 컨텍스트와는 전혀 관련이 1도 없다는 말이다. 이것을 비영속상태라고 부른다.

Member member = new Member(); // 비영속
member.setId("member1");
member.setUsername("회원1");

 

2. 영속(managed)

영속성 컨텍스트에 저장된 상태.

이것은 영속성 컨텍스트에 의해 관리되고 있는 상태이다.

이것도 예시를 들자면 엔티티 매니저에 의해 엔티티를 영속성 컨텍스트에 저장하게 된다면 그 엔티티는 영속성 컨텍스트에 영속상태가 되고 

그 엔티티는 영속성 컨텍스트에 관리되는 상태라는 것이다.

또한, em.find()나 JPQL을 사용해 조회한 엔티티도 물론 영속성 컨텍스트에 관리하는 영속상태의 엔티티이다.

em.persist(member); // 영속

 

3. 준영속(detached)

영속성 컨텍스트에 저장되었다가 분리된 상태.

준영속 상태는 영속 상태에 있다가 엔티티가 영속성 컨텍스트의 관리에서 벗어났다는 뜻이다.

이 준영속 상태로 만들고 싶다면 영속되어 있는 엔티티가 있다는 가정하에 em.detach()또는 영속성 컨텍스트를 닫아버리는 em.close()

를 호출하여 준영속 상태의 엔티티로 만들 수 있다. 또한, 영속성 컨텍스트를 초기화하는 em.clear()를 호출하여도 준영속 상태가 된다.

em.detach(member); // 준영속

 

4. 삭제(removed)

삭제된 상태.

삭제는 엔티티를 영속성 컨텍스트와 데이터베이스에서 삭제한다는 뜻이다.

em.remove(member);

 

영속성 컨텍스트의 특징

영속성 컨텍스트의 특징은 여러 가지가 있다.

  • 영속성 컨텍스트와 식별자 값
  • 영속성 컨텍스트와 데이터베이스 저장
  • 영속성 컨텍스트가 엔티티를 관리하면 생기는 장점

 

1. 영속성 컨텍스트와 식별자 값

영속성 컨텍스트는 엔티티에 @Id로 매핑한 식별자 값으로 구분한다.

따라서 영속 상태에는 식별자 값이 무조건 존재해야 된다.

없으면 예외가 발생한다.

 

2. 영속성 컨텍스트와 데이터베이스 저장

영속성 컨텍스트가 엔티티를 저장하는 시간 언제일까?

JPA는 보통 트랜잭션이 커밋되는 순간에 영속성 컨텍스트에 새로 저장된 엔티티를 데이터베이스에 반영한다.

이를 플러시라고 부른다.

 

3. 영속성 컨텍스트가 엔티티를 관리하면 생기는 장점

  • 1차 캐시
  • 동일성 보장
  • 트랜잭션을 지원하는 쓰기 지연
  • 변경 감지
  • 지연 로딩

이 존재한다. 여기서 다루기에는 너무나 많은 개념들이 존재하기 때문에 다루기 어려울 것 같다.

 

'JPA' 카테고리의 다른 글

[JPA] 양방향 매핑과 연관관계  (0) 2024.08.09
[JPA] 고아객체? 그게 먼데  (0) 2024.07.31
[JPA] 1차 캐시란?  (1) 2024.03.05