[Android] Network - ๐ŸŽค๋‰ด์Šค ์•ฑ๐ŸŽค์„ ๋งŒ๋“ค์–ด๋ณด์•„์š”

Madeline๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ปยท2022๋…„ 12์›” 17์ผ
0

kotlin study

๋ชฉ๋ก ๋ณด๊ธฐ
16/19

https://www.youtube.com/watch?v=VrFnJvcBXm4&list=PLYlZbv3fX7WvaWMB9zRgbO7Hzf3MRgrIf&index=18

๋‹ค์Œ ์˜์ƒ๊ณผ ๊ต์žฌ ์ฐธ๊ณ ํ•˜์—ฌ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

0. ์‹œ์ž‘ ์ „ ๊ณ„ํš ๋‹จ๊ณ„

  1. ๋ชจ๋“ˆ์„ ์ƒ์„ฑํ•˜๊ณ  ๋นŒ๋“œ gradle ์ˆ˜์ •
  2. ์‹ค์Šต ํŒŒ์ผ ๋ณต์‚ฌ
  3. manifest ์ˆ˜์ •
  4. item, page model class ์ž‘์„ฑ
  5. MyApplication.kt ์ž‘์„ฑ => Retrifit
  6. ๋ฆฌ์‚ฌ์ดํด๋Ÿฌ๋ทฐ์˜ ์–ด๋Œ‘ํ„ฐ ์ž‘์„ฑ
  7. Retrofit์˜ ์ธํ„ฐํŽ˜์ด์Šค ์ž‘์„ฑ
  8. ํ”„๋ž˜๊ทธ๋จผํŠธ ์ž‘์„ฑ
  9. ์•ฑ ์‹คํ–‰

1. ๋ชจ๋“ˆ, gradle, manifest ์„ค์ •

์ƒˆ ๋ชจ๋“ˆ Network๋ฅผ ๋งŒ๋“ค์–ด์ค€๋‹ค.

build.gradle (Module. ์ƒ์„ฑํ•œ ๋ชจ๋“ˆ๋ช…) ์—์„œ
1) viewBinding ์„ค์ •ํ•ด์ค€๋‹ค.

viewBinding{
        enabled = true
    }

2) ์‚ฌ์šฉํ•  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋“ฑ๋กํ•ด์ค€๋‹ค.

implementation 'com.android.volley:volley:1.2.1'
    //retrofit
    implementation 'com.squareup.retrofit2:retrofit:2.9.0'
    implementation 'com.google.code.gson:gson:2.8.9'
    //parser ์ง€์ •
    implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
    implementation 'com.github.bumptech.glide:glide:4.12.0'

์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์ด ๊ถ๊ธˆํ•ด์„œ ์•ˆ๋“œ๋กœ์ด๋“œ ๋””๋ฒจ๋กœํผ ๊ณต์‹ ์‚ฌ์ดํŠธ๋ฅผ ์ฐพ์•„๋ดค๋‹ค.

https://developer.android.com/training/volley?hl=ko

