Skip to content

[GMSS-325]네트워크 에러 공통 컴포넌트 추가 및 홈, 채팅 적용 - #71

Merged
seunghee17 merged 10 commits into
developfrom
feature/add-network-error-component-GMS-325
Sep 30, 2026
Merged

seunghee17 merged 10 commits into
developfrom
feature/add-network-error-component-GMS-325

Conversation

@soyeonLee126

@soyeonLee126 soyeonLee126 commented Sep 25, 2026 •

Copy link
Copy Markdown
Collaborator

작업 개요

네트워크 에러를 보여 주는 공통 UI가 없어서 화면마다 따로 처리하고 있었습니다. 채팅 검색은 자체 문구와 재시도 버튼을 썼고, 홈은 사용자 정보 조회에 실패해도 아무것도 표시하지 않았습니다. 채팅 리스트는 오프라인이면 빈 상태 문구가 떠서, 대화가 없는 것처럼 보였습니다.

디자인 시안(네트워크오류, Figma 5051:9711)에 맞춘 공통 컴포넌트를 core/designsystem에 추가했습니다. 홈, 채팅 리스트, 채팅 검색에서 첫 로드가 네트워크로 실패하면 이 화면을 보여 줍니다.

작업 유형

  • feat: 새 기능
  • fix: 버그 수정
  • refactor: 리팩토링 (동작 변경 없음)
  • build: 빌드/의존성 설정
  • chore: 기타 (문서, 설정 등)
  • test: 테스트 추가/수정

변경 사항

  • 공통 컴포넌트 GamssNetworkErrorContent(onRefresh, modifier)
    • 상태 없이 재시도 콜백만 받습니다. 도메인을 몰라도 되므로 모든 feature에 자동으로 붙는 core/designsystem에 두었습니다.
    • 일러스트는 VectorDrawable 두 장(img_network_error, img_network_error_tape)으로 나눴습니다. VectorDrawable은 그룹 알파를 지원하지 않습니다. 그래서 겹친 두 도형인 테이프에 도형마다 투명도를 주면 겹친 테두리가 진해집니다. 이를 피하려고 테이프를 따로 그려 한 레이어로 합성했습니다.
  • 홈
    • isLoading과 nickname을 sealed UserInfoState(Loading, Loaded, NetworkError)로 합쳤습니다.
    • 아직 닉네임을 받은 적이 없을 때 네트워크로 실패하면 상단바 아래를 에러 화면으로 바꿉니다. 이미 보이는 닉네임은 기존처럼 유지합니다.
    • 재시도하는 동안에도 에러 화면을 유지해서, 입력 화면이 잠깐 번쩍이지 않습니다.
    • 로딩 중에 열어 둔 감정 피커는 에러 화면으로 바뀔 때 닫습니다.
    • 걱정 전송이 네트워크로 실패하면 공통 에러 화면과 같은 문구("네트워크 연결 상태를 확인해주세요.")로 토스트를 띄웁니다. 그 밖의 실패는 기존 문구를 그대로 씁니다.
    • 화면에서 쓰는 사용자 정보 판정(nickname, isUserInfoLoading, isNetworkError)을 HomeState의 파생값으로 옮겼습니다. 동작은 바뀌지 않습니다.
  • 채팅 리스트
    • ChattingListPhase.NetworkError를 추가했습니다.
    • 한 번도 불러오지 못한 상태에서 네트워크로 실패하면, 빈 상태보다 에러 화면을 먼저 보여 줍니다.
    • 이미 불러온 목록은 유지하고 토스트만 띄웁니다. 목록이 비어 있어도 마찬가지입니다.
    • 에러 화면에서 검색에 들어가 결과 카드를 누르면 채팅방이 열립니다.
  • 채팅 리스트 조회 경합 수정 (리뷰 반영)
    • 재시도를 연달아 누르면, 앞 요청에서 계산한 neverLoaded 값 때문에 나중 요청의 성공 상태가 NetworkError로 바뀔 수 있었습니다. 목록 조회는 Mutex.tryLock으로 한 번에 하나만 실행하고, 조회가 진행 중일 때 들어온 load 호출은 무시합니다. 요청이 진행 중인지는 상태에서 파생할 수 없어 Mutex로 관리했습니다.
    • 조회 응답을 기다리는 동안 선택 모드에 들어가면, 응답이 도착하면서 선택이 풀렸습니다. 이제 응답을 반영할 때 최신 단계가 Loading, Browsing, NetworkError일 때만 단계를 바꿉니다. 선택 모드는 유지하고, 새 목록에서 사라진 방은 선택에서 제외합니다. 고를 방이 하나도 남지 않으면 선택 모드를 종료합니다.
    • 삭제 전에 시작한 조회의 응답이 삭제 후에 도착하면, 지운 방이 목록에 다시 보였습니다. 삭제 후 목록 갱신을 loadMutex.withLock으로 감싸서, 응답을 기다리는 조회가 있으면 그 조회가 끝난 뒤에 실행되도록 했습니다.
  • 채팅 검색
    • 첫 페이지가 네트워크로 실패하면 결과 영역에 에러 화면을 보여 줍니다.
    • 그 밖의 원인과 다음 페이지 실패는 기존 UI를 그대로 씁니다.

