[Kotlin] Retrofit

Boknamiยท2023๋…„ 9์›” 30์ผ
0

์ฝ”ํ‹€๋ฆฐ

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

๐Ÿค” What?

๋ ˆํŠธ๋กœํ•์€ ์•ˆ๋“œ๋กœ์ด๋“œ ์•ฑ ๊ฐœ๋ฐœ ์‹œ ๋ฐฑ์—”๋“œ์™€์˜ ํ†ต์‹ ์„ ์œ„ํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค!

๋ ˆํŠธ๋กœํ•์€ OkHttp๊ธฐ๋ฐ˜์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ๋ฐ, ์‚ฌ์‹ค์ƒ OkHttp๋งŒ ์‚ฌ์šฉํ•ด๋„ ํฐ ์–ด๋ ค์›€ ์—†์ด ๋ฐฑ์—”๋“œ์™€์˜ ํ†ต์‹ ์ด ๊ฐ€๋Šฅํ•˜๋‹ค!


๐Ÿคทโ€โ™‚๏ธ Why?

๊ทธ๋ ‡๋‹ค๋ฉด ์™œ OkHttp๋ฅผ ๋‘๊ณ  OkHttp๊ธฐ๋ฐ˜์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ Retrofit ์‚ฌ์šฉํ• ๊นŒ? ๊ทธ ์ด์œ ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค!

  • ์„ฑ๋Šฅ : 3๋ฐฐ ๊ฐ€๊นŒ์ด ์ฐจ์ด๋‚˜๋Š” ์†๋„
  • ํŽธ๋ฆฌ์„ฑ : OkHttp์—์„œ ์ง์ ‘ ์† ๋ด์ฃผ์–ด์•ผ ํ•  ๋ถ€๋ถ„๋“ค์„ Retrofit ์•ˆํ•ด๋„ ๊ดœ์ฐฎ๋‹ค!
  • ๊ฐ€๋…์„ฑ : Annotation ์‚ฌ์šฉ์œผ๋กœ ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์ด ๋›ฐ์–ด๋‚จ
public interface retropitService {
 	@Get("/get")
    Call<String>..;
}

@๋‹ค์Œ์— REST API์— ์–ด๋””์— ํ•ด๋‹นํ•˜๋Š”์ง€ ์ง๊ด€์ ์œผ๋กœ ํ™•์ธ์ด ๊ฐ€๋Šฅ!

๐Ÿ” How?

๊ธฐ๋ณธ ์„ค์ •

  • build.gradle ์ถ”๊ฐ€
  • permission Internet๊ด€๋ จ ์ถ”๊ฐ€

์ธํ„ฐํŽ˜์ด์Šค ์„ ์–ธ

๋ ˆํŠธ๋กœํ•์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์ฒซ ๋‹จ๊ณ„!
API์˜ ๊ตฌ์กฐ๋ฅผ ์ •์˜ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“ค์–ด์•ผํ•œ๋‹ค!

interface ApiService {
    @GET("getUser/{id}")
    suspend fun getPost(@Path("id") postId: Int): Response<Post>
}
  • @GET("posts/{id}")
    ์—ฌ๊ธฐ์„œ ์ผ๋‹จ @๋ถ€๋ถ„์€ ์–ด๋…ธํ…Œ์ด์…˜์ด๋ผ๊ณ  ํ•˜๋Š” ๋ถ€๋ถ„์ธ๋ฐ ์ง๊ด€์ ์œผ๋กœ ์–ด๋–ค API๋ฅผ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค!
    { } ๋ถ€๋ถ„์€ ๋‚˜์ค‘์— ํ•จ์ˆ˜๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•  ๋•Œ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌ๋˜๋Š” ๊ฐ’์„ ๋Œ€์ฒดํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค!
  • suspend fun getPost(@Path("id") postId: Int): Response

    • suspend : ์ฝ”๋ฃจํ‹ด์„ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๋™๊ธฐ์ ์œผ๋กœ ํ˜ธ์ถœ!

    • @Path("id") postId: Int : Retrofit ์ฃผ์„!
      "id"๋ผ๋Š” ๊ฒฝ๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ง€์ •ํ•˜๋ฉฐ, ํ†ต์‹ ํ•  ์—”๋“œํฌ์ธํŠธ ๊ฒฝ๋กœ์˜ {id} ๋ถ€๋ถ„์— ๋“ค์–ด๊ฐˆ ๊ฐ’์„ ๋‚˜ํƒ€๋‚ธ๋‹ค! ์ด ๊ฐ’์„ ๋ฉ”์„œ๋“œ์˜ postId ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌ

    • Response<Post>: Retrofit์—์„œ ์ œ๊ณตํ•˜๋Š” Response๋ผ๋Š” ํด๋ž˜์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค! ์ด ํด๋ž˜์Šค๋Š” ์„œ๋ฒ„์™€ ํ†ต์‹ ํ•œ HTTP ์‘๋‹ต์„ ๋‚˜ํƒ€๋‚ด๊ณ  Post๋Š” ์‘๋‹ต ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€ํ™˜ํ•˜๊ณ  ํŒŒ์‹ฑํ•˜๊ธฐ ์œ„ํ•œ Kotlin์ด ์ธ์‹ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ ํด๋ž˜์Šค!

