Cacheable
Cacheable이라는 어노테이션은 캐시할 수 있는 메소드를 정의할 수 있는것으로, 해당 메소드의 return 값이 캐시된다.
공통코드의 경우 데이터가 한번 생성되면 변경될 일이 거의 없고
같은 값을 계속 호출하는 경우가 많으므로, 캐시해서 사용하는것이 메모리 측면에서 더 좋다.
테이블 구조
공통코드는 실무에서 사용하는 방식마다 제각각이지만
내가 사용한 테이블 구조는 아래와 같다
(이 외 사용여부나 등록자, 수정자 등은 생략하겠다 )
컬럼명(논리) | 물리명 |
CODE | 코드 |
REF_CODE | 부모코드 |
CODE_NAME | 코드명 |
CODE_DESC | 코드설명 |
데이터 구조는 흔히 쓰이는 device type로 예를 들겠다.
CODE | REF_CODE | CODE_NAME | CODE_DESC |
device | 디바이스 | 디바이스 타입 | |
device.pc | device | PC | 디바이스 - PC |
device.mobile | device | MOBILE | 디바이스 - MOBILE |
service 로직
parameter는 cacheable의 key에 입력하여 구분된다.
cacheable의 value는, 해당 값으로 캐시가 구분되고 해당 값을 통해 캐시값을 가져온다.
아래와같이 cacheable annotation을 사용하는경우
최초에는 쿼리를 실행하고, 두번째부터는 캐싱된 데이터를 가지고온다.
// 하위 코드 전체 return
@Cacheable(value = CacheConstants.CODE_LIST_REF_CODE, key = "#refCode")
@Override
public List<Code> getCodeList(String refCode) {
return codeMapper.selectCodeList(refCode);
}
// 특정 코드 return
@Cacheable(value = CacheConstants.CODE, key = "#code")
@Override
public Code getCodeByCode(String code) {
CodeCriteria criteria = new CodeCriteria();
criteria.createCriteria()
.andCodeEqualTo(code)
.andUseYnEqualTo(BaseConst.Y);
List<Code> list = codeMapper.selectByCriteria(criteria);
return list == null || list.size() == 0 ? null : list.get(0);
}
하위코드를 가져오는 서비스와 단일 코드를 가져오는 서비스 메소드를 위와같이 작성했다.
(해당 service 로직에서는 mybatis generator를 사용하였음을 참고 부탁한다.)
public class CacheConstants {
public static final String CODE = "code:code";
public static final String CODE_REF_CODE = "code:refCode";
}
final class 선언
공통코드를 가져올때는 매번 선언하고 메소드를 호출하게되면 매우 불편하다.
아래와같이 final class를 선언 후 간단하게 코드 한줄로 사용할 수 있다.
public final class BinderBean implements ApplicationContextAware {
private static CodeService codeService;
/**
* 코드명 리턴
* @return String
**/
public static String getCodeName(String code) {
Code code = getCode(code);
if (code == null)
return null;
return code.getCodeName();
}
public static Code getCode(String code) {
if (codeService == null || code == null)
return null;
return codeService.getCode(code);
}
/**
* 하위 코드 전체
* @return List<Code>
**/
public static List<Code> getCodeList(String refCode) {
if (refCode == null || codeService == null)
return null;
return codeService.getCodeList(refCode);
}
@Override
public void setApplicationContext(ApplicationContext context) throws BeansException {
codeService = context.getBean(CodeService.class);
}
}
실제 사용 예
실제 사용시 아래와같이 한줄로 간편하게 가능하다
String devicePc = BinderBean.getCodeName("device.pc");
List<Code> deviceType = BinderBean.getCodeList("device");
※ 위 예시 코드들은 실제 실무에서 사용된 예시로 혹시나 잘못된 부분이 있으면 덧글로 첨언 부탁드립니다.
'개발' 카테고리의 다른 글
POSTMAN API 호출 테스트하기 (0) | 2021.05.13 |
---|---|
[javascript] 카카오지도 api 지도에 마커 표시하기 (0) | 2021.05.12 |
[솔라리스 ] vi 편집기 주요 명령어 (0) | 2021.04.29 |
[XSL 기본문법] TEMPLATE, PARAM, ATTRIBUTE, VARIABLE (0) | 2021.04.26 |
[DBEAVER] 쿼리자동정렬 / 단축키 변경 (0) | 2021.04.25 |
댓글