💡 Spring Boot Cache에서는 아래의 주요한 어노테이션을 사용합니다. 💡 해당 어노테이션들은 value(캐시 값), key(캐시 키)을 기반으로 수행이 됩니다.
어노테이션
주요 기능
캐싱 시점
설명
@Cacheable
캐시 조회, 저장 기능
- 캐시 존재 시 ‘메서드 호출 전 실행’ - 캐시 미 존재 시 ‘메서드 호출 후 실행’
- 캐시 정보를 메모리 상에 '저장'하거나 '조회' 해오는 기능을 수행할때 사용됩니다.
@CachePut
캐시 저장 기능
- 캐시 존재 시 ‘메서드 호출 후 실행’ - 캐시 미 존재 시 ‘메서드 호출 후 실행’
- 캐시 정보를 메모리상에 '저장'하며 존재 시 갱신하는 기능을 수행할때 사용합니다.
@CacheEvict
캐시 삭제 기능
- beforeInvocation 속성값이 true일때 ‘메서드 호출 전 실행’ - beforeInvocation 속성값이 false일때 ‘메서드 호출 후 실행’
- 캐시 정보를 메모리상에 '삭제'하는 기능을 수행할때 사용합니다.
[ 더 알아보기 ]
💡 메서드의 호출 전/후 실행은 무슨 차이일까?
- 메서드의 호출 전에 실행 시 DB로부터 데이터를 처리하는 부분에 대해서 줄어들게 됩니다. - 반대로 메서드의 호출 후에 실행하는 경우 DB로부터 데이터를 처리하여 가져오는 부분에 대해서 처리하는 부분이 늘어납니다.
💡 @CacheEvict의 beforeInvocation 속성이란?
- 캐시의 데이터를 삭제하는데 메서드 호출 전/후에 발생할지에 대해 설정하는 속성을 의미합니다. - 속성의 기본값은 false이며 메서드 실행 전에 캐시에서 데이터를 삭제하여 예외가 발생한다면 캐시에서 데이터가 삭제되지 않습니다. - 이에 따라 예외가 발생할 가능성이 있는 메서드에 대해서 beforeInvocation= “true”를 사용하지 않는 것이 좋습니다.
💡 @Cacheable과 @CachePut의 다른 점은?
- @Cacheable의 경우는 ‘캐시가 존재하지 않을 경우’ 캐시를 저장하지만 @CachePut의 경우는 ‘캐시의 존재 여부를 떠나서’ 항상 저장 혹은 갱신을 수행합니다.
- 상세한 설명으로는 캐시의 속성값인 '값(value)과 키(key)'를 기반으로 수행이 됩니다. - 최초 호출이 된 경우에는 메서드가 호출되어 '캐시 정보를 저장' 하며, 동일하게 재 호출이 된 경우에는 메서드의 호출 없이 '저장된 캐시의 정보를 조회하여 반환'합니다.
- @CachePut 어노테이션과 비슷한 기능을 수행하지만 '캐시 정보를 조회'하는데 주로 사용합니다. - 해당 어노테이션의 선언 위치는 주로 @Service를 선언한 인터페이스의 구현체 부분에서 함께 선언하여 사용합니다.
💡 해당 방법에서는 ‘파라미터가 존재하는 상태’에서 @Cacheable를 사용하는 경우에 대해서 확인해 봅니다.
2.1. SQL Mapper
💡 데이터베이스로부터 코드의 다건을 조회해 오는 SQL문입니다. 💡 해당 부분에서는 코드 키(cd)에 따라서 데이터를 단건으로 조회하는 기능을 수행합니다.
<!--코드를 조회합니다--><selectid="selectCode"resultType="codeDto">
SELECT t1.grp_cd
, t1.cd
, t1.grp_cd_nm
, t1.cd_nm
FROM multiflex_scma.tb_code t1
WHERE t1.use_yn = true
<iftest="cd != null">
AND t1.cd = #{cd}
</if></select>
2.2. CodeServiceImpl.java
💡 해당 파일에서는 interface의 구현체를 구성하는 파일에서 캐시 어노테이션을 적용하였으며 메서드의 기능은 코드의 단검을 조회하는 기능을 수행합니다. 💡 해당 부분에서는 @Cacheable("codeCacheInfo")를 통해서 최초 조회에 캐시를 저장하고 인자에 ‘key’ 속성을 포함하여 캐시로 저장이 됩니다.
- 상세한 설명으로는 캐시의 속성값인 '값(value)과 키(key)'를 기반으로 수행이 됩니다. - 최초 호출이 된 경우에는 메서드가 호출되어 ‘캐시 정보를 저장’하며, 동일하게 재 호출이 된 경우에도 메서드가 호출되어 ‘캐시 정보를 갱신(수정 및 저장)’하여 캐시의 정보를 반환합니다.
- @Cacheable 어노테이션과 비슷한 기능을 수행하지만 '캐시 정보를 저장'하는데 주로 사용이 됩니다. - 해당 어노테이션의 선언 위치는 주로 @Service를 선언한 인터페이스의 구현체 부분에서 함께 선언하여 사용합니다.
<!--코드 값을 기반으로 코드 정보를 조회합니다--><selectid="selectCodeByCd"resultType="codeDto">
SELECT t1.grp_cd
, t1.cd
, t1.grp_cd_nm
, t1.grp_cd
, t1.grp_cd_nm
, t1.cd_nm
, t1.sort_order
FROM multiflex_scma.tb_code t1
WHERE t1.cd = #{cd}
</select>
💡 해당 파일은 interface의 구현체에 해당하는 CodeServiceImpl.java 파일의 selectCodeByCd() 메서드입니다. 💡 해당 메서드에서는 키 값을 기반으로 가져온 데이터를 ‘캐시’에 저장합니다. 최초 호출 이후에 재 호출을 하는 경우에도 해당 데이터를 ‘갱신’합니다.
/**
* 코드 키 값을 기반으로 코드 정보를 조회합니다
*
* @param cd String
* @return CodeDto
*/@Transactional(readOnly = true)@CachePut(value = "codeCacheInfo", key = "#cd")public CodeDto selectCodeByCd(String cd) {
CodeMappercm= sqlSession.getMapper(CodeMapper.class);
return cm.selectCodeByCd(cd);
}
💡 해당 파일은 interface의 구현체에 해당하는 CodeServiceImpl.java 파일의 selectCode() 메서드입니다. 💡 이전에 selectCodeByCd() 메서드를 통해서 캐시 값을 갱신하였다면 selectCode() 메서드를 통해서 저장된 캐시값을 조회하는 예시를 구성하였습니다.