๐ก์๋๋ก์ด๋ ๋คํธ์ํฌ ํต์ ์ ์ํ HTTP ํด๋ผ์ด์ธํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํ์ฌ ํ์ตํ ๋ด์ฉ์ ๊ธฐ๋กํ์์ต๋๋ค.
๊ฐ์
- OkHttp์ Retrofit์ ์๋๋ก์ด๋์์ ๋คํธ์ํฌ ํต์ ์ ์ฝ๊ฒ ์ฒ๋ฆฌํ ์ ์๋๋ก ๋์์ฃผ๋ HTTP ํด๋ผ์ด์ธํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค.
- ๋ ๋ค ๋คํธ์ํฌ ์์ฒญ์ ๊ด๋ฆฌํ๋ ๋ฐ ๋งค์ฐ ์ ์ฉํ์ง๋ง, Retrofit์ ์์ ๋ ๋ฒจ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก OkHttp๋ฅผ ๋ด๋ถ์ ์ผ๋ก ์ฌ์ฉํ๋ฉฐ, ๋ ๊ฐ๋จํ API๋ฅผ ์ ๊ณตํ์ฌ ๋คํธ์ํฌ ์์ ์ ์ฝ๊ฒ ์ฒ๋ฆฌํ ์ ์๋๋ก ๋์์ค๋๋ค.
- OkHttp์ Retrofit์ ํ์ตํ๊ธฐ ์ํด ํ์ํ ๊ฐ๋ ์ ํจ๊ป ์ ๋ฆฌํ์์ต๋๋ค.
HTTP
- HypeText Transfer Protocol์ ์ฝ์๋ก, ์ธํฐ๋ท ์์์ HTML ๋ฌธ์์ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋งํฌ ๊ธฐ๋ฐ์ผ๋ก ์ฃผ๊ณ ๋ฐ๊ธฐ ์ํ ํ๋กํ ์ฝ(ํต์ ๊ท์ฝ)์ ๋๋ค.
- ์๋ฒ-ํ ๋ผ์ด์ธํธ ๋ชจ๋ธ๋ก ๊ตฌ๋ถํ๋ฉฐ ์ ์ก ์ ์ด ํ๋กํ ์ฝ(TCP)๊ณผ ์ธํฐ๋ท ํ๋กํ ์ฝ(IP) ์์์ ๋์ํฉ๋๋ค.
HTTPS
- HTTP + Secure Socket(๋ณด์ ํต์ )์ ์ฝ์๋ก ๋ชจ๋ ํต์ ๋ด์ฉ์ ์ํธํํ๋ฉฐ, ๊ณต๊ฐํค ์ํธํ ๋ฐฉ์์ ์ฌ์ฉํฉ๋๋ค.
REST
- REST(Representational State Transfer)๋ ์น ์๋น์ค๋ฅผ ์ค๊ณํ๋ ๋ฐ ์ฌ์ฉ๋๋ ์ํคํ ์ฒ ์คํ์ผ์ ๋๋ค.
- REST๋ ์ธํฐ๋ท์์ ์น ์๋น์ค ๊ฐ์ ํต์ ์ ์ฉ์ดํ๊ฒ ํ๋ ๋ช ๊ฐ์ง ๊ธฐ๋ณธ ์์น์ ์ ์ํ๋๋ฐ, ์ด๋ฅผ ๋ฐ๋ฅด๋ API๋ฅผ REST API ๋๋ RESTful API๋ผ๊ณ ํฉ๋๋ค.
API
- ์ ๋ณด ์ ๊ณต์๊ฐ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ ๋ํด ์์ฉ ํ๋ก๊ทธ๋จ์์ ํ ์ ์๋๋ก ๋ง๋ ์ธํฐํ์ด์ค์ ๋๋ค.
REST API
- Representational State Transfer API๋ก URI๋ก ์์(์ด๋ฏธ์ง, ๋์์, DB ๋ฐ์ดํฐ)์ ํํํ๋ ๋ฐ์ ์ง์คํ๊ณ , ์์์ ์ํ(ํ์)์ ๋ํ ์ ์๋ฅผ HTTP Method๋ก ํ๋ ์ํคํ
์ฒ์
๋๋ค.
- HTTP Method : CRUD ์์ ์ฒ๋ฆฌ๋ฅผ ์ํ ๋ฉ์๋
- ํด๋ผ์ด์ธํธ๋ ์์์ ์ํ์ ๋ํ ์กฐ์์ ์์ฒญํ๊ณ ์๋ฒ๋ก๋ถํฐ ๋ฐ์ ์๋ต์ธ JSON, XML๋ก ์ด๋ฃจ์ด์ง๋๋ค.
- ์ด๋ REST ์ํคํ ์ฒ์ ์ ์ฝ์กฐ๊ฑด์ ์ค์ํ๋ API๋ฅผ ์๋ฏธํฉ๋๋ค.
OkHttp
- OkHttp๋ HTTP ์์ฒญ ๋ฐ ์๋ต์ ์ฒ๋ฆฌํ๋ ์ ์์ค์ HTTP ํด๋ผ์ด์ธํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค.
- ์๋๋ก์ด๋์์ HTTP ํต์ ์ ํ ๋ ์ฌ์ฉ๋๋ฉฐ, ๋คํธ์ํฌ ์์ฒญ์ ๊ฐ์ํํ๊ณ ํจ์จ์ ์ธ ๋คํธ์ํฌ ์ฐ๊ฒฐ ์ฌ์ฌ์ฉ ๋ฐ ์บ์ฑ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
https://square.github.io/okhttp/
์ฃผ์ ๊ธฐ๋ฅ
- HTTP/2 ๋ฐ SPDY ์ง์
- ๋คํธ์ํฌ ์ฐ๊ฒฐ ์ฑ๋ฅ์ ๊ฐ์ ํ๊ณ , ๋ ์ ์ ๋์ญํญ์ ์ฌ์ฉํฉ๋๋ค.
- ์ปค๋ฅ์
ํ
- ๋คํธ์ํฌ ์ฐ๊ฒฐ์ ์ฌ์ฌ์ฉํ์ฌ ์ฑ๋ฅ์ ์ต์ ํํฉ๋๋ค.
- ์บ์ฑ
- ์๋ฒ๊ฐ ์๋ตํ ๋ฐ์ดํฐ๋ฅผ ๋ก์ปฌ์ ์ฌ์ฌ์ฉํ๋ฉฐ, ๋คํธ์ํฌ ์์ฒญ ์๋ฅผ ์ค์ผ ์ ์์ต๋๋ค.
- ๋น๋๊ธฐ ๋ฐ ๋๊ธฐ ์์ฒญ
- ๋น๋๊ธฐ ๋คํธ์ํฌ ์์ฒญ์ ์ฝ๊ฒ ์ฒ๋ฆฌํ ์ ์์ผ๋ฉฐ, ํ์ํ ๊ฒฝ์ฐ ๋๊ธฐ ์์ฒญ๋ ๊ฐ๋ฅํฉ๋๋ค.
- ์ธํฐ์
ํฐ
- ๋คํธ์ํฌ ์์ฒญ ๋ฐ ์๋ต์ ๊ฐ๋ก์ฑ์ ๋ก๊น , ํค๋ ์ถ๊ฐ, ์ธ์ฆ๊ณผ ๊ฐ์ ์์ ์ ์ฝ๊ฒ ์ํํ ์ ์์ต๋๋ค.
Gradle
- OkHttp๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์ ์์กด์ฑ์ ์ถ๊ฐํฉ๋๋ค.
dependencies {
implementation("com.squareup.okhttp3:okhttp:4.9.3")
}
- ๋๊ธฐ ์์ฒญ
val client = OkHttpClient()
val request = Request.Builder()
.url("<https://api.example.com>")
.build()
// ๋๊ธฐ ์์ฒญ
val response: Response = client.newCall(request).execute()
if (response.isSuccessful) {
println(response.body?.string())
}
- ๋น๋๊ธฐ ์์ฒญ
val client = OkHttpClient()
val request = Request.Builder()
.url("<https://api.example.com>")
.build()
// ๋น๋๊ธฐ ์์ฒญ
client.newCall(request).enqueue(object : Callback {
override fun onFailure(call: Call, e: IOException) {
e.printStackTrace()
}
override fun onResponse(call: Call, response: Response) {
if (response.isSuccessful) {
println(response.body?.string())
}
}
})
Retrofit
- Retrofit์ OkHttp๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ง๋ค์ด์ง ๊ณ ์์ค์ HTTP ํด๋ผ์ด์ธํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค.
- REST API ํธ์ถ์ ๋งค์ฐ ๊ฐ๋จํ๊ฒ ์ฒ๋ฆฌํ ์ ์๋๋ก ์ค๊ณ๋์์ผ๋ฉฐ, JSON ๋ฐ์ดํฐ๋ฅผ ์๋์ผ๋ก ์ง๋ ฌํ/์ญ์ง๋ ฌํํ๊ณ , ์ธํฐํ์ด์ค ๊ธฐ๋ฐ์ผ๋ก ๋คํธ์ํฌ ์์ฒญ์ ์ ์ํ ์ ์์ด ์ฝ๋๊ฐ ํจ์ฌ ๊ฐ๊ฒฐํด์ง๋๋ค.
- RxJava๋ Coroutine์ ๊ฐ์ ๋น๋๊ธฐ ์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์๋ ์ฝ๊ฒ ํตํฉํ ์ ์์ต๋๋ค.
https://square.github.io/retrofit/
์ฃผ์ ๊ธฐ๋ฅ
- ์ธํฐํ์ด์ค ๊ธฐ๋ฐ ๋คํธ์ํฌ ์์ฒญ
- ์ธํฐํ์ด์ค๋ฅผ ํตํด ๋คํธ์ํฌ ์์ฒญ์ ์ ์ํ๊ณ ์ฌ์ฉํ๋ฏ๋ก ์ฝ๋๊ฐ ๊ฐ๊ฒฐํฉ๋๋ค.
- ์๋ ์ง๋ ฌํ ๋ฐ ์ญ์ง๋ ฌํ
- JSON ํ์์ ๋ฐ์ดํฐ๋ฅผ ์๋์ผ๋ก ๊ฐ์ฒด๋ก ๋ณํํ๊ณ , ๊ฐ์ฒด๋ฅผ JSON์ผ๋ก ๋ณํํ๋ ์์ ์ ์ฒ๋ฆฌํฉ๋๋ค.
- OkHttp ํตํฉ
- ๋ด๋ถ์ ์ผ๋ก OkHttp๋ฅผ ์ฌ์ฉํ์ฌ ๋คํธ์ํฌ ์์ฒญ์ ์ฒ๋ฆฌํฉ๋๋ค.
- ๋น๋๊ธฐ ๋คํธ์ํฌ ์์ฒญ
- Coroutines, RxJava, Callbacks๋ฅผ ํตํด ๋น๋๊ธฐ ๋คํธ์ํฌ ์์ฒญ์ ์ฝ๊ฒ ์ฒ๋ฆฌํฉ๋๋ค.
- ์ปค์คํฐ๋ง์ด์ง
- OkHttp์ ์ธํฐ์ ํฐ๋ฅผ ์ฌ์ฉํ์ฌ ์์ฒญ๊ณผ ์๋ต์ ์กฐ์ํ ์ ์์ต๋๋ค.
Gradle
- Retrofit์ ์ฌ์ฉํ๊ธฐ ์ํด์ ์์กด์ฑ์ ์ถ๊ฐํฉ๋๋ค.
dependencies {
implementation("com.squareup.retrofit2:retrofit:2.9.0")
implementation("com.squareup.retrofit2:converter-gson:2.9.0") // JSON ํ์ฑ์ฉ GSON ์ปจ๋ฒํฐ
}
์ธํฐํ์ด์ค ์ ์
- ์ธํฐํ์ด์ค๋ฅผ ํตํด ๋คํธ์ํฌ ์์ฒญ์ ์ ์ํ ์ ์์ต๋๋ค.
interface ApiService {
@GET("users/{user}")
suspend fun getUser(@Path("user") userId: String): UserResponse
}
Retrofit ์ธ์คํด์ค ์์ฑ ๋ฐ API ํธ์ถ
val retrofit = Retrofit.Builder()
.baseUrl("<https://api.example.com/>")
.addConverterFactory(GsonConverterFactory.create()) // JSON ์ง๋ ฌํ/์ญ์ง๋ ฌํ
.build()
val apiService = retrofit.create(ApiService::class.java)
// Coroutines์ ์ฌ์ฉํ API ํธ์ถ
GlobalScope.launch {
val response = apiService.getUser("123")
println(response)
}
OkHttp vs Retrofit
OkHttp์ Retrofit์ ์ฐจ์ด์
๋ ๋ฒจ | ์ ์์ค์ HTTP ํด๋ผ์ด์ธํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ | ๊ณ ์์ค์ REST API ํด๋ผ์ด์ธํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ |
API ์ ์ ๋ฐฉ์ | ์ง์ HTTP ์์ฒญ ๋ฐ ์๋ต์ ์ฒ๋ฆฌํด์ผ ํจ | ์ธํฐํ์ด์ค๋ก API ์์ฒญ์ ์ ์ํ๊ณ ์๋ ์ฒ๋ฆฌ |
์ง๋ ฌํ/์ญ์ง๋ ฌํ | ์ง์ํ์ง ์์ (์ง์ ๊ตฌํํด์ผ ํจ) | JSON ์ง๋ ฌํ/์ญ์ง๋ ฌํ ์๋ ์ฒ๋ฆฌ (Gson ๋ฑ๊ณผ ํตํฉ) |
๋น๋๊ธฐ ์ฒ๋ฆฌ | ๋น๋๊ธฐ ์ฒ๋ฆฌ ๊ฐ๋ฅ (enqueue() ์ฌ์ฉ) | Coroutines ๋ฐ RxJava์ ์์ฐ์ค๋ฌ์ด ํตํฉ ์ง์ |
์ธํฐ์ ํฐ | ๋คํธ์ํฌ ์์ฒญ ๋ฐ ์๋ต์ ๊ฐ๋ก์ฑ์ ์ฒ๋ฆฌ ๊ฐ๋ฅ | OkHttp์ ์ธํฐ์ ํฐ ๊ธฐ๋ฅ์ ๊ทธ๋๋ก ์ฌ์ฉํ ์ ์์ |
์ฝ๋ ๋ณต์ก๋ | ์๋์ ์ผ๋ก ๋ณต์กํจ (์์ฒญ, ์๋ต, JSON ์ฒ๋ฆฌ ๋ฑ์ ์๋์ผ๋ก ํด์ผ ํจ) | ์๋์ ์ผ๋ก ๊ฐ๋จํจ (์ธํฐํ์ด์ค๋ก ์ ์๋ง ํ๋ฉด ์๋ ์ฒ๋ฆฌ) |
OkHttp๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ?
- ์ ์์ค์ HTTP ์์ฒญ
- REST API๊ฐ ์๋ ๋ค๋ฅธ ์ ํ์ ๋คํธ์ํฌ ์์ฒญ
- ์์ฒญ์ ํค๋๋ ํ๋ผ๋ฏธํฐ๋ฅผ ์ปค์คํ
Retrofit์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ?
- RESTful API๋ฅผ ๊ฐํธํ๊ฒ ํธ์ถ
- JSON ๋ฐ์ดํฐ๋ฅผ ์๋์ผ๋ก ์ง๋ ฌํ/์ญ์ง๋ ฌํํ ๋ ์ฌ์ฉ
- ๋น๋๊ธฐ ์ฒ๋ฆฌ์ Coroutines, RxJava์ ํตํฉ
- ์ธํฐํ์ด์ค ๊ธฐ๋ฐ ๊ฐ๋ ์ฑ ๋์ ์ฝ๋
Retorfit๊ณผ OkHttp ๊ฒฐํฉ
- Retrofit์ ๋ด๋ถ์ ์ผ๋ก OkHttp๋ฅผ ์ฌ์ฉํ๊ณ ์์ผ๋ฏ๋ก, ํ์์ ๋ฐ๋ผ ๊ฒฐํฉํ์ฌ ์ฌ์ฉํฉ๋๋ค.
- ๋ ๋ฐฉ์์ ๊ฒฐํฉํ์ฌ ํต์ ์ ์ธํฐ์ ํธ ํ ๋ณํํ๋ ์์ ์ ํ๊ณ ์์ต๋๋ค.
val okHttpClient = OkHttpClient.Builder()
.addInterceptor { chain ->
val request = chain.request().newBuilder()
.addHeader("Authorization", "Bearer token")
.build()
chain.proceed(request)
}
.build()
val retrofit = Retrofit.Builder()
.baseUrl("<https://api.example.com/>")
.client(okHttpClient) // OkHttp ํด๋ผ์ด์ธํธ ์ถ๊ฐ
.addConverterFactory(GsonConverterFactory.create())
.build()
val apiService = retrofit.create(ApiService::class.java)
๊ฒฐ๋ก
- OkHttp๋ ์ ์์ค์์ HTTP ์์ฒญ, ์๋ต์ ์ธ๋ฐํ๊ฒ ์ ์ดํ๋ ๊ฒฝ์ฐ ์ ํฉํ๋ฉฐ, ์น ์์ผ, ์คํธ๋ฆฌ๋ฐ ๋ฑ ๋ค์ํ HTTP ์์ ์ ์ฒ๋ฆฌํ ๋ ์ ์ฉํฉ๋๋ค.
- Retrofit์ RESTful API ํต์ ์ ๊ฐํธํ๊ฒ ํ ์ ์๋๋ก ํ๋ฉฐ, JSON ์ง๋ ฌํ/์ญ์ง๋ ฌํ, ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ๊ฐ๋จํ๊ฒ ๊ตฌํํ ์ ์์ต๋๋ค.