๋ค์ด๊ฐ๊ธฐ์ ์์
Retrofit ์ธ์๋ ํต์ ์ ํธํ๊ฒ ํ ์ ์๋๋ก ๋์์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ช ๊ฐ ์์๋ค.
HttpClient, Volley, Okhttp ๋ฑ ํ์ง๋ง HttpClient, Volley๋ Deprecated ๋์๊ณ ,
Okhttp์ ์ด์ฉํ์ฌ ๋ ํธํ๊ณ ์ฌ์ฉํ๊ธฐ ์ฝ๊ฒ ๋ง๋ ๊ฒ์ด Retrofit์ด๋ค.
Okhttp๋ฅผ ๊ธฐ๋ฐ์ผ๋ก Retrofit์ ๋ง๋ค์๊ธฐ ๋๋ฌธ์ Retrofit ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ถ๊ฐํ๋ฉด OKhttp์ ๋ฉ์๋๋ ์ฌ์ฉํ ์ ์๋ค.
Retrofit2 ์ด๋?
์๋๋ก์ด๋์์ ๋คํธ์ํฌ ํต์ ์ ์ฝ๊ฒ ๊ตฌํํ ์ ์๋๋ก ๋์์ฃผ๋ ์คํ ์์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค.
Retrofit์ HTTP API๋ฅผ ํธ์ถํ๊ธฐ ์ํ ์ธํฐํ์ด์ค๋ฅผ ์ ์ํ๊ณ , ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ค์ ๋ก ๋คํธ์ํฌ ํธ์ถ์ ์ํํฉ๋๋ค.
- API ํต์ ์ ์ํด ๊ตฌํ๋ OkHTTP์ HTTP ํต์ ์ ๊ฐํธํ๊ฒ ๋ง๋ค์ด์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ปํ๋ค.
- Async Task๊ฐ ์์ด Background ์ฐ๋ ๋๋ฅผ ์คํํ๋ค. ์ฆ, CallBack์ ํตํ์ฌ Main Thread์์ UI๋ฅผ ์ ๋ฐ์ดํธํ๋ค.
- ๋์ผ Squareup์ฌ์ OkHttp ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์์ ๊ตฌํ์ฒด์ด๋ค.
Retrofit 2 ์ฅ์
Retrofit2์ ์ฅ์ ์ ํฌ๊ฒ 3๊ฐ์ง๋ก ๋ณผ ์ ์๋ค.
์๋ / ํธ์์ฑ / ๊ฐ๋ ์ฑ
- OkHTTP ์ฌ์ฉ ์์ AsyncTask๋ฅผ ํตํด ๋น๋๊ธฐ๋ฅผ ์คํํ์ฌ ์๋๊ฐ ๋๋ฆฐ ์ด์๊ฐ ์๋ค. ํ์ง๋ง Retrofit2์์๋ ์์ฒด์ ์ผ๋ก ๋น๋๊ธฐ ์คํ๊ณผ ์ค๋ ๋ ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฅํ์ฌ ์๋๊ฐ ๋น ๋ฅด๋ค.
- ํจ์ ํธ์ถ ์์ ํ๋ผ๋ฏธํฐ๋ฅผ ๋๊ฒจ์ฃผ์ด ์์ ๋์ด ๊ฐ์ํ๋ค.
- Interface ๋ด์์ ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ์ฌ ํธ์ถ ํจ์๋ฅผ ๋ฏธ๋ฆฌ ์ง์ , ๊ตฌํ ์์ด ํด๋น ํจ์๋ฅผ ํธ์ถ๋ง ํด์ฃผ๋ฉด ๋๊ธฐ ๋๋ฌธ์ ์ฝ๋๋ฅผ ์ฝ๊ธฐ ํธ๋ฆฌํ๋ค. ๋ํ ์ฝ๋ฐฑ ํจ์๋ฅผ ํตํ ์ง๊ด์ ์ค๊ณ๊ฐ ๊ฐ๋ฅํ๋ค.
- Retrofit์ ๋๊ธฐ/๋น๋๊ธฐ๋ฅผ ๋ชจ๋ ์ง์ํ๋ค.
Retrofit 2 ๊ตฌ์ฑ์์
- DTO (POJO) - 'Data transfer Object', 'Plain Old Java Object' ํํ์ ๋ชจ๋ธ(Model) / JSON ํ์
๋ณํ์ ์ฌ์ฉ
DTO (Data transfer Object) ๋?
๊ณ์ธต๊ฐ ๋ฐ์ดํฐ ๊ตํ์ด ์ด๋ฃจ์ด ์ง ์ ์๋๋ก ํ๋ ๊ฐ์ฒด(Java Beans)์ด๊ธฐ ๋๋ฌธ์, ํน๋ณํ ๋ก์ง์ ๊ฐ์ง์ง ์๋ ์์ํ ๋ฐ์ดํฐ ๊ฐ์ฒด์ฌ์ผ ํ๋ค. - Interface - ์ฌ์ฉํ HTTP CRUD ๋์(๋ฉ์๋)๋ค์ ์ ์ํด ๋๋ ์ธํฐํ์ด์ค
- Retrofit.Builder ํด๋์ค - interface๋ฅผ ์ฌ์ฉํ ์ธ์คํด์ค, baseUrl(URL) / Converter(๋ณํ๊ธฐ) ์ค์
Retrofit 2 ์์
Retrofit2์ ์ด์ฉํ์ฌ URL์ ํตํด ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ์์
AndroidManifest.xml
์ธํฐ๋ท ๊ถํ ์ค์
<uses-permission android:name="android.permission.INTERNET"/>
build.gradle
retrofit ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ถ๊ฐ
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
Post.kt
๊ฐ์ ธ์ฌ ๋ฐ์ดํฐ์ ๋ฐ์ดํฐ ํด๋์ค๋ฅผ ๋ง๋ ๋ค.
data class Post (
val userId : Int,
val id : Int,
val title : String,
val body : String
)
MyApi.kt
interface ์ ์, number ๋งค๊ฐ๋ณ์๋ฅผ ํตํด URL ๋ค์ ์ค๋ ๋ํ ์ผํ ์ฃผ์๋ฅผ ์ก์์ค๋ค.
interface MyApi {
@GET("posts/{number}")
fun getPostNumber(
@Path("number") number : Int
) : Call<Post>
}
RetrofitInstance.kt
retrofit ์ธ์คํด์ค๋ฅผ ์ฑ๊ธํค ํจํด์ผ๋ก ๋ง๋ค์ด์ค๋ค.
object RetrofitInstance {
val BASE_URL = "https://jsonplaceholder.typicode.com/"
val client = Retrofit
.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build()
fun getInstance() : Retrofit {
return client
}
}
MainActivity.kt
class MainActivity : AppCompatActivity() {
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val api = RetrofitInstance.getInstance().create(MyApi::class.java)
api.getPostNumber(2).enqueue(object : Callback<Post> {
override fun onResponse(call: Call<Post>, response: Response<Post>) {
if (response.isSuccessful){
// ์ ์์ ์ผ๋ก ํต์ ์ฑ๊ณตํ ๊ฒฝ์ฐ
// URL์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์จ๋ค.
Log.d("API2", response.body().toString())
}else{
// ํต์ ์ด ์คํจํ ๊ฒฝ์ฐ(์๋ต์ฝ๋ 3xx, 4xx ๋ฑ)
Log.d("API2", "ํต์ ์คํจ")
}
}
override fun onFailure(call: Call<Post>, t: Throwable) {
// ํต์ ์คํจ (์ธํฐ๋ท ๋ํด, ์์ธ ๋ฐ์ ๋ฑ ์์คํ
์ ์ธ ์ด์ )
Log.d("API2", "fail")
}
})
}
}
}
์คํ ํ๋ฉด
Post ํด๋์ค์ ๋ฐ์ดํฐ ํด๋์ค๋ฅผ ์ ์ํด ๋์ ๊ฒ ์ฒ๋ผ ์ถ๋ ฅ๋๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
์ฐธ๊ณ
https://minchanyoun.tistory.com/44
'๐ Development > Android' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Java ์๋ฐ, Android ์๋๋ก์ด๋] ์ฑํ ๋ฐฉ ๋ง๋ค๊ธฐ (0) | 2023.07.17 |
---|---|
[์๋๋ก์ด๋] Jetpack์ ViewModel์ด๋? (์ฌ์ฉ๋ฒ ์์ ) (0) | 2023.05.22 |
[์๋๋ก์ด๋] JetPack์ LiveData๋? (0) | 2023.05.22 |
[์๋๋ก์ด๋] Jetpack์ Room DB์ด๋? (์ฌ์ฉ๋ฒ ์์ ) (0) | 2023.05.17 |
[์๋๋ก์ด๋] Local DB SQLite ์ด๋? (์ฌ์ฉ๋ฒ ์์ ) (0) | 2023.05.17 |