๐Ÿ Volley
Volley๋Š” Android ์•ฑ์˜ ๋„คํŠธ์›Œํ‚น์„ ๋” ์‰ฝ๊ณ , ๋ฌด์—‡๋ณด๋‹ค๋„ ๋” ๋น ๋ฅด๊ฒŒ ํ•˜๋Š” HTTP ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค. Volley๋Š” GitHub์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
Volley๋Š” UI๋ฅผ ์ฑ„์šฐ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” RPC ์œ ํ˜• ์ž‘์—…(์˜ˆ: ๊ฒ€์ƒ‰๊ฒฐ๊ณผ ํŽ˜์ด์ง€๋ฅผ ๊ตฌ์กฐํ™”๋œ ๋ฐ์ดํ„ฐ๋กœ ๊ฐ€์ ธ์˜ค๊ธฐ)์— ํƒ์›”ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ํ”„๋กœํ† ์ฝœ๊ณผ ์‰ฝ๊ฒŒ ํ†ตํ•ฉ๋˜๋ฉฐ ์›์‹œ ๋ฌธ์ž์—ด, ์ด๋ฏธ์ง€ ๋ฐ JSON ์ง€์›์„ ์ฆ‰์‹œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ์ง€์›์„ ์ œ๊ณตํ•˜์—ฌ ์‚ฌ์šฉ์ž์˜ ์•ฑ์— ๋งž๋Š” ๋กœ์ง์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Volley๋Š” ํŒŒ์‹ฑํ•˜๋Š” ๋™์•ˆ ๋ชจ๋“  ์‘๋‹ต์„ ๋ฉ”๋ชจ๋ฆฌ์— ์œ ์ง€ํ•˜๋ฏ€๋กœ ๋Œ€๊ทœ๋ชจ ๋‹ค์šด๋กœ๋“œ ๋˜๋Š” ์ŠคํŠธ๋ฆฌ๋ฐ ์ž‘์—…์—๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€๊ทœ๋ชจ ๋‹ค์šด๋กœ๋“œ ์ž‘์—…์€ DownloadManager์™€ ๊ฐ™์€ ๋Œ€์•ˆ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๊ณผ์ •

  • ๊ฐ„๋‹จํ•œ ์š”์ฒญ ๋ณด๋‚ด๊ธฐ
    Volley์˜ ๊ธฐ๋ณธ ๋™์ž‘์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ„๋‹จํ•œ ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๋ฐฉ๋ฒ• ๋ฐ ์š”์ฒญ์„ ์ทจ์†Œํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.
  • RequestQueue ์„ค์ •
    RequestQueue ์„ค์ • ๋ฐฉ๋ฒ•๊ณผ ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์„ ๊ตฌํ˜„ํ•˜์—ฌ ์•ฑ์˜ ์ „์ฒด ๊ธฐ๊ฐ„ ๋™์•ˆ ์ง€์†ํ•˜๋Š” RequestQueue๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.
  • ํ‘œ์ค€ ์š”์ฒญ ์‹คํ–‰
    Volley์˜ ๊ธฐ๋ณธ ์š”์ฒญ ์œ ํ˜•(์›์‹œ ๋ฌธ์ž์—ด, ์ด๋ฏธ์ง€, JSON) ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.
  • ๋งž์ถค ์š”์ฒญ ๊ตฌํ˜„
    ๋งž์ถค ์š”์ฒญ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ‘ฉ๐Ÿป => ๊ฐ„๋‹จํ•œ ์š”์ฒญ ๋ฐ ์‘๋‹ต์œผ๋กœ HTTP ํ†ต์‹ ์„ ์‰ฝ๊ฒŒ ๋„์™€์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค. ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ API ํ˜ธ์ถœ, ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ณ  ํ•˜๋‚˜๋ณด๋‹ค.

3) manifest ํŒŒ์ผ์— ์ธํ„ฐ๋„ท ํผ๋ฏธ์…˜ ๋“ฑ๋ก

<uses-permission android:name="android.permission.INTERNET"/>

4) ๊นก์Œค ์•ˆ๋“œ๋กœ์ด๋“œ ๊ณต์‹ ์‚ฌ์ดํŠธ์—์„œ ๊ตฌ๊ธ€ ๋ฌธ์„œ๋กœ ์‹ค์Šต ํŒŒ์ผ์„ ๊ณต์œ  ๋ฐ›์•„์„œ ๋ถ™์—ฌ์ฃผ์—ˆ๋‹ค.
์—ฌ๊ธฐ์— activityํŒŒ์ผ์ด ํ•˜๋‚˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— <application ์•ˆ์—

android:name="com.example.ch18_network.MyApplication"

๋“ฑ๋กํ•ด์ค€๋‹ค.

2. item, page model class ์ž‘์„ฑ

๐Ÿ˜ถ com/example/newsapp/model/ItemModel.kt

