JPA

[JPA] 1차 캐시란?

엄지성 2024. 3. 5. 23:21

영속성 컨텍스트란?

1차 캐시에 대해 이야기하면서 영속성 컨텍스트에 대해 말을 빼먹을 수 없다.

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

만약에 엔티티를 저장 또는 조회를 시도한다면 엔티티 매니저가 영속성 컨텍스트를 사용하여 관리한다.

 

여기서 말하는 영속성 컨텍스트는 우리가 개발을 하면서 본 경우가 없을 것이다. 왜냐면 여기서 말하는 영속성 컨텍스트는 논리적인 개념일 뿐이지 볼 수 있는 것은 아니다. 그리고 엔티티 매니저를 생성하면서 영속성 컨텍스트는 딱 하나 만들어진다.

이제 1차 캐시에 대해 이야기할 건데 영속성 컨텍스트를 이해했다는 가정하에 이야기해 보자.

 

1차 캐시란?

1차 캐시는 영속성 컨텍스트의 특징 중에 하나이다.

영속성 컨텍스트의 특징은 이것 말고도 많지만 오늘은 1차 캐시에 대해 이야기해보자.

 

영속성 컨텍스트의 내부에는 캐시가 존재하는데 이걸 1차 캐시라고 부른다. 

영속 상태의 엔티티는 모두 1차 캐시에 저장된다. 1차 캐시는 Map으로 이뤄져 있다.

키는 @Id로 매핑한 식별자이고 값은 엔티티 인스턴스이다.

 

예시로 설명을 들어보자

만약에 Member엔티티를 저장했다고 가정한다면 위에 사진처럼 영속성 컨텍스트에 있는 1차 캐시에 저장된다.

1차 캐시의 식별자 값은 데이터베이스의 기본 키와 매핑된다.

 

만약에 엔티티를 조회한다고 가정한다면 

1차 캐시에서 식별자 값으로 엔티티를 찾는다. 만약에 1차 캐시에 엔티티가 존재한다면 굳이 데이터베이스까지 들어가지 않아도 메모리에 있는 1차 캐시에서 엔티티를 조회한다. 1차 캐시가 존재하는 장점 중에 하나이다.

 

 

하지만 꼭 1차 캐시에 값이 존재하지 않을 수도 있다. 그런 경우에는 

위 그림과 같이 데이터베이스에 조회를 하여 엔티티를 생성한다. 그리고 생성한 엔티티를 메모리에 있는 1차 캐시에 영속 상태로 만들어 반환한다. 그러면 그림과 같이 1차 캐시에 member1과 member2가 존재한다. 이렇게 되면 조회를 하거나 수정 등을 할 때 엔티티를 찾기 위해 DB까지 가지 않고 1차 캐시에서 바로 얻을 수 있다는 장점이 존재한다. 또한 성능에 대해 이점이 분명히 존재한다.

 

영속 엔티티의 동일성 보장

Member a = em.find(Member.class, "member1");
Member b = em.find(Member.class, "member1");

System.out.println(a == b);

위와 같은 코드가 있다고 가정하면 a == b는 true일까 false일까?

같은 영속성 컨텍스트에서 똑같은 엔티티를 호출한다면 1차 캐시에 있는 동일한 인스턴스를 반환한다.

그리하여 a == b는 true이고 같은 인스턴스이다.

이 코드로 인해 영속성 컨텍스트는 동일성과 성능상 이점을 얻을 수 있다.

'JPA' 카테고리의 다른 글

[JPA] 양방향 매핑과 연관관계  (0) 2024.08.09
[JPA] 고아객체? 그게 먼데  (0) 2024.07.31
[JPA] 영속성 컨텍스트란?  (0) 2024.03.10