본문 바로가기

Android Library

[Android Library] Retrofit (1) - 서버와 통신

 

안녕하세요.

안드로이드 라이브러리 중 하나인 Retrofit에 대해 알아보겠습니다.


Retrofit

MVVM 디자인 패턴에서 Data Layer에 보면 2가지 라이브러리가 보입니다.

  • Room
  • Retrofit

Room은 내부 DB에서 데이터를 가져올 때 사용하는 라이브러리이고,

Retrofit은 서버와 HTTP 통신을 통해 데이터를 가져오는 라이브러리 입니다.


비교

안드로이드 앱에서 네트워크 통신을 위한 라이브러리로 구글에서 만든 Volley가 있습니다.

하지만 개발할 때는 Retrofit을 더 많이 사용하는데 아래와 같은 장점이 있기 때문입니다.

  1. RESTfull API 통신
    • Retrofit은 주로 RESTfull API 통신을 위해 설계되었습니다.
    • Volley는 이미지 로딩, 캐시 관리 등 다른 네트워크 작업에 사용됩니다.
  2. Type Safety
    • 코틀린과 같이 사용해 타입 안정성을 제공합니다.
  3. Converter Support
    • 다양한 데이터 형식을 변환할 수 있는 컨버터를 지원합니다.
    • ex) JSON, XML 등
  4. Community Support
    • Retrofit은 Square 사에서 개발하고, 안드로이드 개발자 사이에서 널리 사용되고 있습니다.
    • Volley는 구글에서 개발했었지만, 현재는 더 이상 개발이 진행되지 않고 있습니다.

구조

  1. App에서 통신용 함수를 담은 인터페이스를 Retrofit에게 전달합니다.
  2. Retrofit은 인터페이스 정보를 보고 실제 통신할 때 필요한 코드를 담은 서비스 객체를 만듭니다.
  3. 서비스의 통신용 함수를 호출해 Call 객체를 반환합니다.
  4. Call 객체의 enqueue() 함수를 호출하는 순간 통신을 수행합니다.

권한 설정

build.gradle (App 수준)

Gson Converter는 json 데이터 ↔ 자바 객체 변환하는 역할을 합니다.

// Retrofit
implementation "com.squareup.retrofit2:retrofit:2.9.0"

// Gson Converter
implementation "com.squareup.retrofit2:converter-gson:2.9.0"

 

Manifest.xml

// 인터넷 사용을 위해
<uses-permission android:name="android.permission.INTERNET" />

<application 
			...
			// https 뿐만 아니라 http 사이트에도 접근하기 위해
			android:usesCleartextTraffic="true">

모델 클래스

서버와 주고받는 데이터를 표현하는 클래스 입니다.

 

내가 들고올 json 데이터를 보고 작성하면 됩니다.

(https://jsonplaceholder.typicode.com/ 이 사이트에서 가져와보겠습니다)

사이트 뒤에 posts를 붙이면 json 형태의 데이터를 볼 수 있습니다.

 

여기에 맞춰서 클래스를 작성하면 됩니다.

data class Post(
    val userId : String,
    val id : Int,
    val title : String,
    val body : String
)

 

json 데이터의 키와 변수명을 똑같이 하면 알아서 매칭이 됩니다.

 

다른 변수명을 사용하고 싶으면 @SerializedName을 사용하면 됩니다.

data class Post(
    val userId : String,
    val id : Int,
    val title : String,
    @SerializedName("body")
    val content : String
)

서비스 인터페이스

App에서 Retrofit으로 넘겨줄 인터페이스를 작성합니다.

 

인터페이스이므로 함수 선언만 해주면 됩니다.

짜여진 함수를 토대로 Retrofit이 알아서 구현을 구체화시켜줍니다.

interface RetrofitAPI {
    @GET("/posts")
    fun getData(@Query("userId") id : String) : Call<List<Post>>
}

어노테이션

@GET

HTTP GET 메서드를 나타냅니다.

주어진 경로에 대한 정보를 가져옵니다.

@GET("/posts/{id}")
suspend fun getPost(@Path("id") userId: String): Call<User>

 

@POST

HTTP POST 메서드를 나타냅니다.

주어진 경로에 대해 데이터를 전송합니다.

@POST("/posts")
suspend fun createPost(@Body post: Post): Call<Post>

 

@PUT

HTTP PUT 메서드를 나타냅니다.

주어진 경로에 대해 데이터를 업데이트 합니다.

@PUT("/posts/{id}")
suspend fun updatePost(@Path("id") userId: String, @Body user: User): Call<User>

 

@DELETE

HTTP DELETE 메서드를 나타냅니다.

주어진 경로의 리소스를 삭제합니다.

@DELETE("/posts/{id}")
suspend fun deletePost(@Path("id") id: Int, @Body post: Post): Call<Void>

 

@Path

URL 경로에 변수를 동적으로 추가합니다.

@GET("/posts/{id}")
suspend fun getPost(@Path("id") userId: String): Call<User>

 

@Query

쿼리 매개변수를 추가합니다.

@GET("/posts")
suspend fun getData(@Query("userId") id : String) : Call<List<Post>>

통신 수행

서버와 통신이 필요한 부분에 작성해줍니다.

 

Retrofit 객체 생성

val retrofit = Retrofit.Builder()
            .baseUrl("https://jsonplaceholder.typicode.com/")
            .addConverterFactory(GsonConverterFactory.create())
            .build()

 

서비스 객체 얻기

val retrofitAPI = retrofit.create(RetrofitAPI::class.java)

 

네트워크 통신 시도

userId가 1인 post를 가져와보겠습니다.

post가 여러 개이므로 List<Post> 형식으로 데이터를 받아옵니다.

 

네트워크를 통해 데이터를 가져오는 작업은 오래 걸릴 수 있기 때문에 코루틴과 함께 쓰이는 것이 일반적입니다.

(이에 관한 내용은 다음 포스팅에서 다루겠습니다)

val call = retrofitAPI.getData("1")
call.enqueue(object : retrofit2.Callback<List<Post>> {
    override fun onResponse(call: Call<List<Post>>, response: retrofit2.Response<List<Post>>) {
        if (response.isSuccessful) {
            val data = response.body()
            binding.rvPost.adapter = PostAdapter(data as ArrayList<Post>)
            binding.rvPost.layoutManager = LinearLayoutManager(applicationContext)
        } else {
            // 요청 실패 처리
            Log.d(TAG, "Request failed")
        }
    }

    override fun onFailure(call: Call<List<Post>>, t: Throwable) {
        // 네트워크 오류 처리
        Log.d(TAG, "Network error : ${t.message}")
    }
})

결과

가져온 데이터를 RecyclerView와 CardView를 사용해 나타내보았습니다.

 

총 10개의 Post를 가져온 것을 확인할 수 있습니다.


Reference

[안드로이드] HTTP 통신을 위한 Retrofit 라이브러리

 

[안드로이드] HTTP 통신을 위한 Retrofit 라이브러리

안드로이드 - Retrofit 라이브러리를 사용한 HTTP 통신

velog.io

 

[Android] [Java] retrofit 이란, retrofit을 사용하여 서버와 통신하기(예제포함)

 

[Android] [Java] retrofit 이란, retrofit을 사용하여 서버와 통신하기(예제포함)

안녕하세요~ 여러분 오늘은 retrofit 이란 걸 사용하여 서버와 통신을 해보겠습니다. 먼저 retrofit이 무었인지와 왜 써야 하는지에 대해 알아보겠습니다. https://square.github.io/retrofit/ Retrofit A type-safe H

dotiromoook.tistory.com