관련 이슈

관련 작업 (Notion)

스크린샷 / 동작 화면

  • 시안: Figma 노드 5051:9711 (네트워크오류)
  • GamssNetworkErrorContent Light/Dark Preview와 HomeScreen의 Home - Network error Preview에서 확인할 수 있습니다.

체크리스트

  • base 브랜치가 develop으로 설정되어 있다
  • 로컬 빌드 및 실행을 확인했다
  • 커밋 메시지가 컨벤션(feat:, fix: 등)을 따른다
  • 불필요한 로그/주석/디버그 코드를 제거했다
  • 리뷰어가 이해할 수 있도록 설명을 작성했다

테스트 내용

  • 단위 테스트
    • HomeViewModelTest: 32개 모두 통과했습니다. 네트워크 첫 로드 실패, 재시도, 피커 닫힘, 전송 네트워크 실패 케이스를 추가했습니다.
    • ChattingListLoadTest: 새로 추가했고 13개 모두 통과했습니다. 조회 중 연속 호출, 조회 중 선택 유지(성공, 실패), 사라진 방 제외, 빈 목록에서 선택 종료, 삭제 후 늦게 도착한 조회 케이스가 들어 있습니다. 이 중 빈 목록 케이스를 제외한 5개는 수정 전 코드로 돌리면 실패하는 것을 확인했습니다.
    • develop 머지 후 :feature:chat, :feature:home 단위 테스트 114개가 모두 통과했습니다.
  • 정적 분석과 빌드: :core:designsystem, :feature:home, :feature:chat의 detekt와 :app:assembleDebug가 모두 통과했습니다.
  • 실기기(SM-S911N, Android 16, dev 빌드): 비행기 모드에서 홈 에러 화면이 뜨는 것을 확인했습니다. 리뷰 반영분(채팅 리스트 조회 경합)은 단위 테스트로만 확인했고, 실기기에서는 확인하지 않았습니다.

리뷰 요청 사항

  1. 정책: 에러 화면은 "아직 보여 줄 것이 없을 때"만 띄웁니다. 앱을 쓰는 중에 오프라인이 돼도 이미 보이는 화면은 유지하고, 연결 상태를 따로 감시하지 않습니다. 이 방향이 맞는지 봐 주세요.
  2. 충돌 정리: [GMSS-288]채팅 검색 모드 UI 분리 및 검색 결과 없음 화면 개선 #70(GMSS-288)이 먼저 머지되어 develop을 이 브랜치에 머지했습니다. 충돌은 ChattingSearchContent.kt의 import 한 곳이었고, 더 이상 쓰지 않는 GamssIcons import를 지웠습니다.
  3. 조회 경합: 기존에 알려진 한계로 적었던 조회 중복 문제는 위 "채팅 리스트 조회 경합 수정"으로 해결했습니다. 진행 중인 요청을 취소하지 않고, 진행 중이면 새 요청을 무시하는 방식입니다. 그래서 조회 중에 다시 들어오면 앞 요청의 결과가 최종 목록이 됩니다.

@seunghee17
seunghee17 merged commit 38500cd into develop Sep 30, 2026
6 checks passed
@soyeonLee126
soyeonLee126 deleted the feature/add-network-error-component-GMS-325 branch September 30, 2026 15:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants