
레트로핏은 Square에서 제공하는 Party Library이다.
HTTP API통신을 돕는 라이브러리로, 쉽고 직관적인 사용법 덕분에 서버 통신을 할 때 많이 쓰이고 있다.
1.레트로핏 객체 생성
서버와 통신하기 위해서는 Retrofit객체가 필요하다.
Retrofit.Build()메서드를 통해 Retrofit객체를 생성할 수 있다.
싱글톤 패턴을 이용해서 Retrofit객체를 생성할것이다.
object RetrofitClass {
private val retrofit = Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build()
}
레트로핏 객체 하나를 만들어주면 통신이 필요할 때마다 이 객체를 끌어서 쓸 수 있다. BASE_URL에는 서버 주소를 넣어주면 되는데 val BASE_URL = "https://jsonplaceholder.typicode.com/" 이렇게 선언해서 적어주면 된다.
서버와 통신을 할때에는 거의 대부분 JSON객체를 주고 받는다. 응답 형식이 다음과 같은 JSON객체가 있다.
{
"student" : [
{
"student_id": 30410,
"name" : "홍길동",
"phone" : "010-12345-1234"
},
{
"student_id": 30411,
"name" : "고길동",
"phone" : "010-53455-1256"
},
{
"student_id": 30413,
"name" : "둘리",
"phone" : "010-35243-5345"
},
{
"student_id": 30414,
"name" : "아이유",
"phone" : "010-13352-5343"
}
]
}
따라서 코틀린에서는 다음과 같이 표현할 수 있다.
data class exampleResponse(
val student: List<Student>
)
data class Student(
val studentId: Int,
val name: String,
val phone: String
)
레트로핏 통신 시 서버에 정의되어있는 변수명과 데이터 클래스에서 정의한 변수명이 같아야 한다. 하지만 다를경우에는 @SerializedName을 사용하면 된다.
data class ExampleResponse(
val student: List<Student>
)
data class Student(
@SerializedName("student_id")
val studentId: Int,
val name: String,
val phone: String
)
SerializedName 어노테이션을 사용하면 studentId를 student_id로 명시할 수 있다.
서버와 통신하기 위해서는 Retrofit객체가 구현할 API Interface가 필요하다.
예를 들어 학교 아이디와 학년, 반을 쿼리로 받아 그에 해당하는 학생들을 배열에 담아 응답하는 GET Api이다.
interface ExampleInterface {
@GET("student")
fun getStudent(@Query("school_id") schoolId: Int,
@Query("grade") grade: Int,
@Qeury("classroom") classroom: Int): Call<ExampleResponse>
}
이런 식으로 작성 가능하다.
getStudent메소드는 school_id, grade, classroom를 파라미터로 받고 Call객체를 리턴하는 함수이다.
통신을 할때는 비동기처리를 해야하기 때문에 Retrofit2에서 제공하는 Call객체를 사용해 Callback을 구현할 수 있다.
이제 이 api interface를 구현했으면 위에 구현한 Retrofit객체를 통해 api를 사용할 수 있다.
object RetrofitClass {
private val retrofit = Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build()
private val _api = retrofit.create(ExampleInterface::class.java)
val api
get() = api
}
Retrofit객체와 api를 모두 구현했기 때문에 이제 서버와 통신이 가능하다.
val schoolId = 10102
val grade = 2
val classroom = 4
val callGetStudent = RetrofitClass.api.getStudent(schoolId, grade, classroom)
callGetStudent.enqueue(object : Callback<ExampleResponse> {
override fun onResponse(call: Call<ExampleResponse>, response: Response<ExampleResponse>) {
if(response.isSuccessful()) { // <--> response.code == 200
// 성공 처리
//ex)
Toast.makeText(this, "${response.body().student.size}", Toast.LENGTH_SHORT).show()
} else { // code == 400
// 실패 처리
}
}
override fun onFailure() { // code == 500
// 실패 처리
}
}
넘겨줄 파라미터들을 val형식으로 선언해주고 callGetStudent를 만들어서 위에서 구현한 Retrofit객체와 인터페이스를 활용해서 파라미터들을 넘겨준다.
그 다음 callGetStudent를 이용해서 onResponse와 onFailure메소드를 구현해주는데, 서버와의 통신이 성공하면 onResponse가 호출되고, 실패하면 onFailure가 호출된다.