์ธ์Šคํ„ด์Šค ์ƒ์„ฑ

์ด์ œ ์œ„์—์„œ ๋งŒ๋“ค์–ด๋‘” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‹ค์ œ ์ธ์Šคํ„ด์Šค๋กœ ๋งŒ๋“ค์–ด์•ผํ•œ๋‹ค!
๊ทธ ์ „์— Retropit์„ ์ด์šฉํ•ด createํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— retropit๋ถ€ํ„ฐ ๋จผ์ € ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ!

  • Retrofit ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค ๋•Œ APIํ†ต์‹ ์„ ํ•  ๋•Œ ๊ธฐ๋ณธ์ด ๋˜๋Š” URL์„ ์ง€์ •
  • ์„œ๋ฒ„์˜ ์‘๋‹ต ๋ฐ์ดํ„ฐ๋ฅผ Kotlin์ด ์ธ์‹ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด๋กœ ํŒŒ์‹ฑํ•˜๊ธฐ ์œ„ํ•œ ์ปจ๋ฒ„ํ„ฐ ํŒฉํ† ๋ฆฌ๋ฅผ ์ถ”๊ฐ€
  • ์ผ๋ฐ˜์ ์œผ๋กœ ์•ฑ ์ „์ฒด์— ํ•˜๋‚˜์˜ Retrofit ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค์–ด ๊ด€๋ฆฌํ•œ๋‹ค!(์‹ฑ๊ธ€ํ„ด ํŒจํ„ด์„ ์ ์šฉํ•ด ์ผ๊ด€๋˜๊ฒŒ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•จ์ด๋ผ ์ƒ๊ฐ!)
val retrofit = Retrofit.Builder()
    .baseUrl("ํ†ต์‹ ํ•  ์ฃผ์†Œ")
    .addConverterFactory(GsonConverterFactory.create())
    .build()

API ์„œ๋น„์Šค ์ƒ์„ฑ

์ด์ œ ์ •๋ง ์œ„์—์„œ ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  ์ธํ„ฐํŽ˜์ด์Šค apiService๋ฅผ ์ธ์Šคํ„ด์Šค๋กœ ๋งŒ๋“ค์ž!

val apiService = retrofit.create(ApiService::class.java)

API ํ˜ธ์ถœ

์œ„์—์„œ ๋งŒ๋“  apiService๋ฅผ ์ด์šฉํ•ด์„œ ์ด์ œ API๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค!
apiService์— ๋งŒ๋“ค์–ด๋‘์—ˆ๋˜ getPost๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ†ต์‹ ์„ ์‹œ์ž‘!
์ด ํ›„ ๋„˜์–ด์˜ค๋Š” ๋ฐ˜์‘์— ๋”ฐ๋ผ ์ฝ”๋“œ๋ฅผ ์ญ‰ ๊ตฌํ˜„ํ•˜๋ฉด ๋œ๋‹ค!

val response = apiService.getPost(1)
if (response.isSuccessful) {
    val post = response.body()
    // ์‘๋‹ต ๋ฐ›์€ ๋ฐ์ดํ„ฐ์— ๋”ฐ๋ฅธ ์ฒ˜๋ฆฌ!
} else {
    // ์—๋Ÿฌ ์ฒ˜๋ฆฌ
}

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