Table of Contents
Kakao Map REST API 사용하기
Kakao Map REST API
를 이용하여 음식점 검색을 구현해 봅니다.
참고로, REST API 는 아이피 제한이 없습니다.
감사인사
https://youngest-programming.tistory.com/163 에 감사합니다.
1-2 주의 노가다 또는 삽질을 줄여주셨습니다.
그냥 소스 사이트 소개하고 끝낼까 하다가 갑자기 블로그 폭파되는것 아닐까 해서 공개하신 소스코드 복사해 놓습니다.
의존성 추가
dependencies {
implementation 'com.squareup.retrofit2:retrofit:2.6.4'
implementation 'com.squareup.retrofit2:converter-gson:2.6.4'
implementation 'com.squareup.retrofit2:converter-scalars:2.6.4'
implementation 'org.jetbrains:annotations:15.0'
}
6 개의 클래스 생성
public class ApiClient {
private static final String BASE_URL = "https://dapi.kakao.com/";
private static Retrofit retrofit;
public static Retrofit getApiClient(){
if(retrofit == null){
retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
}
return retrofit;
}
}
public interface ApiInterface {
// 장소이름으로 검색
@GET("v2/local/search/keyword.json")
Call<CategoryResult> getSearchLocation(
@Header("Authorization") String token,
@Query("query") String query,
@Query("category_group_code") String categoryGroupCode,
@Query("size") int size, // 1 ~ 15
@Query("page") int page, // 1 ~ 45
@Query("sort") String sort, // distance 또는 accuracy (기본값: accuracy)
@Query("x") String x,
@Query("y") String y
);
// 카테고리로 검색
@GET("v2/local/search/category.json")
Call<CategoryResult> getSearchCategory(
@Header("Authorization") String token,
@Query("category_group_code") String category_group_code,
@Query("x") String x,
@Query("y") String y,
@Query("radius") int radius
);
// 장소이름으로 특정위치기준으로 검색
@GET("v2/local/search/keyword.json")
Call<CategoryResult> getSearchLocationDetail(
@Header("Authorization") String token,
@Query("query") String query,
@Query("x") String x,
@Query("y") String y,
@Query("size") int size
);
//주소로 검색 (아직안쓰는중)
@GET("v2/local/search/address.json")
Call<CategoryResult> getSearchAddress(
@Header("Authorization") String token,
@Query("query") String query,
@Query("size") int size
);
}
public class CategoryResult implements Parcelable {
@SerializedName("meta")
@Expose
private Meta meta;
@SerializedName("documents")
@Expose
private List<Document> documents = null;
public Meta getMeta() {
return meta;
}
public void setMeta(Meta meta) {
this.meta = meta;
}
public List<Document> getDocuments() {
return documents;
}
public void setDocuments(List<Document> documents) {
this.documents = documents;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeParcelable(this.meta, flags);
dest.writeList(this.documents);
}
public CategoryResult() {
}
protected CategoryResult(Parcel in) {
this.meta = in.readParcelable(Meta.class.getClassLoader());
this.documents = new ArrayList<Document>();
in.readList(this.documents, Document.class.getClassLoader());
}
public static final Parcelable.Creator<CategoryResult> CREATOR = new Parcelable.Creator<CategoryResult>() {
@Override
public CategoryResult createFromParcel(Parcel source) {
return new CategoryResult(source);
}
@Override
public CategoryResult[] newArray(int size) {
return new CategoryResult[size];
}
};
}
public class Document implements Parcelable {
@SerializedName("place_name")
@Expose
private String placeName;
@SerializedName("distance")
@Expose
private String distance;
@SerializedName("place_url")
@Expose
private String placeUrl;
@SerializedName("category_name")
@Expose
private String categoryName;
@SerializedName("address_name")
@Expose
private String addressName;
@SerializedName("road_address_name")
@Expose
private String roadAddressName;
@SerializedName("id")
@Expose
private String id;
@SerializedName("phone")
@Expose
private String phone;
@SerializedName("category_group_code")
@Expose
private String categoryGroupCode;
@SerializedName("category_group_name")
@Expose
private String categoryGroupName;
@SerializedName("x")
@Expose
private String x;
@SerializedName("y")
@Expose
private String y;
public String getPlaceName() {
return placeName;
}
public void setPlaceName(String placeName) {
this.placeName = placeName;
}
public String getDistance() {
return distance;
}
public void setDistance(String distance) {
this.distance = distance;
}
public String getPlaceUrl() {
return placeUrl;
}
public void setPlaceUrl(String placeUrl) {
this.placeUrl = placeUrl;
}
public String getCategoryName() {
return categoryName;
}
public void setCategoryName(String categoryName) {
this.categoryName = categoryName;
}
public String getAddressName() {
return addressName;
}
public void setAddressName(String addressName) {
this.addressName = addressName;
}
public String getRoadAddressName() {
return roadAddressName;
}
public void setRoadAddressName(String roadAddressName) {
this.roadAddressName = roadAddressName;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getCategoryGroupCode() {
return categoryGroupCode;
}
public void setCategoryGroupCode(String categoryGroupCode) {
this.categoryGroupCode = categoryGroupCode;
}
public String getCategoryGroupName() {
return categoryGroupName;
}
public void setCategoryGroupName(String categoryGroupName) {
this.categoryGroupName = categoryGroupName;
}
public String getX() {
return x;
}
public void setX(String x) {
this.x = x;
}
public String getY() {
return y;
}
public void setY(String y) {
this.y = y;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(this.placeName);
dest.writeString(this.distance);
dest.writeString(this.placeUrl);
dest.writeString(this.categoryName);
dest.writeString(this.addressName);
dest.writeString(this.roadAddressName);
dest.writeString(this.id);
dest.writeString(this.phone);
dest.writeString(this.categoryGroupCode);
dest.writeString(this.categoryGroupName);
dest.writeString(this.x);
dest.writeString(this.y);
}
public Document() {
}
protected Document(Parcel in) {
this.placeName = in.readString();
this.distance = in.readString();
this.placeUrl = in.readString();
this.categoryName = in.readString();
this.addressName = in.readString();
this.roadAddressName = in.readString();
this.id = in.readString();
this.phone = in.readString();
this.categoryGroupCode = in.readString();
this.categoryGroupName = in.readString();
this.x = in.readString();
this.y = in.readString();
}
public static final Parcelable.Creator<Document> CREATOR = new Parcelable.Creator<Document>() {
@Override
public Document createFromParcel(Parcel source) {
return new Document(source);
}
@Override
public Document[] newArray(int size) {
return new Document[size];
}
};
}
public class Meta implements Parcelable {
@SerializedName("same_name")
@Expose
private SameName sameName;
@SerializedName("pageable_count")
@Expose
private Integer pageableCount;
@SerializedName("total_count")
@Expose
private Integer totalCount;
@SerializedName("is_end")
@Expose
private Boolean isEnd;
public SameName getSameName() {
return sameName;
}
public void setSameName(SameName sameName) {
this.sameName = sameName;
}
public Integer getPageableCount() {
return pageableCount;
}
public void setPageableCount(Integer pageableCount) {
this.pageableCount = pageableCount;
}
public Integer getTotalCount() {
return totalCount;
}
public void setTotalCount(Integer totalCount) {
this.totalCount = totalCount;
}
public Boolean getIsEnd() {
return isEnd;
}
public void setIsEnd(Boolean isEnd) {
this.isEnd = isEnd;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeParcelable(this.sameName, flags);
dest.writeValue(this.pageableCount);
dest.writeValue(this.totalCount);
dest.writeValue(this.isEnd);
}
public Meta() {
}
protected Meta(Parcel in) {
this.sameName = in.readParcelable(SameName.class.getClassLoader());
this.pageableCount = (Integer) in.readValue(Integer.class.getClassLoader());
this.totalCount = (Integer) in.readValue(Integer.class.getClassLoader());
this.isEnd = (Boolean) in.readValue(Boolean.class.getClassLoader());
}
public static final Creator<Meta> CREATOR = new Creator<Meta>() {
@Override
public Meta createFromParcel(Parcel source) {
return new Meta(source);
}
@Override
public Meta[] newArray(int size) {
return new Meta[size];
}
};
}
public class SameName implements Parcelable {
@SerializedName("region")
@Expose
private List<Object> region = null;
@SerializedName("keyword")
@Expose
private String keyword;
@SerializedName("selected_region")
@Expose
private String selectedRegion;
public List<Object> getRegion() {
return region;
}
public void setRegion(List<Object> region) {
this.region = region;
}
public String getKeyword() {
return keyword;
}
public void setKeyword(String keyword) {
this.keyword = keyword;
}
public String getSelectedRegion() {
return selectedRegion;
}
public void setSelectedRegion(String selectedRegion) {
this.selectedRegion = selectedRegion;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeList(this.region);
dest.writeString(this.keyword);
dest.writeString(this.selectedRegion);
}
public SameName() {
}
protected SameName(Parcel in) {
this.region = new ArrayList<Object>();
in.readList(this.region, Object.class.getClassLoader());
this.keyword = in.readString();
this.selectedRegion = in.readString();
}
public static final Creator<SameName> CREATOR = new Creator<SameName>() {
@Override
public SameName createFromParcel(Parcel source) {
return new SameName(source);
}
@Override
public SameName[] newArray(int size) {
return new SameName[size];
}
};
}
API 호출
ApiInterface apiInterface = ApiClient.getApiClient().create(ApiInterface.class);
Call<CategoryResult> call = apiInterface.getSearchLocation(
getString(R.string.restapi_key),
searchText,
"FD6", // 음식점
15,
1,
"",
"",
"");
call.enqueue(new Callback<CategoryResult>() {
@SuppressLint("NotifyDataSetChanged")
@Override
public void onResponse(@NotNull Call<CategoryResult> call, @NotNull Response<CategoryResult> response) {
if (response.isSuccessful()) {
assert response.body() != null;
adapter.clear();
for (Document document : response.body().getDocuments()) {
// Log.e("getKeyHash", document.getPlaceName());
adapter.add(document);
}
adapter.notifyDataSetChanged();
} else {
Log.e("getKeyHash 111", response.message());
}
}
@Override
public void onFailure(@NotNull Call<CategoryResult> call, @NotNull Throwable t) {
}
});
주의사항
REST API 키는 KakaoAK ebf5cef251XXXXXXXXXXXXXX
와 같이 KakaoAK
를 같이 붙여주어야 합니다.
API 호출은 어디에 작성해야 되나요? ㅜㅜ