Mocky 로 가상 API를 만들어서 호텔 정보를 저장 하고 Retrofit2 를 사용해서 API 서버에 있는 호텔 정보를 가져온 후, 마커를 표시하는 기능을 구현 했다.
Mocky 바로가기
Mocky 사이트에서 new Mock 으로 들어가서 Body 부분에 다음과 같이 json 형식으로 코드를 작성했다.
{
"items": [
{
"id" : 1,
"title" : "강남역!! 최저가!! 레지던스!!",
"price" : "180,000원",
"lat" : 37.5037987,
"lng" : 127.0414695,
"imgUrl" : "https://i.picsum.photos/id/1038/200/200.jpg?hmac=H5HUzcu1mnVoapNKQB4L0bitWDrUhwiYuke8QItf9ng"
},
{
"id" : 2,
"title" : "강남역!! 위치 초 근접",
"price" : "160,000원",
"lat" : 37.5033639,
"lng" : 127.0238653,
"imgUrl" : "https://i.picsum.photos/id/191/200/200.jpg?hmac=0yPY5OQGEF0XPPEkx05efIdXkcK3lfiDZgl-babckVM"
},
{
"id" : 3,
"title" : "반포한강공원의 자전거 도로와 무지개 분수 쇼",
"price" : "120,000원",
"lat" : 37.5074217,
"lng" : 127.0047459,
"imgUrl" : "https://i.picsum.photos/id/576/200/200.jpg?hmac=pkNsIvSErgVpup1XYfj_NAE5ySK9YL7DmYlGGTTjScw"
},
{
"id" : 4,
"title" : "옥상 정원이 있는 고급 아파트먼트 호텔",
"price" : "150,000원",
"lat" : 37.4965888,
"lng" : 127.0205764,
"imgUrl" : "https://i.picsum.photos/id/610/200/200.jpg?hmac=6qOvp5zik0MBH2bc7jzgth7yzkY8IlZXay0WCNF20DM"
},
{
"id" : 5,
"title" : "레스토랑과 수영장이 있는 고급 호텔",
"price" : "200,000원",
"lat" : 37.4862074,
"lng" : 127.0326637,
"imgUrl" : "https://i.picsum.photos/id/191/200/200.jpg?hmac=0yPY5OQGEF0XPPEkx05efIdXkcK3lfiDZgl-babckVM"
}
]
}
위도와 경도는 Google Map에서 가져왔다.
이미지 url 은 Lorem Picsum 에서 200x200 짜리 랜덤 이미지를 생성해서 넣어줬다.
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
json 코드에 items 라는 이름으로 리스트 안에 호텔 정보를 저장했기 때문에 DTO(Data Transfer Object)가 필요하다.
data class HouseDto(
val items: List<HouseModel>
)
호텔 정보를 저장할 HouseModel
data class HouseModel(
val id: Int,
val title: String,
val price: String,
val lat: Double,
val lng: Double,
val imageUrl: String
)
서버로부터 데이터를 가져오는 요청을 하기 위해서 @GET Request 메소드를 작성했다.
GET의 url 로는 위에서 생성한 가상 API url에서https://run.mocky.io의 뒷 부분을 넣어주면 된다.
import retrofit2.Call
import retrofit2.http.GET
interface HouseService {
@GET("/v3/cf5878e5-19b6-4221-b374-16cbb8f2bb42")
fun getHouseList(): Call<HouseDto>
}
private fun getHouseListFromAPI(){
val retrofit = Retrofit.Builder()
.baseUrl("https://run.mocky.io")
.addConverterFactory(GsonConverterFactory.create())
.build()
retrofit.create(HouseService::class.java).also {
it.getHouseList()
.enqueue(object: Callback<HouseDto>{
override fun onResponse(call: Call<HouseDto>, response: Response<HouseDto>) {
if(!response.isSuccessful){
// 실패 처리
return
}
response.body()?.let { dto ->
updateMarker(dto.items)
}
}
override fun onFailure(call: Call<HouseDto>, t: Throwable) {
// 실패 처리
}
})
}
}
private fun updateMarker(houses: List<HouseModel>){
houses.forEach { house ->
val marker = Marker()
marker.position = LatLng(house.lat, house.lng)
// todo 마커 클릭 리스너
marker.map = naverMap
marker.tag = house.id
marker.icon = MarkerIcons.BLACK
marker.iconTintColor = Color.RED
}
}
<uses-permission android:name="android.permission.INTERNET"/>
서버로 부터 가져오기 위해서 인터넷 권한을 manifest 에 명시해줘야한다.