본문 바로가기
개발 노트/기타

안드로이드 앱 검색 결과 없음(Empty State) 화면 예외 처리 및 UI 상태 설계

by pposooj 2026. 5. 22.

안드로이드 앱에서 검색 기능을 구현할 때, 결과가 잘 나올 때는 리스트만 뿌려주면 되니 크게 고민할 게 없습니다. 항목 누르면 상세 화면으로 보내면 끝이니까요.

하지만 진짜 개발하면서 손이 많이 가고 헷갈리는 부분은 검색 결과가 없을 때(Empty State)입니다.

저의 경우도 공공데이터나 지역 기반 서비스를 만지다 보면, 데이터가 없는 이유가 제각각이라 그냥 통으로 "결과가 없습니다"라고만 띄우면 사용자들이 앱이 고장 난 줄 알거나 뭘 해야 할지 몰라 헤매는 경우가 많았습니다. 나중에 제가 다시 보려고 운영하면서 겪은 예외 처리 기준과 UI 상태 설계 방식을 정리해 둡니다.

화면 상태(UI State) 분리부터 시작하기

이래저래 코드를 짜다 보면 화면 상태를 명확하게 쪼개는 것부터 시작해야 나중에 예외 처리가 안 꼬입니다. 단순 리스트의 isEmpty() 체크로 끝내지 말고, 구조를 먼저 잡는 게 편합니다. 프로젝트 구조 잡을 때 사용하는 sealed interface 예시입니다.

Kotlin
 
sealed interface SearchUiState {
    data object Initial : SearchUiState
    data object Loading : SearchUiState
    data class Success(val items: List<SearchItem>) : SearchUiState
    data class Empty(val keyword: String) : SearchUiState
    data class UnsupportedRegion(val regionName: String) : SearchUiState
    data class NetworkError(val canRetry: Boolean = true) : SearchUiState
}

data class SearchItem(
    val title: String,
    val subtitle: String
)

이렇게 상태 이름을 기준으로 화면을 쪼개두면, 각 상태별로 어떤 문구와 어떤 버튼을 배치해야 할지 기준이 명확해집니다.

1. 검색 결과 없음과 오류 상황 구분하기

리스트가 비어있다고 다 같은 빈 화면이 아닙니다. 원인에 따라 사용자에게 유도해야 하는 행동(버튼)이 완전히 달라져야 합니다. 운영 관점에서도 이렇게 나눠두어야 나중에 크래시 리포트나 로그를 보고 문제를 찾기 쉽습니다.

상태 원인 메시지 방향 버튼 예시
검색 결과 없음 검색어와 일치하는 데이터가 없음 다른 단어로 검색하도록 안내 검색어 지우기
네트워크 오류 인터넷 연결 또는 서버 응답 실패 잠시 후 다시 시도하도록 안내 다시 시도
미지원 지역 선택한 지역 데이터가 없음 지원 지역을 다시 선택하도록 안내 지역 변경
초기 상태 아직 검색 전 검색 가능한 예시를 안내 추천 검색어 선택

2. 화면 문구는 짧고 구체적으로 (사용자 탓 금지)

안내 문구가 너무 길어지면 모바일 화면 특성상 상단 검색창이나 액션 버튼이 밑으로 밀려버립니다. 한두 문장으로 핵심만 적는 게 좋습니다. 그리고 가장 중요한 건 '잘못 입력했습니다' 같은 표현 대신 사용자에게 다음 행동을 제안하는 방식을 써야 자연스럽습니다.

상황 피하면 좋은 문구 개선 문구 예시
검색 결과 없음 데이터가 없습니다. 검색 결과가 없습니다. 다른 품목명으로 다시 검색해보세요.
네트워크 오류 오류가 발생했습니다. 정보를 불러오지 못했습니다. 연결 상태를 확인한 뒤 다시 시도해주세요.
미지원 지역 지원하지 않습니다. 현재 선택한 지역의 정보는 아직 제공되지 않습니다. 다른 지역을 선택해보세요.
검색 전 검색하세요. 품목명이나 키워드를 입력해 정보를 찾아볼 수 있습니다.

3. 재시도 버튼은 '진짜 에러' 상태에만 두기

이거 은근히 서비스 기획이나 디자이너분들과 얘기할 때 많이 놓치는 부분인데, 검색 결과가 없는 상태에 '다시 시도' 버튼을 넣으면 안 됩니다. 아무리 다시 눌러봤자 없는 데이터가 새로 생기지는 않으니까요. 반복적인 의미 없는 API 요청만 발생합니다.

  • 검색 결과 없음 상태: 검색어 지우기(X 버튼), 추천 키워드, 혹은 이전 화면 이동을 유도합니다.
  • 네트워크 오류 상태: 이때야말로 '다시 시도' 버튼과 네트워크 연결 안내를 보여줍니다.
  • 미지원 지역 상태: '지역 변경'이나 제공 중인 지역 리스트 확인 버튼을 제공합니다.
  • 초기 상태: 최근 검색어나 서비스에서 자주 쓰는 예시 검색어를 매핑해 줍니다.

4. 공공데이터 및 지역 기반 앱 운영 시 주의점

공공데이터 API를 연동해서 앱을 서비스하다 보면 데이터 정합성이나 운영 이슈를 꼭 챙겨야 합니다.

  • 검색어 보정은 최소한만: 띄어쓰기 제거 정도는 안전하지만, 없는 품목이나 장소를 있는 것처럼 보이게 과한 추측성 유사어 검색을 적용하면 신뢰도가 떨어집니다. 결과 출처를 명확히 해야 합니다.
  • 검색 로그 노출 주의: 인기 검색어를 보여줄 때 실제 사용자 검색 로그를 필터링 없이 디비에서 그대로 긁어오면 안 됩니다. 개인정보나 민감한 키워드가 노출될 수 있으므로, 관리자가 지정한 일반 명사 위주의 키워드로 구성하는 게 안전합니다.
  • 행정 정보 최신화 문구: 정책이나 행정 절차가 수시로 바뀌는 공공데이터 특성상, "최신 정보는 해당 기관 안내를 확인하세요" 같은 안내 문구를 작게라도 남겨두는 편이 민원 방지에 좋습니다.

실무 체크리스트 및 자주 하는 실수

배포하기 전에 아래 항목들은 코드를 돌려보며 직접 테스트해 보는 것이 좋습니다.

  • [ ] 검색 결과가 없는 화면과 네트워크 에러 화면을 똑같은 UI 컴포넌트로 퉁치고 있진 않은가?
  • [ ] 빈 화면 문구에 사용자가 다음에 뭘 해야 할지(다음 행동) 포함되어 있는가?
  • [ ] 추천 검색어 띄울 때 사용자 실제 검색 로그가 필터링 없이 그대로 노출되진 않는가?
  • [ ] 현재 위치가 미지원 지역인데 그냥 데이터가 없다고만 안내하고 있진 않은가?

마무리

앱을 만들고 운영하다 보면 Empty State는 단순히 빈 공간을 채우는 화면이 아니라, 서비스의 첫인상과 신뢰도를 결정하는 중요한 예외 처리 흐름이라는 생각이 듭니다. 귀찮다고 대충 리스트 비었을 때 텍스트 하나 띄우고 끝내지 말고, 처음부터 UI State를 꼼꼼하게 쪼개서 대응하면 유저가 고장 났다고 느끼는 이탈률을 훨씬 줄일 수 있습니다.

참고: Android Developers - UI state production / Material Design Guidelines