서론
실제로 회사 업무, 프로젝트에서 Android 서비스 개발에 빠질 수 없는 API 호출에 대해 정리해보려고 한다.
API 호출에는 비동기 통신의 가장 기본인 AsyncTask부터 라이브러리인 Volley, OkHttp, Retrofit2 등 다양한 방법들이 많다.
이 중 요즘 가장 많이 사용되는 Retrofit을 활용하여 API를 호출하고, 해당 데이터를 앱에서 사용하는 방법에 대해서 알아보자❗️
Retrofit2
Retofit2은 Android 애플리케이션에서 서버와 통신하기 위한 HTTP 클라이언트 라이브러리로, Square 사에서 개발하였다.
Retrofit2는 RESTful API와 통신하기 위한 간단하고 강력한 도구를 제공하며, 개발자가 API 호출을 쉽게 관리하고 JSON 또는 XML과 같은 데이터 형식을 파싱 할 수 있도록 도와준다.
Retrofit2 특징
- 간결하고 직관적인 API 정의
Retrofit2는 API 요청을 정의하는 인터페이스를 생성할 수 있다. 인터페이스를 사용하여 어디로 어떤 요청을 보낼지 명확하게 정의할 수 있다. - HTTP 요청 및 응답 변환
Retrofit2는 기본적으로 GSON, Jackson, XML 등 다양한 데이터 변환 라이브러리를 지원한다. 이를 통해 서버에서 받은 JSON 또는 XML 데이터를 자바 객체로 변환하거나, 자바 객체를 요청 데이터로 변환할 수 있다. - 동기 및 비동기 호출
Retrofit2를 사용하여 동기 및 비동기 HTTP 호출을 모두 처리할 수 있다. 비동기 호출은 일반적으로 백그라운드 스레드에서 수행되며, 콜백 함수를 사용하여 비동기 응답을 처리할 수 있다. - 인터셉터(Interceptor) 지원
Retrofit2는 OkHttp 라이브러리를 기반으로 하므로 okHttp 인터셉터를 사용하여 요청 및 응답을 가로채고 수정할 수 있다. 이를 사용하여 헤더 추가, 로깅, 인증 등 다양한 기능 구현이 가능하다. - 오류 처리
Retrofit2는 HTTP 상태 코드와 오류 메시지를 기반으로 오류 처리를 수행할 수 있다. 오류 처리를 위한 콜백 함수를 제공하여 오류에 대한 처리를 할 수 있다. - 동적 엔드포인트 지원
동적으로 엔드포인트 URL을 변경해야 하는 경우에도 Retrofit2를 사용할 수 있다. - 다양한 HTTP 클라이언트 구현 지원
Retrofit2는 OkHttp를 기본 Http 클라이언트로 사용하지만, 다른 클라이언트 구현체를 사용하도록 변경할 수 있다.
예제
Retrofit2를 사용하기 위해서는 해당 프로젝트에 라이브러리를 추가해 주고, 인터넷 권한을 허용해줘야 한다.
API : https://jsonplaceholder.typicode.com/posts
build.gradle
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
AndroidManifest.xml
<uses-permission android:name="android.permission.INTERNET" />
데이터 형태 (JSON)
[
{
"userId": 1,
"id": 1,
"title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
"body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto"
},
{
"userId": 1,
"id": 2,
"title": "qui est esse",
"body": "est rerum tempore vitae\nsequi sint nihil reprehenderit dolor beatae ea dolores neque\nfugiat blanditiis voluptate porro vel nihil molestiae ut reiciendis\nqui aperiam non debitis possimus qui neque nisi nulla"
}
]
데이터 모델(Post)
data class Post(
val userId: Int,
val id: Int,
val title: String,
val body: String
)
Retrofit2 인터페이스 추가
import retrofit2.Call
import retrofit2.http.GET
interface ApiService {
@GET("posts/1") // API 엔드포인트를 정의, 1을 넣게되면 1개의 데이터만 가져옴
fun getPost(): Call<Post>
}
API 호출
실제 프로젝트에서는 Retorift Client를 따로 만들겠지만, 간단한 예제기 때문에 하나의 소스에 정리했다.
package com.example.ex_restapi
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.TextView
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
class MainActivity : AppCompatActivity() {
private lateinit var textId: TextView
private lateinit var textTitle: TextView
private lateinit var textBody: TextView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
textId = findViewById(R.id.textId)
textTitle = findViewById(R.id.textTitle)
textBody = findViewById(R.id.textBody)
val retrofit = Retrofit.Builder()
.baseUrl("https://jsonplaceholder.typicode.com/") // API의 기본 URL을 설정
.addConverterFactory(GsonConverterFactory.create()) // Gson 변환
.build()
val apiService = retrofit.create(ApiService::class.java)
val call = apiService.getPost()
call.enqueue(object : Callback<Post> {
override fun onResponse(call: Call<Post>, response: Response<Post>) {
if (response.isSuccessful) {
val post = response.body()
textId.text = "Id : ${post?.id}"
textTitle.text = "Title : ${post?.title}"
textBody.text = "Body: ${post?.body}"
} else {
textId.text = "API 호출 실패"
}
}
override fun onFailure(call: Call<Post>, t: Throwable) {
textId.text = "API 호출 실패: ${t.message}"
}
})
}
}
결과
마치며
오늘은 API 호출에 자주 사용되는 Retrofit2를 소개하고, 간단한 예제를 정리해 보았다.
디자인도 좀 깔끔하게 했었으면 좋았겠지만, 다음번에 다른 API 호출 예제를 정리할 때 디자인 작업도 함께 진행해보려고 한다.
사실 Retrofit2만 사용할 줄 알아도 API 통신은 가능하겠지만, 내가 처음 접할 때 Retrofit2 사용하는 것 자체가 어려웠어서 공부한다면
비동기 통신 -> AsyncTask -> Volley -> Retrofit2 이런 식으로 공부한다면 API에 대한 이해에 도움이 될 것이다.
지난번에 정리한 JSON을 활용하여 실제 API 호출 예제까지 정리해 보았고 다음번엔 API 호출에 대한 예외처리, MVVM에서의 활용 등을 정리해보려고 한다.
모두 즐코😁