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

개요 (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)
반응형
'모바일 앱(안드로이드)' 카테고리의 다른 글
| 🛠 Wear + Phone Altitude 동기화 & 설정화면 컴파일 오류 해결 요약 (1) | 2025.12.01 |
|---|---|
| 🖐 Wear OS | 폰-워치 동기화와 큰절 제스처 시작 표식, 설정 화면 표시까지 (0) | 2025.11.29 |
| 🦾 Android | 하단 바 + Navigation Compose + 보안 키 주입(ResValue) 적용기 (1) | 2025.11.23 |
| 🩺 Android | Health Connect 걸음 수 집계 캐시 & 상단바 최소 높이 적용 (1) | 2025.11.21 |
| 🪄 Wear OS | Complication 탭 액션 구현 및 타일/칩 UI 정리 (1) | 2025.11.19 |