ItemModel class์— property๋ฅผ ์ž‘์„ฑํ•ด์ค€๋‹ค.
=> ๋ฐ์ดํ„ฐ๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๋ชจ๋ธ
์ด ๋ฐ์ดํ„ฐ๋Š” volley, retrofit์œผ๋กœ ๋ถ€ํ„ฐ ๋ฐ›์€ ๋ฐ์ดํ„ฐ์ธ๋ฐ,
volley๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ๋„คํŠธ์›Œํฌ ๋ฐ์ดํ„ฐ๋Š” ๊ฐœ๋ณ„ property์— ๋Œ€์ž…์‹œ์ผœ์ฃผ๋ฉด ๋œ๋‹ค.
retrofit์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ž๋™์œผ๋กœ ๊ฐ์ฒด ์ƒ์„ฑํ•ด์„œ property์— ๋‹ด์•„์ค€๋‹ค. ์ž๋™์œผ๋กœ ๋˜๋‹ค๋ณด๋‹ˆ, ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ”๋“  key์™€ property์˜ ์ด๋ฆ„์ด ์ค‘์š”ํ•˜๋‹ค.

๐Ÿ˜ถ com/example/ch18_network/model/PageListModel.kt

๋ชฉ๋ก ๋ฐ์ดํ„ฐ => ์ด ์ค‘ ํ•˜๋‚˜๊ฐ€ ItemModel
์‹ ๋ฌธ๊ธฐ์‚ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ๊ฑฐ๋‹ค.

3. MyApplication.kt ์ž‘์„ฑ

1) api key ๋ฐœ๊ธ‰๋ฐ›๊ธฐ

๐Ÿ˜ถ com/example/ch18_network/MyApplication.kt

package com.example.ch18_network

import android.app.Application
import com.android.volley.toolbox.Volley
import com.example.ch18_network.retrofit.NetworkService
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory

class MyApplication: Application() {

    companion object {
        val QUERY = "travel"
        val API_KEY = "๋ฐœ๊ธ‰๋ฐ›์€ ํ‚ค"
        val BASE_URL = "https://newsapi.org"
        val USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36"
    }

}

https://newsapi.org/register
์œ„ ๋งํฌ์—์„œ api key๋ฅผ ๋ฐœ๊ธ‰๋ฐ›๋Š”๋‹ค. ๊ธˆ๋ฐฉ ๋œ๋‹ค.

2) Retrofit ์ดˆ๊ธฐํ™”/์ดˆ๊ธฐ ์„ค์ •

์–ด๋””์—์„ ๊ฐ€ ๋”ฑ ํ•œ๋ฒˆ๋งŒ ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

๐Ÿ˜ถ com/example/ch18_network/MyApplication.kt

var networkService: NetworkService
        //retrofit ๊ฐ์ฒด ์ดˆ๊ธฐํ™”
        val retrofit: Retrofit
            get() = Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build()
        init{
            networkService = retrofit.create(NetworkService::class.java)
        }

์ถ”๊ฐ€์„ค๋ช…:
GsonConverterFactory ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ converting ํ• ๊ฒƒ์ž„
์ธํ„ฐํŽ˜์ด์Šค ํƒ€์ž…์œผ๋กœ ์‹ค์ œ ๋„คํŠธ์›Œํ‚น ๊ฐ€๋Šฅํ•˜๊ฒŒ ํด๋ž˜์Šค๋ฅผ ์ด์šฉ

4. RecyclerView Adapter

๐Ÿ˜ถ com/example/ch18_network/recycler/MyAdapter.kt

package com.example.ch18_network.recycler

import android.content.Context
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import com.example.ch18_network.databinding.ItemMainBinding
import com.example.ch18_network.model.ItemModel


class MyViewHolder(val binding: ItemMainBinding): RecyclerView.ViewHolder(binding.root)

