- 비휘발성의 반대말이다. 서버나 컴퓨터가 종료되어도 데이터가 남는 성질을 의미한다.
- 보통 저장장치(ssd, hdd, 메모리 등등)에서는 휘발성, 비휘발성이라고 개념명을 붙이고 DB에서는 이러한 개념을 영속성이라는 이름으로 부른다.
- 데이터가 담기는 어떤 가상의 공간으로 이해하자
- 만약 commit하기전 데이터는 어디로 담겨있을까?
- 바로 DB로 이동하는 것이 아닌 영속성 컨텍스트 내부에 있는 저장소 "1차캐시"로 이동한다.
- 트랜잭션이 시작하고 끝날 때까지만 해당 1차캐시가 유효하다.
- Set에서 처럼 같은 엔티티가 있다면 중복 저장은 되지 않는다.(객체 동일설 보장 ==)
- 만약 find와 같은 명령을 호출하면 해당 데이터를 우선 1차 캐시에서 찾아 반환한다.만약 없다면 DBdptj 데이터를 찾는다.
- 동시성(Concurrency)을 보다 강화하기 위해서 쓰는 개념
- 애플리케이션에서 공유하는 캐시를 JPA에서는 공유캐기(shared cache)라고 하며 2차캐시(second level cach, L2 cache)라고 부른다.
- 2차 캐시는 어플리케이션이 종료할 때까지 유지된다.
- 엔티티 매니저가 데이터를 조회할 때 2차캐시를 먼저 확인하고 찾는 데이터가 없다면 그때 DB를 확인한다.
- 1차 캐시에서 데이터가 없다면 2차캐시를 2차캐시에도 없다면 DB를 확인하는 것
- 2차 캐시를 갖고있는 데이터를 반환할 때 해당 데이터의 원본이 아닌 복사본을 반환한다.
- 왜냐하면 나중에 다른 곳에서 같은 데이터를 요청할 때 해당 객체를 동시에 수정할 수도 있기 때문.
- 이를 방지하고자 원본을 주고 대신 Lock을 걸면 동시성에 문제가 생긴다. 이러한 매커니즘으로 동시성이 극대화되는 것
- 1차와 달리 2차는 애플리케이션 전체에 해당하는 범위를 커버하기에 1차 캐시 기능을 넘어 보다 넒은 커버링으로 데이터베이스에 조회를 하는 작업이 훨씬 줄어들게 된다.
<img src="..\images\1차캐시vs2차캐시.png" width="600px" height="400px"/>
- 엔티티 매니저는 여러 스레드가 동시에 접근하면 동시성 문제가 생기기에 스레드끼리는 한의 엔티티 매니저를 공유할 수 없다(즉 하나의 영속성컨텍스트레 여러 쓰레드가 동시에 자료를 요청할 수 없다는 것)
- 그러면 하나의 엔티티 매니저가 가진 영속성 컨텍스트의 데이터를 모두가 써야만 한다면 어떻게 할까?
- 그럼 해당 엔티티 매니저를 여러개 만들면된다. 1 쓰레드 1엔티티매니저
- 이렇게 말 그대로 엔티티매니저 객체를 만들어내는 기능을 하는 것이 바로 EntityManagerFactory이다.
```java
EntityManagerFactory em = emFacotry.createEntityManager();
```
- 이 엔티티매니저팩토리라는 공장에서 엔티티 매니저를 만들어낸다.
- 따라서 여러 쓰레드가 접근할 때는 엔티티 매니저가 아닌 엔티티매니저팩토리에 접근하면 된다.
- 주의점은 엔티티매니터팩토리는 DB당 하나만 사용가능하다는 것.
댓글남기기