이번 포스트
이번 포스트에서는 retrofit2 라이브러리를 이용하여 공공데이터 open API에서 데이터를 다운 받아보겠다.
일단 retrofit에 대해서 알아보자
https://square.github.io/retrofit/
상단의 홈페이지에 가보면 사용법과 셋팅법에 대해서 기술하고 있다.
public interface GitHubService {
@GET("users/{user}/repos")
Call<List<Repo>> listRepos(@Path("user") String user);
}
위의 예제에서는 @GET 이라는 Annotation을 이용하여 RESTful service들을 이용할 수 있으며,
@GET 뿐만 아니라 HTTP, GET, POST, PUT, PATCH, DELETE, OPTIONS, HEAD 등의 Annotation을 제공하고 있다.
또한 다양한 형태의 Converter들을 이용할 수 있는데 우리는 이중 Gson을 이용한다.
RESTful의 대한 내용은 아래의 블로그가 잘 설명해주고 있으니 참조.
https://gmlwjd9405.github.io/2018/09/21/rest-and-restful.html
지난 포스트의 내용으로 생성된 프로젝트를 컴파일하면 오류가 발생될것이다.
이유는 우리가 Gson에 대한 라이브러리를 추가해주지 않았기 때문이다.
android studio에서 프로젝트 레벨에서 app/build.gradle을 연다.
내부에 dependencies에 아래와 같은 내용을 추가해준다.
// retrofit
implementation "com.squareup.retrofit2:retrofit:2.5.0"
implementation "com.squareup.retrofit2:converter-gson:2.5.0"
추가해준 뒤, 아래에 보이는 Sync Now를 클릭해준다.
그러면 이제 이전 포스트에서 만든 오류는 사라졌을 것이다.
이제 Retrofit을 사용해보기 위해 inteface를 하나 만들어보자.
model폴더에 service라는 폴더를 만들고 OpenDataService라는 인터페이스를 만든다.
import com.antoine.easylocalpaymap.model.LocalPayPlace
import retrofit2.Call
import retrofit2.http.GET
import retrofit2.http.Headers
import retrofit2.http.Query
interface OpenDataService {
@GET("RegionMnyFacltStus")
@Headers("Content-type: application/json")
fun getPlaceList(
@Query("KEY") key: String, // 인증키
@Query("Type") type: String, // 호출 문서
@Query("pIndex") index: String, // 페이지 위치
@Query("pSize") size: String, // 페이지당 요청 숫자
@Query("SIGUN_NM") sigun: String, // 시군명
@Query("REFINE_ROADNM_ADDR") newAddr: String, // 소재지도로명주소
@Query("REFINE_LOTNO_ADDR") oldAddr: String // 소재지지번주소
) : Call<LocalPayPlace>
}
지난 포스트에서 쓰인 기본인자와 요청인자 이름으로 Query Annotation을 주고 Header는 Json 형태로 받으니 application/json으로 설정해준다.
이제 retrofit 객체를 생성해보도록 하자.
MainActivity에 가서 아래에 같이 선언해주도록 한다.
class MainActivity : AppCompatActivity() {
private lateinit var retrofit: Retrofit
private lateinit var service: OpenDataService
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
retrofit = Retrofit.Builder()
.baseUrl("https://openapi.gg.go.kr/")
.addConverterFactory(GsonConverterFactory.create())
.build()
service = retrofit.create(OpenDataService::class.java)
}
}
baseUrl의 경우는 공공데이터 open api 의 기본 주소를 써주고 Gson Converter를 사용하기에 해당 내용을 추가해준다.
그리고 우리가 만든 OpenDataService를 이용하여 서비스 객체를 생성해준다.
우리가 실제로 openAPI를 이용하려면 공공데이터포털에서 받은 인증키를 사용해줘야한다.
package com.antoine.easylocalpaymap.model
class AuthKey {
companion object{
const val KEY = "인증키"
}
}
model폴더에 위와 같이 인증키를 선언해주고 .gitignoe에 AuthKey.kt를 추가하여 다른사람이 볼수 없도록 막아주자.
안드로이드 앱에서 인터넷을 사용하기에 AndroidManifest.xml에 권한 추가를 해주자.
<uses-permission android:name="android.permission.INTERNET" />
자 이제 준비는 끝났다. 실제로 데이터를 받아보자.
MainActivity에서 우리가 선언한 service 코드 밑에 아래와 같은 코드를 추가해준다.
service = retrofit.create(OpenDataService::class.java)
// 추가
service.getPlaceList(AuthKey.KEY, "json","1","1","용인시","기흥구 죽전로","").enqueue(object : Callback<LocalPayPlace>{
override fun onFailure(call: Call<LocalPayPlace>, t: Throwable) {
// 디버그 포인트
TODO("Not yet implemented")
}
override fun onResponse(call: Call<LocalPayPlace>, response: Response<LocalPayPlace>) {
// 디버그 포인트
TODO("Not yet implemented")
}
})
데이터가 정상적으로 들어오는지 확인하기 위해 디버그 포인트라고 적은곳에 디버깅 포인트를 걸어두고 디버깅을 실행해보자.
데이터가 정상적으로 출력되는 것을 확인할 수 있다.
'프로그래밍 > Android' 카테고리의 다른 글
[Android] Wifi로 Android Device 연결하여 개발하기 (0) | 2020.09.16 |
---|---|
[Android] Ndef 읽기 쓰기 (0) | 2020.09.15 |
[Android] 경기지역화폐 지도 만들기 - 4 (0) | 2020.09.02 |
[Android] 경기지역화폐 지도 만들기 - 2 (0) | 2020.08.05 |
[Android] 경기지역화폐 지도 만들기 - 1 (0) | 2020.08.04 |