Skip to content

feat: 홈 일일 토큰 사용량 표시 - #21

Draft
soyeonLee126 wants to merge 10 commits into
feature/chat-messagingfrom
feature/daily-token-gauge
Draft

feat: 홈 일일 토큰 사용량 표시#21
soyeonLee126 wants to merge 10 commits into
feature/chat-messagingfrom
feature/daily-token-gauge

Conversation

@soyeonLee126

Copy link
Copy Markdown
Collaborator

작업 개요

홈 우측 상단에 일일 토큰 사용량을 퍼센트와 진행 바로 표시합니다.
메시지 전송 성공 시 사용량을 다시 조회해 최신 상태를 반영합니다.

작업 유형

  • feat: 새 기능
  • test: 테스트 추가/수정

변경 사항

  • /api/members/me/token-usage API, repository, use case를 추가했습니다.
  • 홈 화면 우측 상단에 일일 토큰 사용량 퍼센트와 진행 바를 표시했습니다.
  • dailyLimit이 없는 무제한 환경과 초과 사용량을 처리했습니다.
  • 메시지 전송 성공 시 홈의 토큰 사용량을 갱신합니다.
  • API 응답 매핑과 퍼센트/무제한/초과 사용량 표시 테스트를 추가했습니다.

관련 이슈

  • Closes #133

관련 작업 (Notion)

스크린샷 / 동작 화면

  • 홈 우측 상단의 토큰 사용량 게이지
  • 메시지 전송 후 게이지 갱신

체크리스트

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

리뷰 요청 사항

  • 메시지 전송 후 SharedFlow 기반 갱신이 홈 재진입 시 중복 호출을 만들지 않는지 확인 부탁드립니다.
  • 토큰 사용량 표시 문구와 진행 바 UI 피드백 부탁드립니다.

한도가 없는 계정은 서버가 dailyLimit 키를 내려주지 않는다.
기본값이 없으면 역직렬화가 MissingFieldException 으로 실패해
무제한 플랜 사용자에게 토큰 배지가 아예 보이지 않는다.

파일명이 단일 top-level 선언과 달라 detekt Filename,
MatchingDeclarationName 을 위반하던 것도 함께 정리한다.
갱신이 실패하면 결과를 null 로 매핑해 이미 로드된 사용량을 지워
배지가 화면에서 사라졌다. 실패는 마지막으로 아는 값을 유지한다.

intent 는 즉시 반환해 collect 쪽 취소가 조회까지 닿지 않는다.
collectLatest 로는 진행 중인 조회가 취소되지 않아 연속 전송 시
응답이 역순으로 도착하면 오래된 사용량이 남을 수 있었다.
기존 revealJob 과 같은 방식으로 이전 조회를 직접 취소한다.

갱신 배선 테스트를 추가한다. orbit 의 test() 는 컨테이너를
초기 상태로 되돌려 init 의 첫 조회를 지우므로 실제 컨테이너에
조건 대기를 걸어 검증한다.
진행 바에 fillMaxWidth 가 걸려 있어 한도가 있는 계정에서는
배지 전체가 화면 폭까지 늘어났다. 고정 폭으로 바꾼다.

Scaffold innerPadding 에 이미 상태바 inset 이 들어 있어
statusBarsPadding 은 같은 값을 한 번 더 더하고 있었다.

갱신 중이면 카드 전체를 스피너로 교체해, 한도 초과를 보고 있던
사용자에게 사용량이 사라졌다. 아는 값이 있으면 그대로 두고
값이 없을 때만 스피너를 띄운다.

Surface 안에 중첩돼 바깥 shape 과 elevation 을 가리던 Card 와
초과 여부로 갈라져 있던 진행 바 분기도 함께 정리한다.
requestRefresh 가 suspend 인 summaryStore.add 뒤에 있어,
요약이 끝나기 전에 채팅 화면을 벗어나면 intent 가 취소되고
갱신 요청이 발행되지 않았다. suspend 호출보다 앞으로 옮긴다.

no-op 페이크만 있어 이 배선에 테스트가 없었다. 호출을 기록하는
페이크로 바꿔 성공 경로에서만 갱신을 요청하는지 확인한다.
/api/members/me/token-usage 는 member 리소스 하위이고 기본
Retrofit 을 그대로 쓴다. AuthService 처럼 별도 인스턴스가
필요한 것도 아니어서 인터페이스와 @provides 만 늘고 있었다.

응답 모델도 remote/user/model/response 로 옮긴다.
UserService 를 합친 뒤로 DailyTokenUsageRepositoryImpl 은
UserRepositoryImpl 과 의존성이 같아졌다. member 리소스 하위
조회 하나를 인터페이스와 @BINDS 로 감싸고 있을 이유가 없다.

테스트도 UserRepositoryImplTest 로 옮긴다.
overflow 정책이 없으면 기본이 SUSPEND 라 tryEmit 은 버퍼가 찼을 때
false 를 돌려주고 신호를 버린다. 버려지는 쪽이 더 새로운 신호라서,
직전 전송이 반영되지 않은 수치가 홈에 남을 수 있다.
DROP_OLDEST 로 두면 tryEmit 이 항상 성공하고 최신 신호가 남는다.

노출 타입도 asSharedFlow 로 감싸 다운캐스트로 emit 할 수 없게 한다.
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.

1 participant