[android][kotlin] 레트로핏을 이용한 http통신

손채윤·2023년 12월 4일
post-thumbnail

레트로핏이란?

레트로핏은 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로 명시할 수 있다.

API인터페이스 정의

서버와 통신하기 위해서는 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가 호출된다.

0개의 댓글