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

MVVM 디자인 패턴에서 Data Layer에 보면 2가지 라이브러리가 보입니다.
- Room
- Retrofit
Room은 내부 DB에서 데이터를 가져올 때 사용하는 라이브러리이고,
Retrofit은 서버와 HTTP 통신을 통해 데이터를 가져오는 라이브러리 입니다.
비교
안드로이드 앱에서 네트워크 통신을 위한 라이브러리로 구글에서 만든 Volley가 있습니다.
하지만 개발할 때는 Retrofit을 더 많이 사용하는데 아래와 같은 장점이 있기 때문입니다.
- RESTfull API 통신
- Retrofit은 주로 RESTfull API 통신을 위해 설계되었습니다.
- Volley는 이미지 로딩, 캐시 관리 등 다른 네트워크 작업에 사용됩니다.
- Type Safety
- 코틀린과 같이 사용해 타입 안정성을 제공합니다.
- Converter Support
- 다양한 데이터 형식을 변환할 수 있는 컨버터를 지원합니다.
- ex) JSON, XML 등
- Community Support
- Retrofit은 Square 사에서 개발하고, 안드로이드 개발자 사이에서 널리 사용되고 있습니다.
- Volley는 구글에서 개발했었지만, 현재는 더 이상 개발이 진행되지 않고 있습니다.
구조

- App에서 통신용 함수를 담은 인터페이스를 Retrofit에게 전달합니다.
- Retrofit은 인터페이스 정보를 보고 실제 통신할 때 필요한 코드를 담은 서비스 객체를 만듭니다.
- 서비스의 통신용 함수를 호출해 Call 객체를 반환합니다.
- 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/ 이 사이트에서 가져와보겠습니다)

여기에 맞춰서 클래스를 작성하면 됩니다.
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
'Android Library' 카테고리의 다른 글
[Android Library] Retrofit (2) - retrofit in MVVM (1) | 2023.11.22 |
---|---|
[Android Library] Paging (2) - 프로젝트에 적용해보기 (1) | 2023.10.30 |
[Android Library] Paging (1) - 대규모 데이터 (0) | 2023.10.29 |
[Android Library] Hilt (3) - hilt in MVVM (0) | 2023.10.18 |
[Android Library] Hilt (2) - 기본 사용법 (2) | 2023.10.17 |