본문 바로가기

개발/Spring

[JPA] 영속성 컨텍스트

앞에서 JPA란 무엇인지, JPA안에서 영속성 컨텍스트가 어떤 역할을 하는지 등을 살펴보았다.

 

그럼 영속성 컨텍스트와 관련해서 엔티티의 생명주기를 살펴보겠다.

 

엔티티의 생명주기

영속성 컨텍스트는 기본적으로 위와 같은 생명주기를 가지게 된다.

각각을 살펴보면,

 

비영속 상태

비영속 상태는 말 그대로 영속성 컨텍스트와 전혀 관계가 없는 엔티티의 상태를 말한다.

가령 Entity를 생성을 한 상태에서 persist와 같이 영속화 시켜주지 않았다면, 비영속 상태이다.

 

영속 상태

영속 상태는 생성된 Entity를 persist와 같이 영속화 시켜준 상태를 말하고, 해당 상태에서는 영속성 컨텍스트가 해당 Entity를 관리한다.

 

준영속 상태

영속성 컨텍스트에 저장되었다가 분리된 상태를 말한다. em.ditached와 같이 영속성 컨텍스트 안에 있는 Entity를 분리하는 것이다.

 

삭제 상태

영속성 컨텍스트에서 삭제된 상태이고, DB에도 delete쿼리문을 날리게 된다.


 

영속성 컨텍스트의 1차 캐시

영속성 컨텍스트에는 1차 캐시라는 것이 존재한다.
이것이 어떤 역할을 해주냐면, DB에 조회를 하거나, DB에 삽입을 할 때, 1차캐시에 먼저 저장하는 것이다.
조회를 할 떄도 디비에서 바로 조회하는 것이 아니라, 1차 캐시로 가져온 다음에 그 값을 반환한다.

 

 

영속 엔티티의 동일성 보장

말 그대로 자바에서 컬렉션과 같이, 같은 엔티티를 조회했을 떄 == 과 같은 비교연산에서 동일성을 보장해준다.

 

엔티티 등록 트랜잭션을 지원하는 쓰기 지연

 

JPA의 특징 중에 중요한 부분이라고 할 수 있다.

이게 무슨 말이냐면, JPA는 버퍼랑 비슷하게 em.persist()단계에서 바로 쿼리문을 보내지 않고 쓰기 지연 SQL저장소에 쿼리문을 쌓다가 commit을 하면 flush() 과정을 거치는 데, 이때 한번에 쿼리문을 보내게 된다.

+ hibernate에서는 bat_size라는 설정이 있는데, 이때 사이즈를 지정해주면 이 크기만큼 모았다가 한번에 디비에 쿼리문을 날리는 기능도 있다.

 

 

엔티티 수정 변경 감지

 

아마 엔티티를 조회하고, 그 값을 수정하고 싶을 때 em.update를 해줘야 하지 않을까 하는 생각이 들 수 있다.
하지만 JPA를 사용할 때는 그러지 않아도 된다. 
이유는 JPA를 통해 조회를 하면, 1차 캐시에 저장이 되고 이때 1차 캐시에 스냅샷을 저장한다. 
이후 커밋을 할 때 flush()과정을 거치면서 1차 캐시의 스냅샷과 현재 1차 캐시의 값을 비교하여 다르다면,
변경사항이 있다고 판단하여 update쿼리문을 생성한다.

 

엔티티 삭제

 

삭제는 em.remove()를 통해 삭제를 하게 되는데, 이 부분도 persist를 하지 않아도 트랜잭션 커밋 시점에 delete문이 나간다.

 

'개발 > Spring' 카테고리의 다른 글

[JPA] 연관관계 매핑  (1) 2021.07.27
JPA란  (0) 2021.07.22
[Spring] MockMvc  (0) 2021.07.20
[프로그래머스] Level2_오픈채팅방  (0) 2021.07.08
[Spring] Spring MVC 전체 구조  (0) 2021.06.14