class MyAdapter(val context: Context, val datas: MutableList<ItemModel>?): RecyclerView.Adapter<RecyclerView.ViewHolder>(){

    override fun getItemCount(): Int{
        return datas?.size ?: 0
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder
            = MyViewHolder(ItemMainBinding.inflate(LayoutInflater.from(parent.context), parent, false))

    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
        val binding=(holder as MyViewHolder).binding
    }
}

์ „์ฒด ๋ฐ์ดํ„ฐ๊ฐ€ recycler view์— ์˜ํ•ด ๋‚˜์˜ฌ๊ฑฐ๋‹ค.
ํ•ญ๋ชฉ์„ ๊ตฌ์„ฑํ•ด์„œ -> ์ด๋ฏธ์ง€(์„œ๋ฒ„์—์„œ ๋‹ค์šด๋ฐ›์€) -> glide ํ™œ์šฉ
=> onBindViewHolder ํ•จ์ˆ˜์— ์ž‘์„ฑ

์ด๋ฏธ์ง€ ํ•ธ๋“ค๋ง์— ๊ฐ€์žฅ ํŽธํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ glide์ž„.

val model = datas!![position]
        binding.itemTitle.text = model.title
        binding.itemDesc.text = model.description
        binding.itemTime.text = "${model.author} At ${model.publishedAt}"
        Glide.with(context)
            .load(model.urlToImage)
            .into(binding.itemImage)

Glide๋กœ ์ด๋ฏธ์ง€ ๋กœ๋“œํ•˜๋ฉด ์—„์ฒญ ๊ฐ„๋‹จํ•˜๋‹ค!

5. Retrofit ์ธํ„ฐํŽ˜์ด์Šค ์ž‘์„ฑ

๐Ÿ˜ถ com/example/ch18_network/retrofit/NetworkService.kt

package com.example.ch18_network.retrofit

import retrofit2.http.GET
import retrofit2.http.Query

interface NetworkService {
    @GET("/v2/everything")
    fun getList(
        @Query("q") q:String?,
        @Query("apiKey") apiKey:String?,
        @Query("page") page:Long,
        @Query("pageSize") pageSize:Int
    ): Call<PageListModel>
}
  • "/v2/everything" => ์ด URL๋กœ ์„œ๋ฒ„ ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด์„œ, ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ’์œผ๋กœ apiKey, page, pageSize ์„œ๋ฒ„๋กœ ์ „๋‹ฌ

  • ๋ฆฌํ„ดํƒ€์ž…์€ ๋„คํŠธ์›Œํ‚นํ•  ์ˆ˜ ์žˆ๋Š” Call๊ฐ์ฒด => ๊ฒฐ๊ณผ ํƒ€์ž…์€ PageListModel.

6. fragment ์ž‘์„ฑ

1) Volley fragment

๐Ÿ˜ถ com/example/ch18_network/VolleyFragment.kt

//retroft์€ ์ž๋™์ด์ง€๋งŒ volley๋Š” ์•„๋ž˜์ฒ˜๋Ÿผ ์ง์ ‘ ์ž‘์„ฑ
        val url = MyApplication.BASE_URL+"/v2/everything?q="+
                "{${MyApplication.QUERY}&apiKey=${MyApplication.API_KEY}&page=1&pageSize=5"

QUERY=๊ฒ€์ƒ‰์–ด, ๋‚˜๋จธ์ง€ ๋ณ€์ˆ˜๋“ค => ์„œ๋ฒ„์— ๋„˜์–ด๊ฐ

val queue = Volley.newRequestQueue(activity)

: Volley ์ชฝ ๋„คํŠธ์›Œํฌ ์š”์ฒญ์ž
์ด ๊ฐ์ฒด๋กœ request addํ•˜๋ฉด ์„œ๋ฒ„์™€ ์—ฐ๋™๋จ!!!!

