개발관련/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)

}

 

 위와 같은 방식으로 임의로 캐시를 구현했는데... 맞는지는 잘 모르겠다. 캐시에 대해서 조금 더 자세하게 알아야 할 필요가 있는 것 같다.