📌 Intro
이전 글에서는 POST를 적용해본 내용에 대해 정리했다. 안드로이드에서 서버로 영상을 전송한 뒤 서버에서 영상처리를 진행하고 결과를 다시 조회할 수 있는 기능을 만들었다. 그래서 GET을 통해 서버에 올라가있는 영상을 받아오는 방법에 대해 정리하려고 한다.
📌 Permission
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
서버와 통신하기 위해서는 INTERNET 퍼미션이 필요하고 휴대폰 내의 저장소에 접근하기 위한 퍼미션이 필요하다.
📌 Server
{
"code": "string",
"data": [
{
"thumbnailUrl": "string",
"videoName": "string",
"videoUrl": "string"
}
],
"isSuccess": true,
"message": "string"
}
GET을 사용하기 때문에 서버로 전달할 정보는 없지만 성공적으로 연결이 된 경우 반환 받는 형태는 위와 같기 때문에 알맞는 데이터 클래스를 생성해줘야 한다.
위 사진은 Postman에서 확인해본 결과다.
📌 Client API
클라이언트에서 생성한 API는 다음과 같다.
@GET("showAllVideo") // 1
fun getVideos(): Call<Data.Resource> // 2
클라이언트에서 생성한 클래스는 다음과 같다. 내용은 주석의 번호에 맞게 설명하도록 하겠다.
// 조회 시 사용하는 클래스
data class Resource( // 3
val code: String,
val data: List<VideoDto>, // 4
val isSuccess: Boolean,
val message: String
)
// 비디오 영상 관련 DTO
data class VideoDto( // 5
val videoName: String,
val videoUrl: String,
val thumbnailUrl: String
)
- GET형태로 보낼 것이고 호스트 주소가 BASE URL이후 showAllVideo 이기 때문에 이 값을 넣어준 것이다.
- 성공적인 연결 이후 서버에서 반환해주는 값의 형태에 맞는 클래스를 Call<>안에 넣어준 것이다.
- 서버에서 반환해주는 값의 형태와 같은 클래스를 만들어주었다.
- data는 videoName, videoUrl, thumbnailUrl 세개를 가지는 객체의 리스트 형태로 반환되기 때문에 이 데이터를 가지는 VideoDTO라는 데이터 클래스를 만들었다. 변수명은 서버에서 반환해주는 변수명과 일치하도록 해야한다.
- 서버에서 반환해주는 비디오에 대한 데이터가 String 3개이기 때문에 String 3개를 가지는 클래스로 만들었고, 각 변수명은 역시 서버에서 반환해주는 변수명과 일치하도록 해야한다.
📌 MainActivity.kt
object RetrofitClass {
private var BASE_URL = "서버 URL"
private val retrofit = Retrofit.Builder()
.baseUrl(this.BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build()
private val inquire = retrofit.create(Interact::class.java)
val api
get() = inquire
}
Retrofit 클래스는 여러번 생성할 필요가 없기 때문에 object를 통해 싱글톤 객체로 생성해준다. 서버 URL자리에 알맞는 서버 BASE URL을 넣어주도록 한다.
fun callGetVideos() {
val service = RetrofitClass.api.getVideos()
service.enqueue(object : Callback<Data.Resource> { // 1
override fun onResponse(
call: Call<Data.Resource>,
response: Response<Data.Resource>
) {
if (response.isSuccessful) { // 통신 성공 시
Log.d("callGetVideos", "통신 성공")
Log.d("callGetVideos", response.body()!!.data.toString())
} else { // 통신 실패 시
Log.d("callGetVideos", "통신 실패")
}
}
override fun onFailure(call: Call<Data.Resource>, t: Throwable) {
Log.d("callGetVideos", "통신 실패")
}
})
}
- 성공적인 연결 이후 서버에서 반환해주는 데이터의 형태와 같도록 미리 정의한 Resource클래스를 Call<> 안에 넣어준다. (Data.kt 파일을 만들어주고 그 안에 Resource클래스를 정의했기 때문에 Data.Resource가 된 것이다.)
📌 정리
데이터를 받아와 리사이클러뷰에 연결까지 진행하여 UI에 보여주었지만 그 뒤 내용은 간단하게 사진만 첨부하고 정확한 내용에 대해 작성하지 않으려고 한다.
- 변수명을 일치시켜야 하는 점
- data에 여러 값이 한번에 반환된다면 클래스를 만들어주고 클래스 멤버 변수의 이름을 서버에서 반환해주는 값과 일치시켜야 한다는 점
POST를 사용하면서도 그랬지만 GET을 사용하면서도 어려웠던 부분들에 대해 직접 기록하고 정리하면서 내용을 다시 상기할 수 있었다. 이후에 나에게 도움이 되기를