네이버 지도 API 활용 앱 - 3( MockAPI, Retrofit )
-
Naver Map API
-
ViewPager2
-
FrameLayout
-
CoordinatotLayout
-
BottomSheetBehavior
-
Retrofit
-
Gilde
Mocky 업로드
Picsum 사이트를 이용해 랜덤 이미지 사용
{
"items":[
{
"id": 1,
"title": "강남역!, 최저가!!, 레지던스!!",
"price": "23,000원",
"lat": 37.51387598530363,
"lng": 127.10129048872753 ,
"imgUrl":"https://i.picsum.photos/id/844/200/200.jpg?hmac=blYHTv1EUQA2puhc8O_7gTL4H6Y8FgSmVXDYEJqXWdQ"
},
{
"id": 2,
"title": "석촌역!, 최저가!!, 레지던스!!",
"price": "26,000원",
"lat": 37.50500484239669,
"lng": 127.10725003027228 ,
"imgUrl":"https://i.picsum.photos/id/442/200/200.jpg?hmac=S-yNCNr30GK97ulUYoey_Fh2-czIf7YnNgcKp7zrEoE"
}
]
}
Mocky 사이트를 이용해 위 http Response Body를 업로드
// 요청 url
https://run.mocky.io/v3/3ee74756-1b9e-4531-ab3e-fa0559eba05e
Retrofit2 종속성 추가
// 레트로핏
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
// Glide
implementation 'com.github.bumptech.glide:glide:4.13.0'
인터넷 사용 권한 추가
<!--AndroidManifest.xml-->
<uses-permission android:name="android.permission.INTERNET"/>
레트로핏 추가
- HouseModel Data Class 생성
레트로핏 통신을 통해 받아올 객체 생성
// HouseModel.kt
data class HouseModel(
val id:Int,
val title:String,
val price:String,
val imgUrl:String,
val lat:Double,
val lng:Double
)
- HouseDto 생성
Http Response Body를 보면 items로 모든 객체를 묶었기 때문에 바로 List 객체를 받을 수 없어서 Dto 클래스를 만들어 줘야함
// HouseDto.kt
data class HouseDto(
val items: List<HouseModel>
)
- HouseService 생성
통신을 담당할 인터페이스 생성
// HouseService.kt
interface HouseService {
@GET("/v3/3ee74756-1b9e-4531-ab3e-fa0559eba05e")
fun getHouseList(): Call<HouseDto>
}
- 메인 엑티비티에서 레트로핏 사용
레트로핏으로 통신 후 객체 정보를 naverMap 객체에 마커로 찍기
// MainActivity.kt
override onMapReady(map: NaverMap){
...
// 네이버 맵이 그려진 이후에 마커를 찍기 위해서 만 아래 함수 실행
getHouseFromApi()
}
private fun getHouseFromApi(){
// 레트로핏 객체 생성
val retrofit = Retrofit.Builder()
.baseUrl("https://run.mocky.io")
.addConverterFactory(GsonConverterFactory.create())
.build()
// 서비스 생성
retrofit.create(HouseService::class.java).also{ houseService->
// 통신 결과
houseService.getHouseList()
.enqueue(object : Callback<HouseDto> {
override fun onResponse(call: Call<HouseDto>, response: Response<HouseDto>) {
if(response.isSuccessful.not()){
// 실패 처리
Log.d("retrofit",response.errorBody().toString())
return
}
response.body()?.let{ houseDto ->
houseDto.items.forEach{ houseModel->
val marker = Marker()
marker.position = LatLng(houseModel.lat, houseModel.lng)
// 추후 marker.onClickListener
marker.map = naverMap
marker.tag = houseModel.id
marker.icon = MarkerIcons.BLACK
marker.iconTintColor = Color.RED
}
}
}
override fun onFailure(call: Call<HouseDto>, t: Throwable) {
// 실패 처리
Log.d("retrofit",t.message.toString())
}
})
}
}
결과 화면
