2026/05/04

오늘의 이야기

 



🛠 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)






댓글 없음:

댓글 쓰기

오늘의 이야기

  🩺 Android | Health Connect 걸음 수 집계 캐시 & 상단바 최소 높이 적용 앱 이미지   개요 (Intro) 오늘의 목표: 만보계 핵심 로직(걸음 수 ...