μλλ‘μ΄λμμ λ€νΈμν¬ ν΅μ μ ꡬννλ λ°©λ²μ μ§μμ μΌλ‘ λ°μ νκ³ μμΌλ©°, μ΅μ νΈλ λλ λΉλκΈ° μ²λ¦¬, 보μ κ°ν, μ±λ₯ μ΅μ νλ₯Ό μ€μ¬μΌλ‘ μ΄λ£¨μ΄μ§κ³ μμ΅λλ€.
| κΈ°μ | μ€λͺ | μ΅μ νΈλ λ |
|---|---|---|
| Retrofit 2 | REST APIμμ ν΅μ μ μ½κ² λμμ£Όλ HTTP ν΄λΌμ΄μΈνΈ | μ¬μ ν κ°μ₯ λ리 μ¬μ©λ¨ |
| OkHttp 5 | Retrofit λ΄λΆμμ μ¬μ©λλ©°, λ κ°λ ₯ν HTTP κΈ°λ₯ μ 곡 | HTTP/3 μ§μ, WebSocket κ°μ |
| Ktor | Kotlinμμ μ¬μ©νκΈ° μ’μ λ€νΈμν¬ νλ μμν¬ | Coroutine κΈ°λ°, λ©ν°νλ«νΌ μ§μ |
| Volley | κ°λ¨ν λ€νΈμν¬ μμ²μ μν λΌμ΄λΈλ¬λ¦¬ | μλ‘μ΄ κΈ°λ₯ μΆκ° μμ (κ΅¬κΈ κ³΅μ μ§μ μ μ§) |
| GraphQL (Apollo) | RESTλ³΄λ€ ν¨μ¨μ μΈ λ°μ΄ν° μμ²μ κ°λ₯νκ² νλ κΈ°μ | Facebook, GitHub λ± λν μλΉμ€μμ μ¬μ© μ¦κ° |
| WebSockets & Socket.IO | μ€μκ° μλ°©ν₯ ν΅μ (μ: μ±ν , μλ¦Ό) | WebSocket μ¬μ© μ¦κ° |
| gRPC | Googleμ΄ κ°λ°ν κ³ μ±λ₯ RPC νλ μμν¬ | λ§μ΄ν¬λ‘μλΉμ€ ν΅μ μ¦κ° |
Retrofitμ REST API κΈ°λ° μ± κ°λ°μμ κ°μ₯ λ§μ΄ μ¬μ©λλ HTTP ν΄λΌμ΄μΈνΈμ λλ€.
Retrofit λ΄λΆμμ OkHttpλ₯Ό μ¬μ©νλ©°, μ΅μ OkHttp 5λ HTTP/3 μ§μ λ° μ±λ₯ μ΅μ νκ° ν¬ν¨λμ΄ μμ΅λλ€.
kotlin
볡μ¬νΈμ§
val client = OkHttpClient.Builder()
.connectTimeout(30, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
.addInterceptor(HttpLoggingInterceptor().apply { level = HttpLoggingInterceptor.Level.BODY })
.build()
val retrofit = Retrofit.Builder()
.baseUrl("<https://jsonplaceholder.typicode.com/>")
.client(client)
.addConverterFactory(GsonConverterFactory.create())
.build()
val apiService = retrofit.create(ApiService::class.java)
β μ΅μ κΈ°λ₯
HTTP/3 μ§μ)enqueue()) μ¬μ©Ktorλ Kotlin λ©ν°νλ«νΌμ μ§μνλ μ΅μ λ€νΈμν¬ νλ μμν¬μ λλ€.
Coroutine κΈ°λ°μ΄λ―λ‘ λΉλκΈ° μ²λ¦¬μ μ΅μ νλμ΄ μμΌλ©°, Retrofitλ³΄λ€ λ κ°λ³κ³ λΉ λ₯Έ μ€ν μλλ₯Ό μ 곡ν©λλ€.
kotlin
볡μ¬νΈμ§
val client = HttpClient {
install(ContentNegotiation) {
json(Json { ignoreUnknownKeys = true })
}
}
suspend fun getPosts(): List<Post> {
return client.get("<https://jsonplaceholder.typicode.com/posts>").body()
}