채팅시스템에서 사용하는 용도로 금칙어(욕설)등 데이터를 가져오는 API개발

사전 지식

[Server] Cache

1. Why ? Global 이 아닌 LocalCache 사용했는가?
금칙어(욕설)데이터는 600여건이며 자주 변하지 않고(업데이트가 빈번하지 않음) 빈번하게 조회될 여지가 있다. 따라서 LocalCache를 사용하였다.
2. 캐시의 지속 시간 고려
LocalCache의 로컬 메모리는 크지 않다. 따라서 1시간으로 설정하였다.
//Service단 메서드에 적용
@Cacheable(value = LocalCacheConfig.CACHE_1_HOUR)
public List<String> getForbiddenWords(){
세부로직...
}
//Config 설정
Configuration cacheConfig = new Configuration();
        cacheConfig.setName("__csservice");

        CacheConfiguration config1hour = new CacheConfiguration();
        config1hour.setName(CACHE_1_HOUR);
        config1hour.setMemoryStoreEvictionPolicy("LRU"); //저장방법
        config1hour.setMaxEntriesLocalHeap(1000); //최대 메모리크기
        config1hour.setTimeToIdleSeconds(0);
        config1hour.setTimeToLiveSeconds(60 * 60); //60초 * 60 = 1시간
        cacheConfig.addCache(config1hour);
        return CacheManager.newInstance(cacheConfig);
}
3. 캐시의 저장여부 확인
첫 번째 방법으론 Service단에서 log.info를 찍어보았다. 하지만 확실하지 않았다. cache관련된 함수를 호출하긴 하지만 이게 저장을 하는지 여부를 파악하기 힘들었다. 따라서 Thread를 주고 한 번더 호출한 후 로그를 비교했다. 더 확실하게 하기 위해서 Service단에 현재시간을 구하는 메서드를 만들고 @EnableCaching, @Cacheable, @CacheEvict 세가지를 테스트 해보았다.
4. 효과
캐싱처리가 없었다면 DB에 부하가 지속적으로 발생하곘지만, 캐싱처리를 함으로써 DB부하를 낮춤.
대부분 config처리가 xml로 처리하지만 class로 처리하는 방식을 택한 회사의 방침대로 진행. 또한 config는 해당 api에서만 사용하는 것이 아니라 범용성있게 사용가능하므로 변수명을 설정할 때 범용성있게 작성해야한다.

 

+ Recent posts