Angela Yu의 Udemy 강의를 듣고, 활용한 내용을 작성한 글입니다
Application Programming Interface의 줄임말로, API를 통해 외부 시스템과 상호작용할 수 있고, 소프트웨어를 만들 수 있도록 구성된 commands, functions, protocols, object의 집합체입니다. 국민 API라고 불리는 Open Weather API를 통해 특정 지역의 현재 날씨를 받아오는 작업을 진행해 보았습니다!
URL을 생성하기 위해서는 API Key가 필요합니다. 이 key를 얻기 위해서는 open weather API의 경우에는 회원가입이 필요하기 때문에 회원가입을 진행한 후, API Key를 확인할 수 있습니다!
이후 current weather를 확인할 수 있는 Open Weather Document에서 https://api.openweathermap.org/data/2.5/weather?appid=(나의 API key)&units=metric&q=jeju&lang=kr
를 통해 제주도의 현재 날씨를 확인할 수 있었습니다.
이대로는 사용자들이 알아보기 어렵지만, 날씨 정보가 있기 때문에 이 주소를 값으로 갖는 String 변수 url을 선언해주었습니다.
앞서 생성한 URL로 URLSession을 만들어보겠습니다.
URLSession
클래스는 URL로 표시된 엔드포인트에서 데이터를 다운로드하고 업로드 할 수 있는 환경을 제공합니다. 이 세션의 기능을 통해서 위에서 확인했던 URL의 정보들을 알맞게 가공하여 다룰 수 있습니다.
let session = URLSession(configuration: .default)
을 통해서 URLSession을 생성해 주었습니다.
생성된 URLSession에게 step.1에서 생성한 URL을 변수로 주어, 데이터를 받아오고, 받아온 후의 데이터를 가공하도록 하겠습니다.
URL을 받는 with
와 URL에서 데이터를 받은 후 진행되는 처리를 함수 혹은 클로저로 받는 completionHandler
를 인자로 갖는 dataTask
함수를 통해 진행해 보았습니다.
completionHandler
로 받을 수 있는 함수/클로저는 data: response: error:
를 인자로 갖습니다.
let task = session.dataTask(with: url, completionHandler: handle(data: response: error: ))
func handle(data: Data?, response: URLResponse?, error: Error?) {
if error != nil {
delegate?.didFailWithError(error: error!)
return
}
if let safeData = data {
if let weather = parseJSON(weatherData: safeData) {
delegate?.updateUI(self, model: weather)
}
}
}
func parseJSON(weatherData: Data) -> WeatherModel? {
let decoder = JSONDecoder()
do {
let decodedData = try decoder.decode(WeatherData.self , from: weatherData)
let temp = String(format: "%.0f", round(decodedData.main.temp))
let humidity = String(decodedData.main.humidity)
let id = decodedData.weather[0].id
let condition = decodedData.weather[0].description
let wind = String(decodedData.wind.speed)
let cloud = String(decodedData.clouds.all)
let weather = WeatherModel(temp: temp, humidity: humidity, conditionImage: getConditionImg(code: id), condition: condition, wind: wind, cloud: cloud)
return weather
} catch {
delegate?.didFailWithError(error: error)
return nil
}
}
위 코드는 정상적으로 URL에서 데이터를 받아온 경우, JSON 형태로 받은 데이터를 JSONDecoder()
를 통해 String의 형태로 바꾸어 각 변수에 저장하도록 한 내용입니다.
다음의 모든 과정을 거친 이후에는 task.resume
를 통해 일련의 과정을 실행하도록 하였습니다.
좋은 글 잘 읽고 갑니다~