티스토리 뷰

영속성 컨텍스트

영속성 컨텍스트는 EntityManager을 생성할 때 같이 생성되는 논리적인 개념입니다. 일종의 엔티티 객체들을 담는 컨테이너라고 이해하면 됩니다. 컨텍스트와 엔티티 사이에 네가지 상태가 있을 수 있습니다.

 

비영속(new)

엔티티를 생성만 했을 뿐, 아직 영속성 컨텍스트에 저장하지 않은 상태입니다.

 

 

영속(managed)

EntityManager을 통해 엔티티가 영속성 컨텍스트에 등록된 상태를 의미합니다. 엔티티를 영속 상태로 만들기 위해 persist 메서드를 사용합니다. find를 통해서도 엔티티를 영속 상태로 만들 수 있습니다. 찾고자 하는 엔티티가 영속성 컨텍스트안에 존재하지 않는다면 데이터베이스에 접근해 데이터를 얻어온 후 해당 정보를 토대로 엔티티 객체를 만든 후 영속성 컨텍스트안에 저장하기 때문입니다.

 

준영속(detached)

준영속은 영속 상태에 있던 엔티티 객체가 어떠한 이유로 영속성 컨텍스트에서 벗어난 상태를 의미합니다. 준영속 상태의 엔티티는 수정을 해도 데이터베이스에 영향을 끼치지 못합니다. detach(), clear(), close()에 의해 벗어나게 됩니다.

 

삭제(removed)

엔티티가 영속성 컨텍스트에서도 제거되고 테이블의 데이터에서도 제거된 상태입니다.

 

 

1차 캐시와 SQL 저장소

영속성 컨텍스트에는 1차 캐시와 SQL 저장소가 있습니다. persist()를 통해 엔티티를 영속성 컨텍스트에 저장할 때, MAP과 같이 KEY와 VALUE로 관리 되는 1차 캐시안에 해당 엔티티가 등록됩니다. 이후 적절한 SQL을 만들어 SQL 저장소에 해당 SQL을 저장하게 됩니다. 트랜잭션내에서 이러한 반복이 계속되며 종료된다면 SQL 저장소에 있는 SQL들이 실제 데이터베이스에서 실행되게 됩니다. 단 한번의 커넥션으로 여러 SQL을 처리하므로 효율적입니다.

 

엔티티 수정과 스냅샷 , 삭제

영속성 컨텍스트는 엔티티를 저장할 때, 컬렉션으로 또 다른 복사본을 저장하게 되는데 이를 스냅샷이라고 합니다. 수정쿼리를 통해 수정된 1차 캐시와 스냅샷을 비교하여 UPDATE에 해당하는 SQL을 만들어 SQL 저장소에 저장하게 됩니다. 수정과 삭제 모두 영속성 컨텍스트에 해당 엔티티가 있어야 하므로 각 작업을 수행하기전 find()를 통해 영속성 컨텍스트에 해당 엔티티를 등록해야합니다.

 

 

++

목록 검색을 위해서는 JPQL을 사용해야합니다.

 

'Books > 스프링 부트 퀵스타트' 카테고리의 다른 글

[Spring Boot] Querydsl, 양방향 다대일 매핑  (0) 2021.07.09
[Spring Boot] 스프링 데이터 JPA  (0) 2021.07.09
[Spring Boot] JPA  (0) 2021.07.06
[Spring Boot] 로깅 / 빌드  (0) 2021.07.01
[Spring Boot] JUnit Test  (0) 2021.06.29
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함