ios/기타

[iOS, Swift] 카카오 Rest API 키워드로 검색 적용

2023. 7. 24. 17:59

현재 경우의 술(RandomSoju)이라는 프로젝트를 출시를 목표로 진행중입니다. 앱을 실행하면 홈화면에 현재위치를 표시한 지도가 표시되며, 현재 위치를 기준으로 주변 술집들의 정보를 불러와 랜덤으로 추천해주는 앱입니다.

이때, 지도는 naver map을 사용중이며, 주변술집들의 리스트를 "술집"이라는 키워드로 불러오는 kakao의 RestAPI를 활용중입니다. 

그래서 오늘은 kakaoRestAPI 적용기를 기록해보려고 합니다.

아래의 kakao developer 홈페이지에서 RestAPI 사용 신청은 완료했다는 전제하에 진행하겠습니다.

https://developers.kakao.com/

 

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시키는 작업등을 수행할 수 있습니다.

 

chobo5
chobo5
개발 기록
전체
오늘
어제
chobo5
chobo5's blog
chobo5
  • 분류 전체보기
    • ios
      • 문법
      • UIKit
      • UI구현
      • 기타
    • IT
    • Java
      • 기초
      • Spring
      • JPA
    • Algorithm
    • OOP
    • SQL

블로그 메뉴

  • 홈
  • 태그
  • 방명록

인기 글

태그

  • static
  • restapi
  • Swift
  • didset
  • getter
  • property
  • setter
  • 프로퍼티
  • Lazy
  • API

최근 글

hELLO · Designed By 정상우.
chobo5
[iOS, Swift] 카카오 Rest API 키워드로 검색 적용
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.