์๋ ํ์ธ์ Foma ์ ๋๋ค!
์ค๋์ ๋ค์ด๋ฒ ํด๋ผ์ฐ๋ ํ๋ซํผ์ ์๋ Geocoding ์ ์ด์ฉํด์ ์ํ๋ ์ฃผ์์ ์๋,๊ฒฝ๋๊ฐ์ ๋ฐ์์ฌ๊ฑฐ์์!
์ ํ์์ ์ ๊ณตํ๋ ์ง์ค์ฝ๋ฉ๋ ์์ง๋ง ํ๊ตญ ์ฃผ์๋ฅผ ์ ๋ ฅํ๋ฉด ์๋ชป๋ ์ ๋ณด๊ฐ ๊ฝค ๋ง์ด ๋์ค๋๋ผ๊ตฌ์.
๊ตฌ๊ธ API๋ฅผ ์ฌ์ฉํด์ผํ๋...? ๊ณ ๋ฏผํ๋๋ฐ ๊ตฌ๊ธ์ 2๋งํ๊น์ง ๋ฌด๋ฃ๊ณ ๊ทธ ์ด์๋๋ฉด ์ ๋ฃ๋ก ์ง๋ถํด์ผ ๋๋๋ผ๊ตฌ์.
ํน์๋ ํ๊ณ ๋ค์ด๋ฒ ํด๋ผ์ฐ๋ ํ๋ซํผ ์ ๋ค์ด๊ฐ๋ดค๋๋... 300๋งํ๊น์ง ๋ฌด๋ฃ....๐
๊ณ ๋ฏผํ ๊ฑฐ ์์ด ๋ฐ๋ก ๋ค์ด๋ฒ ํด๋ผ์ฐ๋ ํ๋ซํผ ์ ์ด์ฉํ๊ธฐ๋ก ํ์ต๋๋ค.
๋ฐ๋ก ์์ํ ๊ฒ์~!!
NAVER CLOUD PLATFORM
๋ค์ด๋ฒ ํด๋ผ์ฐ๋ ํ๋ซํผ์ผ๋ก ์ด๋ํด์ฃผ์ธ์!
์ค๋ฅธ์ชฝ ์๋จ์ ๋ณด์๋ฉด ๋ก๊ทธ์ธ์ด ์์๊ฑฐ์์.(์ ๋ ๋ก๊ทธ์ธํ ์ํ๋ผ ๋ก๊ทธ์์์ผ๋ก ๋ณด์ ๋๋ค.)
์ฌ๊ธฐ์ ๋ค์ด๋ฒ ํด๋ผ์ฐ๋ ํ๋ซํผ ์ ์ฉ ์์ด๋๋ฅผ ํ์๊ฐ์ ํด์ค๋๋ค.
ํ์๊ฐ์ ์ ๋ง์น์ จ์ผ๋ฉด ๋ก๊ทธ์์ ๋ฐ๋ก ์๋์ชฝ์ Console ์ด๋ผ๊ณ ์๋๋ฐ์. ์ฌ๊ธฐ๋ฅผ ํด๋ฆญํด์ ๋ค์ด๊ฐ์ฃผ์ธ์.
๋ค์ด๊ฐ์๋ฉด ์ผ์ชฝ์ AI-NAVER API๋ฅผ ํด๋ฆญํ์๋ฉด Application์ด ๋์ฌํ ๋ฐ ๋๋ฌ์ฃผ์ธ์!
๊ทธ๋ฌ๋ฉด ์๋์ ๊ฐ์ ํ๋ฉด์ด ๋์ฌํ ๋ฐ + Application ๋ฑ๋ก์ ๋๋ฌ์ฃผ์ธ์!
์๋์ ๊ฐ์ด ์ ๋ง ๋ง์ API๊ฐ ์์ด์.
์ด ์ค์์ ์ฐ๋ฆฌ๋ Maps์ Geocoding์ ๋๋ฌ์ค๋๋ค.
๊ทธ๋ฆฌ๊ณ ์๋์ iOS Bundle์ ํ๋ก์ ํธ ๋ฒ๋ค์ด๋ฆ์ ๋ฃ์ด์ฃผ์ธ์! (+์ถ๊ฐ ๋ฒํผ์ ๋๋ฅด์ ์ผ ์ถ๊ฐ๋ฉ๋๋ค.)
๊ทธ๋ฆฌ๊ณ ๋ฑ๋ก๋ฒํผ์ ๋๋ฅด๋ฉด ์๋์ ๊ฐ์ด Geocoding ์๋น์ค๋ฅผ ์ฌ์ฉํ ์ ์๋ ์ฑ์ด ๋์ต๋๋ค.
์ ์ฌ์ง์์ App ์ด๋ฆ ์๋ ์ธ์ฆ ์ ๋ณด๋ผ๊ณ ์๋๋ฐ์.
์ด๊ฑธ ํด๋ฆญํ๋ฉด Client ID์ Client Secret์ด ๋์ต๋๋ค.
API ์ด์ฉ์ ํ์ํ๋ ๋ฐ๋์ ์ด๋์ ์ ์ฅํด๋์ธ์!
์ด์ ๋ณธ๊ฒฉ์ ์ผ๋ก geocode ์ค๋ช ์๋ฅผ ๋ณด๋ฉด ์์ฒญ์ ์๋์ ๊ฐ์ด ํ๋ค๊ณ ๋์์์ด์.
์ ํํ ๋ ์ต์ํ์ง ์์์ ๋ฌด์จ ๋ง์ธ์ง ๋ชจ๋ฅด๊ฒ ๋๋ผ๊ตฌ์.... ์๊น ์ ์ฅํด๋์ ํด๋ผ์ด์ธํธ ์์ด๋ํ๊ณ ์ํฌ๋ฆฟ์ด ํ์ํ๊ฑฐ ๊ฐ์๋ฐ...
-data-urlencode ๋ ๋ญ๊ณ ... -H๋ ๋ญ์ผ... ์ด๋ค์์ผ๋ก ๋ฃ์ด์ผํด....
curl -G "https://naveropenapi.apigw.ntruss.com/map-geocode/v2/geocode" \
--data-urlencode "query={์ฃผ์}" \
--data-urlencode "coordinate={๊ฒ์_์ค์ฌ_์ขํ}" \
-H "X-NCP-APIGW-API-KEY-ID: {์ ํ๋ฆฌ์ผ์ด์
๋ฑ๋ก ์ ๋ฐ๊ธ๋ฐ์ client id๊ฐ}" \
-H "X-NCP-APIGW-API-KEY: {์ ํ๋ฆฌ์ผ์ด์
๋ฑ๋ก ์ ๋ฐ๊ธ๋ฐ์ client secret๊ฐ}" -v
๋ญ ์ด๋ฐ์์ผ๋ก ์์ฒญํ๋ฉด ์๋์ ๊ฐ์ด JSON ํํ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ์ ์๋ค๊ณ ํ๋ค์!
{
"status": "OK",
"meta": {
"totalCount": 1,
"page": 1,
"count": 1
},
"addresses": [
{
"roadAddress": "๊ฒฝ๊ธฐ๋ ์ฑ๋จ์ ๋ถ๋น๊ตฌ ๋ถ์ ๋ก 6 ๊ทธ๋ฆฐํฉํ ๋ฆฌ",
"jibunAddress": "๊ฒฝ๊ธฐ๋ ์ฑ๋จ์ ๋ถ๋น๊ตฌ ์ ์๋ 178-1 ๊ทธ๋ฆฐํฉํ ๋ฆฌ",
"englishAddress": "6, Buljeong-ro, Bundang-gu, Seongnam-si, Gyeonggi-do, Republic of Korea",
"addressElements": [
{
"types": [
"POSTAL_CODE"
],
"longName": "13561",
"shortName": "",
"code": ""
}
],
"x": "127.10522081658463",
"y": "37.35951219616309",
"distance": 20.925857741585514
}
],
"errorMessage": ""
}
๊ตฌ์ฒด์ ์ธ ํ๋ผ๋ฏธํฐ๋ค์ ์ดํด๋ณด๊ณ ์ถ์ผ์ ๋ถ๋ค์
์๋ geocode ์ค๋ช ์๋ก ์ด๋ํ์ ์ ํ์ธํด์ฃผ์ธ์!
Xcode
์ ์ด์ ๋ณธ๊ฒฉ์ ์ผ๋ก ํ๋ก์ ํธ๋ก ์ด๋ํด์ ์ฝ๋๋ฅผ ์ธํ ํด๋ด ์๋ค!
๋จผ์ ์ ๋ ๋คํธ์ํฌ ํต์ ์ ํ๊ธฐ ์ํด Alamofire๋ผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ JSON์ ํ์ฑํ๊ธฐ ์ํด SwiftyJSON์ด๋ผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ต๋๋ค.
podํ์ผ์ ์๋์ ๊ฐ์ด ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ถ๊ฐํด์ฃผ์ธ์! (๋ฒ์ ์ ๋ค๋ฅผ์๋ ์์ผ๋ ํ์ธํด์ฃผ์ธ์)
pod 'Alamofire', '~> 5.2'
pod 'SwiftyJSON', '~> 4.0'
ViewController
๋ทฐ์ปจํธ๋กค๋ฌ๋ก ์ด๋ํด์ ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ import ํด์ค๋๋ค.
import Alamofire
import SwiftyJSON
๊ฐ์ฅ ๋จผ์ ๋ค์ด๋ฒ API ๋ณ์๋ค์ ์ธํ ํด์ค๊ฑฐ์์.
์์์ ์ ์ฅํด์ค ๋ค์ด๋ฒ ํด๋ผ์ด์ธํธ ์์ด๋์ ์ํฌ๋ฆฟ ๊ทธ๋ฆฌ๊ณ ์ง์ค์ฝ๋ url์ ์ธํ ํด์ค๋๋ค.
let NAVER_CLIENT_ID = "๋ค์ด๋ฒ ํด๋ผ์ด์ธํธ ์์ด๋"
let NAVER_CLIENT_SECRET = "๋ค์ด๋ฒ ํด๋ผ์ด์ธํธ ์ํฌ๋ฆฟ"
let NAVER_GEOCODE_URL = "https://naveropenapi.apigw.ntruss.com/map-geocode/v2/geocode?query="
๊ทธ๋ฆฌ๊ณ ์ํ๋ ์ฃผ์๋ฅผ ๋ง๋ค์ด์ฃผ๊ณ ๊ทธ ์ฃผ์๋ฅผ encodingํ ์ฃผ์๋ฅผ ๋ง๋ค์ด์ค๋๋ค.
let ํ๋์
๊ตฌ์ญ = "์์ธ์ ๋งํฌ๊ตฌ ๋๊ต๋"
let encodeAddress = ํ๋์
๊ตฌ์ญ.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)!
๋ค์ด๋ฒ ํด๋ผ์ด์ธํธ ์์ด๋์ ๋ค์ด๋ฒ ํด๋ผ์ด์ธํธ ์ํฌ๋ฆฟ์ HTTPHeader๋ก ๊ฐ๊ฐ ๋ง๋ค์ด์ฃผ๊ณ
HTTPHeaders์์ ๋ ํค๋๋ฅผ ๋ฐฐ์ด์ ๋ด์ ๋ฃ์ด์ฃผ์ธ์.
override func viewDidLoad() {
super.viewDidLoad()
let header1 = HTTPHeader(name: "X-NCP-APIGW-API-KEY-ID", value: NAVER_CLIENT_ID)
let header2 = HTTPHeader(name: "X-NCP-APIGW-API-KEY", value: NAVER_CLIENT_SECRET)
let headers = HTTPHeaders([header1,header2])
...
๊ทธ ์๋์ Alamofire๋ฅผ ์ฌ์ฉํด์ ๋ค์ด๋ฒ ์ง์ค์ฝ๋ url์ encodeํ ์ฃผ์๋ฅผ ํฉ์ณ์ ๋ฃ์ด์ฃผ๊ณ method ๋ GET๋ฐฉ์์ผ๋ก
headers์ ์์์ ๋ง๋ค์ด์ค headers๋ฅผ ๋ฃ์ด์ค ๋ค JSON ๋ฐฉ์์ผ๋ก ์๋ต ์์ฒญ์ ๋ณด๋ ๋๋ค.
๊ฒฐ๊ณผ๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์๋ค๋ฉด JSON์ผ๋ก ์จ ๊ฒฐ๊ณผ๋ฅผ SwiftyJSON ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด์ ๋์ ๋๋ฆฌ ํํ๋ก ๋ฐ๊ฟ์ค๋๋ค.
์ JSON ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด addresses ์ ํฐ ๋ฌถ์ ์์ ์๋๋ x๋ก ๊ฒฝ๋๋ y๋ก ๋์ด์์ต๋๋ค.
๊ณ ๋ก data๋ฅผ json["addresses"]๋ก ๋ฃ์ด์ค ๋ค y๋ฅผ ์๋, x๋ฅผ ๊ฒฝ๋๋ก ๊ฐ๊ฐ ์ ์ฅํด์ค๋๋ค.
AF.request(NAVER_GEOCODE_URL + encodeAddress, method: .get,headers: headers).validate()
.responseJSON { response in
switch response.result {
case .success(let value as [String:Any]):
let json = JSON(value)
let data = json["addresses"]
let lat = data[0]["y"]
let lon = data[0]["x"]
print("ํ๋์
๊ตฌ์ญ์","์๋๋",lat,"๊ฒฝ๋๋",lon)
case .failure(let error):
print(error.errorDescription ?? "")
default :
fatalError()
}
}
์ถ๋ ฅํ ๊ฒ์ ํ์ธํด๋ณด๋ฉด ์๋์ ๊ฐ์ด ์ ์ถ๋ ฅ๋๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค!
ํ๋ฒ ์ ๋๋ก ๋์๋์ง ํ์ธํด๋ด์ผ๊ฒ ์ฃ ?
Google Map
๋จผ์ ๊ตฌ๊ธ๋งต์ผ๋ก ์ด๋ํด์ฃผ์ธ์!
์์์ ๋์จ ์๋์ ๊ฒฝ๋๋ฅผ ๊ฒ์ํด์ฃผ๋ฉด
์๋์ ๊ฐ์ด ์ ํํ ํ๋์ ๊ตฌ์ญ์ ์๋์ง๋ง (์์ธ์ ๋งํฌ๊ตฌ ๋๊ต๋์ด๋ผ๊ณ ๊ฒ์ํด์ ๊ทธ๋ ์ต๋๋ค.)
ํ๋์ ๊ตฌ์ญ ๊ทผ์ฒ ์ขํ๊ฐ ์ฐํ๋๊ฑธ ๋ณผ ์ ์์ต๋๋ค !!
์ค๋์ ์ด๋ ๊ฒ ๋ค์ด๋ฒ ํด๋ผ์ฐ๋ ํ๋ซํผ์ ํ์ฉํด์ ์ฃผ์์ ์๋ ๊ฒฝ๋๋ฅผ ์์์ค๋ ๋ฒ์ ๋ํด์ ์์๋ณด์์ต๋๋ค.
ํน์๋ผ๋ ํ๋ฆฐ ๋ถ๋ถ์ด ์๊ฑฐ๋ ์ง์ ํด์ฃผ์ค ๋ถ๋ถ์ด ์๋ค๋ฉด ๋๊ธ๋ก ์๋ ค์ฃผ์ธ์!
๋๊ธ