[Spring] mybatis 쿼리 캐싱 (<cache> 태그)

류넹·2024년 2월 29일
1

Spring

목록 보기
18/50

# 목적

  • mybatis 쿼리 캐싱에 대해 알아보기



❓ mybatis 쿼리 캐싱

  • 거의 변경되지 않거나 고정된 값ex) 상품 카테고리 데이터베이스에서 자주 조회하는 경우, mybatis의 쿼리 캐싱 기능을 사용하면 데이터베이스 액세스 부하를 줄일 수 있다.
  • 다수의 사용자가 동시에 데이터를 조회할 때 효과적


쿼리 캐싱 적용하기

  • SQL Mapper 파일<cache /> 태그를 추가한다.
    • 해당 Mapper 파일에 정의된 모든 <select> 구문에 대해서 쿼리 캐싱이 적용된다.
    • 해당 Mapper 파일에 정의된 <insert>, <update>, <delete> 구문이 실행되면
      그 Mapper 파일의 캐시가 전부 비워진다.



📌 <cache /> 태그의 주요 속성

```xml
<cache
       eviction="FIFO"
       flushInterval="60000"
       size="512"
       readOnly="true"/>
```

1. eviction

  • 캐시전략을 설정하는 속성
  • 사용가능한 값
    • LRU(Least Recently Used) : 가장 오랜시간 사용하지 않는 객체를 제거
    • FIFO(First In First Out) : 캐시에 들어온 순서대로 객체를 제거
    • SOFT(Soft Reference) : 가비지 컬렉터의 상태와 강하지 않은 참조(Soft References)의 규칙에 기초하여 객체를 제거
    • WEAK(Weak Reference) : 가비지 컬렉터의 상태와 약한 참조(Weak References)의 규칙에 기초하여 점진적으로 객체 제거

2. flushInterval

  • 캐시가 자동으로 비워지는 시간 간격을 밀리초 단위로 설정한다. (기본값 : 없음)
  • 숫자값은 반드시 양의 정수로 설정한다.
  • 시간은 너무 길게 설정하지 않는 것이 좋다.

3. size

  • 캐시의 크기를 지정한다. (기본값 : 1024)

4. readOnly

  • 읽기 전용 캐시여부를 설정한다. (기본값 : false)
  • true로 설정하면 모든 호출자에게 캐시된 객체의 같은 인스턴스를 리턴한다.
    그 객체는 변경할 수 없다.




❗ 주의사항

  1. 테이블마다 Mapper를 따로 구현한다.
  2. 데이터를 추가/변경/삭제하는 SQL 구문은 그 테이블의 Mapper 파일에만 구현한다.

참고)

  • 해당 매퍼파일에서 특정 구문에만 쿼리 캐싱을 적용하고 싶지 않다
    useCache 속성의 값을 "false"로 설정하면 된다.
    (자주 바뀌는 구문이라면 쿼리 캐싱을 적용하지 않는 게 나을 수 있다.)
  • ex)
	 <select id="getAllCompanies"
             resultType="com.sample.vo.Company"
             useCache="false">
	 	select
	 		company_no			as no,
	 		company_name		as name,
	 		company_tel			as tel,
	 		company_zipcode		as zipcode,
	 		company_address1	as address1,
	 		company_address2	as address2
	 	from
	 		shop_companies
	 	order by
	 		company_name asc
	 </select>
profile
학습용 커스터마이징 간단 개발자 사전

0개의 댓글