val jsonRequest = object: JsonObjectRequest (
            Request.Method.GET,
            url,
            null,
            Response.Listener<JSONObject>{ response ->
                val jsonArray = response.getJSONArray("articles")
                val mutableList = mutableListOf<ItemModel>()
                for(i in 0 until jsonArray.len()){
                    ItemModel().run{
                        val article = jsonArray.getJSONObject(i)
                        author = article.getString("author")
                        title = article.getString("title")
                        description = article.getString("description")
                        urlToImage = article.getString("urlToImage")
                        publishedAt = article.getString("publishedAt")
                        mutableList.add(this)
                    }
                }
                binding.volleyRecyclerView.layoutManager = LinearLayoutManager(activity)
                binding.volleyRecyclerView.adapter = MyAdapter(activity as Context, mutableList)
            },
            Response.ErrorListener{
                Log.d("error", "error...$it")
            }
        )

์š”์ฒญ์ž์—๊ฒŒ ์ •๋ณด๋ฅผ ์ค˜์•ผํ•จ. ๋„˜์–ด์˜จ ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ํ•ธ๋“ค๋ง ํ•˜๋Š”์ง€
=> request ๊ฐ์ฒด

์ถ”๊ฐ€์„ค๋ช…
val jsonRequest = object: JsonObjectRequest (
Request.Method.GET,
url,
null,
Response.Listener< JSONObject >
=> volley ์ชฝ
์ตœ์†Œํ•œ์˜ ์ •๋ณด: GET ๋ฐฉ์‹์œผ๋กœ, ์„œ๋ฒ„์š”์ฒญ url, ์—๋Ÿฌ ๋ฆฌ์Šค๋„ˆ:null, ๋ฐ์ดํ„ฐ๊ฐ€ ๋„˜์–ด์™”์„๋•Œ์˜ ๋ฐ์ดํ„ฐ ํ‹€ = callback = Response.Listener< JSONObjet >

Response.Listener< JSONObject >{ response ->
val jsonArray = response.getJSONArray("articles")
val mutableList = mutableListOf< ItemModel >()
=> ์ •์ƒ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•˜์„ ๋•Œ ์‹คํ–‰๋˜์—ˆ์„ ๋•Œ์˜ ๊ฒฐ๊ณผ๊ฐ’
json ํ‚ค ๊ฐ’ = articles, ์—ฌ๋Ÿฌ๊ฐœ๋‹ˆ๊นŒ array type
๊ฐ๊ฐ ์‹ ๋ฌธ๊ธฐ์‚ฌ ํ•˜๋‚˜๋ฅผ ItemModel์— ๋‹ด๊ธฐ ์œ„ํ•ด mutableList

for(i in 0 until jsonArray.len()){
ItemModel().run{
val article = jsonArray.getJSONObject(i)
author = article.getString("author")
title = article.getString("title")
description = article.getString("description")
urlToImage = article.getString("urlToImage")
publishedAt = article.getString("publishedAt")
mutableList.add(this)
}
}
=> for๋ฌธ์ด ๋Œ๋ฉด์„œ, ์‹ ๋ฌธ๊ธฐ์‚ฌ ํ•˜๋‚˜์— ๋Œ€ํ•œ json object๋ฅผ ์–ป์–ด๋‚ด์„œ,
๊ทธ json object์˜ ํ‚ค ๊ฐ’์ด "author"์ธ ๋ฐ์ดํ„ฐ๋ฅผ ItemMoodel์˜ ๋ณ€์ˆ˜ author์— ๋‹ด๋Š”๋‹ค.

๋นจ๊ฐ„์ค„์ด ๋œจ๋Š”๊ฑด ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ํ•˜๋‚˜ ๋” ์žˆ์–ด์„œ ์•„์ง ๋‹ค ์ž‘์„ฑํ•˜์ง€ ์•Š์•„์„œ ๊ทธ์–ด์ง„ ๊ฒƒ์ผ๊ฑฐ๋‹ค..

binding.volleyRecyclerView.layoutManager = LinearLayoutManager(activity)
binding.volleyRecyclerView.adapter = MyAdapter(activity as Context, mutableList)
},
Response.ErrorListener{
Log.d("error", "error...$it")
}
)
=> ์„œ๋ฒ„๋กœ ๋ถ€ํ„ฐ ๋ฐ›์€ ๋ฐ์ดํ„ฐ๊ฐ€ for๋ฌธ์„ ํ†ตํ•ด ๋‹ค ์ค€๋น„๊ฐ€ ๋˜์—ˆ๋‹ค๊ณ  ํ•˜๋ฉด,
recyclerView๋กœ ๊ตฌ์„ฑํ•ด์ค˜์•ผ๋˜๋‹ˆ๊นŒ ๊ทธ ์ค€๋น„์ž‘์—…์ž„.

