현재 경우의 술(RandomSoju)이라는 프로젝트를 출시를 목표로 진행중입니다. 앱을 실행하면 홈화면에 현재위치를 표시한 지도가 표시되며, 현재 위치를 기준으로 주변 술집들의 정보를 불러와 랜덤으로 추천해주는 앱입니다.
이때, 지도는 naver map을 사용중이며, 주변술집들의 리스트를 "술집"이라는 키워드로 불러오는 kakao의 RestAPI를 활용중입니다.
그래서 오늘은 kakaoRestAPI 적용기를 기록해보려고 합니다.
아래의 kakao developer 홈페이지에서 RestAPI 사용 신청은 완료했다는 전제하에 진행하겠습니다.
Kakao Developers
카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.
developers.kakao.com
이곳에 키워드로 restAPI를 호출하는 방법이 예시와 함께 설명 되어있습니다.
https://developers.kakao.com/docs/latest/ko/local/dev-guide#search-by-keyword
Kakao Developers
카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.
developers.kakao.com
kakao의 restAPI를 호출함에 있어 필요한 것은 header 부분에 RestAPI키를 담아주고 parameter부분에 현재 위치의 x값, y값, page, radius, keyword를 담아주면 됩니다. 이때, radius값에 대한 올바른 응답을 받기위해서는 반드시 x,y 값을 parameter부분에 전달하여야 합니다.
//PlaceModel.swift
struct Document: Codable {
let placeName, distance: String?
let x: String?, y: String?
enum CodingKeys: String, CodingKey {
case placeName = "place_name"
case distance
case x, y
}
}
//KakaoAPIViewModel.swift
import Alamofire
import SwiftyJSON
class KakaoAPIViewModel {
.
.
.
func getPlaceWithKeyword(x: String, y: String, radius: Int, page:Int, keyword: String, completion: @escaping(Result<PlaceResponse, AFError>) -> Void) {
let headers: HTTPHeaders = ["Authorization": ${YOUR_RESTAPI_KEY},
"content-type": "application/json;charset=UTF-8"]
let parameters: [String: Any] = ["y": y,
"x": x,
"radius": radius,
"page": page,
"query": keyword]
let url = "https://dapi.kakao.com/v2/local/search/keyword.json"
AF.request(url,
method: .get,
parameters: parameters,
headers: headers)
.responseDecodable(of: PlaceResponse.self) { response in
switch response.result {
case .success(let data):
completion(.success(data))
case .failure(let error):
completion(.failure(error))
}
}
}
}
라이브러리로는 Alamofire 와 SwiftyJSON을 사용하였습니다.
HTTP 요청의 헤더와 매개변수를 설정한 후, Alamofire의 request함수를 호출하여 요청을 보냅니다.
이후 responseDecodable 함수를 호출하여 응답을 PlaceResponse 타입으로 디코딩하고, 요청결과에 따라 성공 또는 실패의 결과를 completion 클로저에 전달하는 방식으로 작성하였습니다.
@escaping키워드를 사용하여 completion을 전달하게 되면 API를 호출하여 응답을 받은이후의 작업을 수월하게 진행할 수 있습니다.
예를 들어 응답결과를 원하는 기준에 맞게 정렬, 필터링하고 결과를 UITableView나 UICollectionView를 통해 보여주려고 한다면 reload시키는 작업등을 수행할 수 있습니다.