네트워킹 — Retrofit·OkHttp·인터셉터·에러 처리
거의 모든 앱은 서버와 통신한다. 안드로이드의 사실상 표준은 Retrofit(타입 안전 HTTP 클라이언트) + OkHttp(그 밑의 HTTP 엔진)다 — REST API를 코틀린 인터페이스로 선언하고 코루틴 suspend로 호출한다. [andarch 04]의 Repository가 이 네트워크 소스를 데이터 계층으로 감싼다. (출처: Square — Retrofit / OkHttp / Android — Network connectivity.)
Retrofit — API를 인터페이스로 선언
interface MemberApi {
@GET("members/{id}")
suspend fun getMember(@Path("id") id: Long): MemberDto // suspend → 코루틴
@GET("members")
suspend fun search(@Query("q") query: String): List<MemberDto>
@POST("members")
suspend fun create(@Body body: CreateRequest): MemberDto
}
val retrofit = Retrofit.Builder()
.baseUrl("https://api.app.com/")
.client(okHttpClient)
.addConverterFactory(/* kotlinx.serialization 또는 Moshi */)
.build()
val api = retrofit.create(MemberApi::class.java)
@GET/@POST/@PUT/@DELETE+ *@Path/@Query/@Body/@Header*로 요청을 선언.suspend함수면 Retrofit이 코루틴으로 처리(적절한 백그라운드 디스패처).- 변환기(converter) — JSON↔객체.
kotlinx.serialization(코틀린 네이티브) 또는 Moshi. (@Serializable data class로 DTO.)
OkHttp·인터셉터 — 공통 처리를 한 곳에
Retrofit 밑의 OkHttp가 실제 HTTP(연결 풀·타임아웃·캐시·재시도)를 담당한다. **인터셉터(interceptor)**로 모든 요청/응답에 공통 처리(인증 토큰·로깅·헤더)를 끼운다.
val okHttpClient = OkHttpClient.Builder()
.connectTimeout(10, TimeUnit.SECONDS)
.addInterceptor { chain -> // 인증 헤더 자동 추가
val req = chain.request().newBuilder()
.addHeader("Authorization", "Bearer $token").build()
chain.proceed(req)
}
.addInterceptor(HttpLoggingInterceptor()) // 디버그 로깅
.build()
토큰 갱신은 *Authenticator*로 401 응답 시 자동 재발급한다.
에러 처리 — 네트워크는 실패한다
네트워크는 끊기고·느리고·에러를 준다. 예외를 잡아 결과 타입으로 변환해 ViewModel이 상태로 표현하게 한다([andarch UDF]).
suspend fun loadMember(id: Long): Result<Member> = runCatching {
api.getMember(id).toDomain()
}.recoverCatching { e ->
when (e) {
is IOException -> throw NetworkException("네트워크 오류") // 연결 문제
is HttpException -> when (e.code()) { // HTTP 상태
404 -> throw NotFoundException()
in 500..599 -> throw ServerException()
else -> throw e
}
else -> throw e
}
}
*타임아웃·연결 실패(IOException)*와 *HTTP 에러(HttpException, 4xx/5xx)*를 구분하고, *재시도(지수 백오프)·오프라인 폴백(DB 캐시, [andarch 04])*을 둔다.
Ktor·기타
Ktor Client는 코틀린 멀티플랫폼(KMP) 친화적 대안이다(서버·iOS 공유). 단순 앱은 Retrofit, 멀티플랫폼이면 Ktor를 고려한다. 이미지·대용량은 별도 로더(Coil, [23])·스트리밍을 쓴다.
정리 — 선언하고, 공통은 인터셉터로, 실패를 다룬다
네트워킹의 핵심 — Retrofit으로 API를 인터페이스+suspend로 선언, 변환기는 kotlinx.serialization/Moshi, OkHttp 인터셉터로 인증·로깅·헤더를 한 곳에, 에러(IOException vs HttpException)를 결과 타입으로 변환해 상태로 표현, 오프라인 폴백·재시도, KMP면 Ktor. 통신을 Repository 뒤에 감추고 실패를 1급으로 다루는 게 견고한 앱의 조건이다.
한 줄 요약 — Retrofit(인터페이스·
@GET/@Query·suspend)+변환기(kotlinx.serialization/Moshi) on OkHttp(타임아웃·캐시·인터셉터로 인증/로깅·Authenticator 토큰 갱신). 에러는 IOException(연결) vs HttpException(4xx/5xx) 구분→Result/sealed로, 재시도·오프라인 폴백(DB). KMP는 Ktor. Repository가 감쌈.
(출처: Retrofit / OkHttp docs / Android — Network operations / kotlinx.serialization / Ktor client.)