Response.ErrorListener: ์‹คํŒจ ์‹œ์˜ callback

๐Ÿ‘ฉ๐Ÿป => ๊ทธ๋Ÿฌ๋‹ˆ๊นŒ,
์œ„ ์ฝ”๋“œ๋“ค์€ ๊ฒฐ๊ตญ ์ƒ์„ฑ์ž์˜ 4๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜์ด๋ฉด์„œ,
์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์ •์ƒ์ ์œผ๋กœ ๊ฒฐ๊ณผ๊ฐ’์ด ๋„˜์–ด์™”์„๋•Œ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ• ๊ฑฐ๋ƒ,๋ฅผ ๋‚˜ํƒ€๋‚ธ๊ฑฐ๋‹ค!

{
            override fun getHeaders(): MutableMap<String, String> {
                val map = mutableMapOf<String, String>(
                    "User-agent" to MyApplication.USER_AGENT
                )
                return map
            }
        }

        return binding.root
    }

=> ์š”์ฒญ ์‹œ์˜ ์„ค์ •! ํ—ค๋”๊ฐ’ ์„ค์ •

val map = mutableMapOf<String, String>

=> map ๊ฐ์ฒด๋ฅผ ์ด ํ•จ์ˆ˜์—์„œ returnํ•จ => ์ž๋™์œผ๋กœ map ๊ฐ์ฒด๊ฐ€ request header ๊ฐ’์— ์ง€์ •์ด ๋œ๋‹ค.
๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ํ•ญ์ƒ ํ—ค๋”๊ฐ’๋„ key, value๋กœ ํ‘œํ˜„๋œ๋‹ค.

=> return ์‹œํ‚จ map์ด request header ๊ฐ’์œผ๋กœ ๋“ค์–ด๊ฐ„๋‹ค.

๐Ÿ‘ฉ๐Ÿป => ๊ฒฐ๊ตญ ๋„คํŠธ์›Œํ‚นํ•  ์ˆ˜ ์žˆ๋Š” queue๊ฐ์ฒด, ๋„คํŠธ์›Œํฌ ์‹œ ์–ด๋–ค ์ •๋ณด ๋ฐ ์ฝœ๋ฐฑ๋“ค์„ ๋“ฑ๋กํ•  request๋„ ์ค€๋น„ํ–ˆ๋‹ค.
**์ด์ œ ์‹ค์ œ ๋„คํŠธ์›Œํฌ ์‹œ๋„๋Š” queue ๊ฐ์ฒด์— request๋ฅผ ๋‹ด์œผ๋ฉด ๋œ๋‹ค.

queue.add(jsonRequest)

=> ์ด ์ˆœ๊ฐ„ ๋„คํŠธ์›Œํ‚น์ด ๋œ๋‹ค. ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ response ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ํ˜น์€ error์‹œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋œ๋‹ค.

2) Retrofit fragment

๐Ÿ˜ถ com/example/ch18_network/RetrofitFragment.kt

