개발관련/TIL
내배캠 13주 2일 차
hifumialice
2024. 7. 10. 00:25
오늘도 프로젝트를 진행했다. 오전에는 각자 작업한 코드 리뷰를 진행하고 오후에는 각자 맡은 캐시 작업을 진행하기로 했다. 내가 맡은 파트는 db에서 인기 키워드 목록을 가져와서 캐시에 저장한 후 반환하는 작업이었다. 구현하는 것은 @Cacheable 어노테이션을 이용하면 어렵지 않아서 금방 구현했다. 그러나 문제는 다른 팀원이 맡은 부분이었다.
팀원이 해야하는 부분이 키워드로 검색을 할 때 키워드를 모아서 한번에 db에 저장하는 방식인 write back 방식을 택했다. 이를 어노테이션을 이용해서 어떻게 구현하지가 문제였다. 일단 @Cacheable은 캐싱이 되었으면 메소드 로직을 실행하지 못 하니 @CachePut를 이용해야 했다. 그런데 캐시에 담아 놓은 데이터를 어떻게 가져올 것인지 또는 캐시할 데이터는 어떻게 할 건지가 문제가 됐다. 따라서 직접 캐시 매니저에게 캐시 공간을 받아와서 데이터를 넣는 방식을 택했다.
키워드 저장하는 캐시 -- write back 방식
fun hotKeyword(keyWord: String) {
val cache = cacheManager.getCache("HotKeywordCache")!!
if (cache.get(111) == null) {
cache.put(111,mutableMapOf<String, Long>(keyWord to 0L))
}
val map = cache.get(111)!!.get() as MutableMap<String,Long>
if (map.containsKey(keyWord)) {
map[keyWord] = map[keyWord]!! + 1L
} else {
map[keyWord] = 1L
}
}
모아 놓은 키워드를 db에 넣는 함수
fun save() {
val cache = cacheManager.getCache("HotKeywordCache")!!
val map = cache.get(111)!!.get() as MutableMap<String,Long>
val searchWord = mutableListOf<SearchWord>()
map.forEach{
for (i in 1..it.value){
searchWord.add(SearchWord(it.key, LocalDate.now()))
}
}
if (searchWord.isNotEmpty())
searchWordRepository.saveAll(searchWord)
}
위와 같은 방식으로 임의로 캐시를 구현했는데... 맞는지는 잘 모르겠다. 캐시에 대해서 조금 더 자세하게 알아야 할 필요가 있는 것 같다.