Today's

길을 나서지 않으면 그 길에서 만날 수 있는 사람을 만날 수 없다

모바일 앱(안드로이드)

🛠 Android | Coupang API + Hilt DI + AdsScreen UX/포맷 개선 작업 기록

Billcorea 2025. 11. 25. 15:57
반응형

 

🛠 Android | Coupang API + Hilt DI + AdsScreen UX/포맷 개선 작업 기록

Ktor API 연동 페이지 샘플

개요 (Intro)

  • Ktor 기반 Coupang Affiliate API 통합, Hilt DI 구조 확립, AdsScreen UI/가격 포맷 개선
  • 네트워크 권한 및 키 로딩 안정화, 로깅/리트라이 및 브라우저 딥링크 UX 추가
📅 날짜: 2025.11.25
🎯 목표: 안정적인 외부 API 호출 + Hilt 의존성 주입 + 상품 리스트 화면 UX 향상
🧰 기술: Kotlin, Jetpack Compose, Ktor, Hilt, Coil, Gradle Kotlin DSL

문제 정의 (Problem / Motivation)

  • API 키가 빈 문자열(Empty Key)로 주입되는 문제 → local.properties 및 Gradle providers 처리 필요
  • INTERNET 권한 누락으로 OkHttp DNS SecurityException 발생
  • 가격 포맷 단순/정수 처리로 소수점 금액 누락
  • 이미지 클릭 가능성 낮음 → 링크 이동 인지 UX 부족
  • 랜덤 카테고리/재시도 로직 필요 및 불안정한 일회성 오류 대응
SecurityException: Permission denied (missing INTERNET permission?)
[CoupangKeys@Gradle] access.len=0, secret.len=0  (초기 진단 시)

해결 과정 (How I Solved It)

  • DI Hilt 모듈(NetworkModule, AppModule) 추가 → HttpClient(Ktor) & CoupangAffiliateClient 주입
  • Network INTERNET / ACCESS_NETWORK_STATE 권한 Manifest에 선언
  • Keys Gradle providers + local.properties 폴백, 길이 로그 출력 & 마스킹
  • Logging HMAC 서명 입력/시그니처 앞 8자리, 응답 status 로그
  • Retry Ktor 호출 3회 백오프 재시도 로직(ViewModel)
  • Enum 카테고리 enum화 + 랜덤 선택 기능 추가(Category.random())
  • UI AdsScreen 분리, 이미지/가격 Row 모두 브라우저 딥링크 클릭 처리
  • Format 가격 소수점 & 천단위 포맷: DecimalFormat("#,##0.########원")
  • UX OpenInNew 아이콘 + 안내 문구 후 Row 간소화(아이콘+가격) + 전체 클릭
// Hilt Module (AppModule) 일부
@Provides @Singleton
fun provideCoupangAffiliateClient(ctx: Context, http: HttpClient) = CoupangAffiliateClient(
  accessKey = ctx.getString(R.string.cupang_access_key).trim(),
  secretKey = ctx.getString(R.string.cupang_secret_key).trim(),
  httpClient = http
)

// Retry 로직
while (attempt < maxRetries) {
  try { /* API 호출 */ break } catch (e: Exception) { delay(300L * attempt++) }
}

// 가격 포맷
private fun formatPrice(raw: String?): String = DecimalFormat("#,##0.########")
  .format(raw?.replace(Regex("[^0-9.]"), "")?.toBigDecimalOrNull() ?: return "-") + "원"

결과 (Result)

  • API 키 정상 주입(Gradle 로그: access.len=36, secret.len=40)
  • 네트워크 호출 정상 응답 (SecurityException 해소)
  • 상품 리스트: 이미지/가격 Row 모두 딥링크 동작, 가격 소수 유지
  • 랜덤 카테고리 새로고침으로 테스트 다양화, 오류 시 재시도 안정성 향상
  • 로그로 진단 용이(HMAC, status, key 길이)
✅ 키 주입/권한/로그 안정화 완료
🔄 재시도 + 랜덤 카테고리로 API 안정성 개선
🖼 UX: 클릭 영역 확대(이미지 + 가격 Row), 명확한 브라우저 이동 인지
💰 가격 포맷: 소수점 유지 + 천단위 표시

느낀 점 / 회고 (Reflection)

  • 권한/리소스/Gradle 구성 로그를 초기에 넣어두면 진단 속도가 크게 향상됨
  • 백오프 재시도는 간단하지만 API 레이트/에러코드 기반 세밀화 여지 있음
  • UI 클릭 affordance(아이콘, 텍스트 최소화)로 사용자 행동 유도 효과 확인
  • 가격 포맷은 BigDecimal 변환 단계에서 예외를 미리 필터링해 안정성 확보 중요

참고자료 (References)

반응형