본문 바로가기

Java/Spring

영속성 컨텍스트

영속성 컨텍스트란 엔티티를 영구 저장 하는 환경 이라는 뜻이다.

어플리케이션이 데이터베이스에서 꺼내온 데이터 객체를 보관하는 역할을 한다.

영속성 컨텍스트는 엔티티 매니저를 통해 엔티티를 조회하거나 저장할때 엔티티를 보관하고 관리한다.

 

영속성 컨텍스트 = 엔티티 매니저마다 가지고 있는 어떠한 공간

영속화 한다 = 엔티티 매니저가 자기의 영속성 컨텍스트에 넣어준다

 

JPA 엔티티의 상태

비영속(New) : 영속성 컨택스트와 관계가 없는 새로운 상태이다. 해당 객체의 데이터는 실제 DB의 데이터와는 관련없고, 그냥 Java 객체인 상태다.

 

영속(Managed) : 엔티티 매니저를 통해 엔티티가 영속성 컨텍스트에 저장되어 관리되고 있는 상태이다. 이와 같은 경우 데이터의 생성, 변경등을 JPA가 추적하면서 필요하면 DB에 반영한다.

 

준영속(Detached) : 영속성 컨택스트에서 관리되다가 분리된 상태이다.

 

삭제(Removed) : 영속성 컨택스트에서 삭제된 상태이다.

 

영속성 컨텍스트의 구조

1차캐시

영속성 컨텍스트는 1차 캐시라는 것을 가지고있다.

영속성 컨텍스트가 1차 캐시를 가지고 동작하는 이유는 다음과 같다.

1.여러가지 이유로 DB를 이용하는 작업은 상대적으로 부하와 비용이 심한 작업이다.그래서 부하가 심한 작업을 자주하는 것을 줄여야 할 필요가 있다.

2.자바 어플리케이션 상에서 데이터를 조회, 사용할 일이 잦은데, 그럴때마다 DB로 “SELECT * FROM….”과 같은 SQL쿼리를 내는 일은 막아야 한다는 것이다.

3.그러기 위해서 영속성 컨텍스트 내부에 1차캐시를 둔다.

 

영속성 컨텍스트의 1차 캐시 활용은 다음과 같다.

1. find(”memberB”)와 같은 로직이 있을 때 먼저 1차 캐시를 조회한다.

2. 있으면 해당 데이터를 반환한다.

3. 없으면 그 때 실제 DB로 “SELECT * FROM….” 의 쿼리를 내보낸다.

4. 그리고 반환하기 전에 1차캐시에 저장하고 반환해준다.

5.위와 같은 과정을 진행하면 다시 find(”memberB”)를 할때 DB에서 “SELECT * FROM….”의 과정을 진행할 필요가 없다.

 

 

쓰기 지연 SQL 저장소

1차 캐시와 마찬가지로 굳이 여러번 DB를 방문하지 않도록 하기 위해 존재한다.

 

작동방식

1. memberA, memberB를 영속화 하고

2. entityManager.commit() 메서드를 호출하면

3. 내부적으로 쓰기 지연 SQL 저장소에서 Flush가 일어나고

4. “INSERT A”, “INSERT B”와 같은 쓰기 전용 쿼리들이 DB로 흘러들어간다.

 

Flush 로 쓰기 지연 SQL저장소에 쿼리문을 쌓고, 한번에 DB로 보내는 느낌이다.

 

 

JPA는 1차 캐시와 쓰기 지연 SQL저장소를 이용하여 변경과 수정을 감지해준다.

1. 1차 캐시에 해당 엔티티를 조회한 시점의 데이터의 정보를 같이 저장해둔다.

2. 그리고 엔티티객체와 조회 시점의 데이터가 다르다면 변경이 발생했다고 인지하고

3. 해당 변경 부문을 반영 할 수 있는 UPDATE 쿼리를 쓰기 지연 SQL저장소에 작성해둔다.

'Java > Spring' 카테고리의 다른 글

Transaction  (0) 2022.12.28
JWT  (0) 2022.12.15
인증과 인가  (0) 2022.12.14
의존성 주입 - 스프링 IoC컨테이너  (0) 2022.12.13
의존성 주입 - 강한결합  (0) 2022.12.13