๋„คํŠธ์›Œํ‚น์„ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” call ๊ฐ์ฒด๊ฐ€ ์žˆ์–ด์•ผ ํ•œ๋‹ค.
=> ์ธํ„ฐํŽ˜์ด์Šค ํ•จ์ˆ˜๋กœ ์–ป์–ด๋‚ผ ์ˆ˜ ์žˆ์Œ

val call: Call<PageListModel> = MyApplication.networkService.getList(
            MyApplication.QUERY,
            MyApplication.API_KEY,
            1,
            10
        )

์ฝœ ๊ฐ์ฒด๋Š” ๋„คํŠธ์›Œํ‚น์ด ๊ฐ€๋Šฅํ•  ๋ฟ, ๋„คํŠธ์›Œํ‚น์„ ์‹คํ–‰ํ•˜๋ ค๋ฉด ๋ช…๋ น์„ ๋”ฐ๋กœ ๋‚ด๋ ค์ค˜์•ผ๋œ๋‹ค.
๋„คํฌ์›Œํ‚น ์‹คํ–‰ ๋ช…๋ น: enqueue
=> call?.enqueue()

์„œ๋ฒ„์—์„œ ๋„˜์–ด์˜ค๊ฑฐ๋‚˜, ์‹คํŒจํ•˜๊ฑฐ๋‚˜ -> ์–˜๋„ call back ๋“ฑ๋กํ•ด์•ผ๋จ

call?.enqueue(object: Callback<PageListModel>{
            override fun onResponse(call: Call<PageListModel>, response: Response<PageListModel>){
            }
            override fun onFailure(call: Call<PageListModel>, t: Throwable) {
            }
        })

=> callback ์•ˆ์— ์„ฑ๊ณต์‹œ, ์‹คํŒจ์‹œ ์ผ€์ด์Šค 2๊ฐœ

์„ฑ๊ณต ์‹œ:

override fun onResponse(call: Call<PageListModel>, response: Response<PageListModel>){
                if(response.isSuccessful){
                    binding.retrofitRecyclerView.layoutManager = LinearLayoutManager(activity)
                    binding.retrofitRecyclerView.adapter = MyAdapter(activity as Context,
                        response.body()?.articles
                    )
                }
            }

if(response.isSuccessful): ์„ฑ๊ณตํ–ˆ์œผ๋ฉด,
๋˜‘๊ฐ™์ด ํ™”๋ฉด๊ตฌ์„ฑ!

์‹คํŒจํ–ˆ์„๊ฒฝ์šฐ ๊ฐ„๋‹จํžˆ Log๋งŒ ์ฐ์–ด์คŒ.

=> retrofit: ๋ชฉ์ ๊ณผ ๋‚ด์šฉ์ด ๊ฐ™์€๋ฐ volley์— ๋น„ํ•ด ๊ฐ„๋‹จํ•˜๋‹ค. ์ด์œ ๋Š” volley๋Š” ๋ชจ๋ธ ํด๋ž˜์Šค์— ์ผ์ผ์ด ๋‹ด์•„์ค˜์•ผ๋˜๋Š”๋ฐ, ๋‹ค ์ž๋™์œผ๋กœ ํ•ด์ฃผ๋Š”๊ฒŒ converter.
์–ด๋””์— ๋‹ด์•„์ฃผ๋ฉด ๋˜๋Š”์ง€๋งŒ ์•Œ๋ ค์ฃผ๋ฉด ๋จ.

7. ์‹คํ–‰ํ•ด๋ณด์•„์š”

์˜ค..์™œ volley๋Š” ์•ˆ๋œฐ๊นŒ

ใ…Žใ…Ž ์œ„์— ์˜คํƒ€๊ฐ€ ์žˆ์—ˆ๋‹ค. ์ˆ˜์ •ํ•˜๋‹ˆ ์ž˜ ์ž‘๋™!!

์Šคํฌ๋กค๋„ ์ž˜๋œ๋‹ค!

profile
Major interest in iOS ๐Ÿ€ & ๐ŸŽ

0๊ฐœ์˜ ๋Œ“๊ธ€