개발 이모저모

SharedPreference를 이용한 최근 검색어 리스트 만들기

c0de_h0ng 2021. 11. 16. 22:07
728x90

검색 기능을 만들 때 부과적인 기능으로 최근 검색한 키워드를 저장하는 최근 검색어 기능을 만들어 보았다. 최근에 검색한 단어를 저장하는 방법은 백엔드에 저장하는 방법, Room, SharedPreference, SQLite를 사용하여 로컬에 저장하는 방법이 있다. 이번 개발에는 SharedPreference를 사용해서 개발하였다.

설계

최근 검색어 리스트는 ArrayList형으로 만들어서 JsonString형으로 변환시켜 저장한다.

기능

  1. 검색어 저장 기능
  2. 이전에 검색했던 검색어일 경우 이전 데이터 삭제 후 저장 기능
  3. 키워드 전체 삭제 및 개별 삭제 기능

검색어 저장 시나리오

  1. 유저가 검색어를 입력한다.
  2. 입력한 검색어가 이전에 저장되어 있는지 확인한다.
    1. 이전에 저장되어 있는 경우 → 이전에 입력되어 있는 데이터를 삭제한 후 SharedPreference 저장한다.
    2. 이전에 저장되어 있지 않는 경우 → SharedPreference에 저장한다.
  3. 저장한 최근 검색어 리스트를 보여준다.

기능 개발

최근 검색어 리스트 저장, 읽기, 삭제, 추가 기능을 개발하였다.

최근 검색어 리스트 저장

fun setRecentSearchKeyword(type: String, searchKeyword: String) {
    val prefs = context.getSharedPreferences(RECENT_DATA, Context.MODE_PRIVATE)
    val editor = prefs.edit()
    val recentSearchKeywordList = getRecentSearchKeyword(type)
    if (recentSearchKeywordList.isNotEmpty()) {
        for (i in recentSearchKeywordList.indices) {
            if (searchKeyword == recentSearchKeywordList[i]) {
                recentSearchKeywordList.removeAt(i)
                break
            }
        }
    }
    recentSearchKeywordList.add(0, searchKeyword)
    val gson = Gson()
    val jsonRecentSearchKeyword = gson.toJson(recentSearchKeywordList)
    editor.putString(type, jsonRecentSearchKeyword)
    editor.apply()
}

 

- 파라미터

  • type
    • SharedPreference 키 값
    • 앱에 따라서 여러 기능의 검색이 있을 경우를 위해서 SharedPreference에 키로 분류
  • searchKeyword
    • 검색어

- 플로우

  1. RECENT_DATA라는 이름의 SharedPreference 데이터를 가져온 뒤 에디터를 선언한다.
  2. getRecentSearchKeyword으로 최근 검색어 리스트 데이터를 가져온다.
  3. 최근 검색 데이터 유무에 따라 분기 처리를 한다.(null은 허용하지 않고 디폴트로는 빈 배열)
    1. 최근 검색 데이터가 있을 경우
      1. for문을 이용해서 검색어가 최근 검색 데이터에 존재하면 이를 remove한다.
      2. 0번째 인덱스에 검색어를 추가한다.
    2. 최근 검색 데이터가 없을 경우
      1. 0번째 인덱스에 검색어를 추가한다.
  4. 최근 검색어 리스트 데이터를 Json String 형으로 Gson을 통해서 변환한다.
  5. RECENT_DATA의 이름의 SharedPreference에 변환한 최근 검색어 리스트 데이터를 저장하고 적용한다.

최근 검색어 리스트 읽기

fun getRecentSearchKeyword(type: String): ArrayList<String> {
    val prefs = context.getSharedPreferences(RECENT_DATA, Context.MODE_PRIVATE)
    val gson = Gson()
    val jsonRecentSearchKeyword: String = prefs.getString(type, "") ?: ""
    val typeToken = object : TypeToken<ArrayList<String>>() {}.type
    return gson.fromJson(jsonRecentSearchKeyword, typeToken) ?: ArrayList()
}

 

- 파라미터

  • type
    • SharedPreference 키 값
    • 필요에 의해서 여러 기능의 검색이 있을 경우를 위해서 SharedPreference에 키로 분류

- 플로우

  1. RECENT_DATA라는 이름의 SharedPreference에서 호출한 type에 관한 최근 검색어 리스트를 가져온다.
  2. TypeToken으로 ArrayList<String>.class로 호출한다.
  3. 저장되어 있는 최근 검색어 리스트를 fromJson을 통해서 ArrayList<String>으로 반환하고 데이터가 null인 경우에는 엘비스 연산자(?:)로 빈 배열을 생성한다.

특정 검색어 삭제

fun editRecentSearchKeyword(type: String, removeKeyword: String) {
    val recentSearchKeywordList = getRecentSearchKeyword(type)
    if (recentSearchKeywordList.isNotEmpty()) {
        val prefs = context.getSharedPreferences(RECENT_DATA, Context.MODE_PRIVATE)
        val editor = prefs.edit()
        for (i in recentSearchKeywordList.indices) {
            if (removeKeyword == recentSearchKeywordList[i]) {
                recentSearchKeywordList.removeAt(i)
                break
            }
        }
        val jsonRecentSearchKeyword = Gson().toJson(recentSearchKeywordList)
        editor.putString(type, jsonRecentSearchKeyword)
        editor.apply()
    }
}

- 파라미터

 

  • type
    • SharedPreference 키 값
    • 필요에 의해서 여러 기능의 검색이 있을 경우를 위해서 SharedPreference에 키로 분류
  • removeKeyword
    • 삭제하려고 하는 검색어

- 플로우

  1. getRecentSearchKeyword으로 최근 검색어 리스트 데이터를 가져온다.
  2. 최근 검색어 리스트가 있을 경우에 for문을 통해서 삭제하려고 하는 검색어를 찾아 remove한다.
  3. 삭제가 완료된 최근 검색어 리스트를 toJson을 사용하여 Json String형으로 변환한 뒤 SharedPreference Editor를 가지고 변환한 데이터를 적용한다.

최근 검색어 리스트 전체 삭제

fun removeRecentSearchKeyword(type: String) {
    val prefs = context.getSharedPreferences(RECENT_DATA, Context.MODE_PRIVATE)
    val editor = prefs.edit()
    editor.remove(type)
    editor.apply()
}

- 파라미터

 

  • type
    • SharedPreference 키 값
    • 필요에 의해서 여러 기능의 검색이 있을 경우를 위해서 SharedPreference에 키로 분류

- 플로우

  1. getRecentSearchKeyword으로 최근 검색어 리스트 데이터를 가져온다.
  2. 삭제하려고 하는 최근 검색어 리스트 데이터 타입 remove를 통해서 삭제한 뒤 SharedPreference Editor를 가지고 삭제한 결과를 적용한다.