본문 바로가기
개발

[SPRING] Cacheable annotation을 사용하여 공통코드 관리하기

by 정보알려주는언니 2021. 5. 7.

 

 

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");

 

※ 위 예시 코드들은 실제 실무에서 사용된 예시로 혹시나 잘못된 부분이 있으면 덧글로 첨언 부탁드립니다. 


댓글