<< 학습 목표 >>

1. MyBatis에서 사용하는 두 가지 캐시에 대해 설명할 수 있다.


이번에 배울 cache, cache-ref 태그는 간단하게 이런게 있다 정도만 알아볼 것

 

MyBatis는 효율적으로 쿼리를 보내고 결과를 받기 위해 캐시(Cache)를 사용함

만약 캐시에 대해 처음 듣는다면 우선 인터넷이나 ChatGPT의 도움을 받아 캐시에 대해서 이해하고 오자

 

MyBatis가 사용하는 캐시

1. Local Session Cache

2. Second Level Cache

 

<< Local Session Cache >>

- 기본적으로 활성화 되어있는 캐시

- 당연히 조회(SELECT)에만 적용됨

  완전히 동일한 조회 쿼리를 여러번 보내면 매번 DB에서 조회해오지 않고 처음 한번만 DB에서 조회한 후 결과를 캐시에 저장함

  두번째부터는 캐시에서 결과를 꺼내 반환함

  캐시가 가득 차면 LRU ( Least Recently Used / 맨 처음 저장된 캐시 ) 를 제거하고 새 조회 결과를 저장함

 - 이 캐시는 비활성화 하는게 불가능함, 대신 캐시의 활동 범위를 좁힐 수 있음

   활동 범위 : SESSION, STATEMENT

     > 활동 범위는 SESSION이 기본값이며 UPDATE, COMMIT, ROLLBACK, CLOSE 시 마다 캐시를 비움

     > flushCache 옵션을 사용해 활동 범위를 STATEMENT 로 바꿀 수 있음

     > 활동 범위를 STATEMENT 로 바꾸면 SELECT, INSERT, UPDATE, DELETE 시 마다 캐시를 비우도록 할 수 있음

 

<< Second Level Cache >>

 - 기본적으로 비활성화 되어있는 캐시

   <mapper> 태그 내 <cache /> 태그를 사용해 활성화 시킬 수 있음

   <mapper> 태그 내 <cache /> 태그로 활성화 시키므로 매퍼별 캐시가 따로 관리됨

 - INSERT, UPDATE, DELETE 시 마다 이 캐시를 비움

 - 매퍼별로 캐시를 관리하므로 <mapper> 태그 안에서는 테이블 하나만 관리하는게 좋음

   이를 제대로 이해하려면 DDD (도메인 주도 개발)에 대해서 이해해야함


<< Local Session Cache의 적용 범위를 STATEMENT 로 바꾸는 예시 >>

insert, update, delete, select 등의 태그에 사용할 수 있는 flushCache 속성을 false로 지정하면 됨

flushCache 속성 : 이 속성의 값을 true로 설정하면 해당 SQL이 실행될 때 마다 Local Session Cache, Second Level Cache가 비워짐

  이 속성의 기본값은 false임


<< Second Level Cache를 활성화 시키는 예시 >>

단순히 <cache> 태그를 추가하기만 해도 Second Level Cache 를 활성화시킬 수 있음

이 태그는 여러 속성이 있는데 그 중 대표적인 몇 가지 속성만 알아보자

- eviction 속성 : 캐시 비움 정책

  기본 정책은 LRU ( Least Recently Used ) 임, LRU는 가장 먼저 추가된 캐시를 비우는 정책임

  그외에도 FIFO, SOFT, WEAK 가 있음

 - flushInterval 속성 : 캐시 비움 주기

  밀리초 단위로 설정하며 지정한 초가 지날 때 마다 주기적으로 캐시를 비움

  특정 시간을 지정해서 비우도록 할 수는 없음

  (예. "매일 새벽 4시에 캐시를 비워라" 안됨)

 - size 속성 : 캐시의 사이즈


마지막으로 cache-ref 태그는 다른 매퍼의 캐시를 같이 사용하고 싶을 때 사용하는 태그

아예 사용하지 않는다고 봐도 되므로 간단하게 예시 코드만 첨부함

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.study.chapter04.MemberDao">
	<cache-ref namespace="mapper 태그를 갖고 있는 파일의 경로" />
    
	// ...
</mapper>

이렇게 MyBatis 캐시에 대해 알아봤음

그러나 실무에서는 MyBatis 가 내장하고 있는 캐시를 사용하지 않고 별도로 캐시 프레임워크를 붙여서 사용함

 

실무에서 많이 사용하는 캐시 프레임워크

 - EhCache

 - OsCache

 - Hazelcast

 

참고 : https://idea-sketch.tistory.com/31, https://12bme.tistory.com/352, https://jp1020.tistory.com/entry/mybatis-cache-%EC%84%A4%EC%A0%95, https://yunamom.tistory.com/40

728x90
LIST