[Swift] Open Weather API 사용기

YoungToMaturity·2022년 1월 13일
0

iOS

목록 보기
7/16

Angela Yu의 Udemy 강의를 듣고, 활용한 내용을 작성한 글입니다

API란?

Application Programming Interface의 줄임말로, API를 통해 외부 시스템과 상호작용할 수 있고, 소프트웨어를 만들 수 있도록 구성된 commands, functions, protocols, object의 집합체입니다. 국민 API라고 불리는 Open Weather API를 통해 특정 지역의 현재 날씨를 받아오는 작업을 진행해 보았습니다!

Networking의 순서

Step 1. Create a URL

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을 선언해주었습니다.

Step 2. Create a URLSession

앞서 생성한 URL로 URLSession을 만들어보겠습니다.

URLSession

URLSession 클래스는 URL로 표시된 엔드포인트에서 데이터를 다운로드하고 업로드 할 수 있는 환경을 제공합니다. 이 세션의 기능을 통해서 위에서 확인했던 URL의 정보들을 알맞게 가공하여 다룰 수 있습니다.
let session = URLSession(configuration: .default)을 통해서 URLSession을 생성해 주었습니다.

Step 3. Give URLSession a task

생성된 URLSession에게 step.1에서 생성한 URL을 변수로 주어, 데이터를 받아오고, 받아온 후의 데이터를 가공하도록 하겠습니다.

dataTask(with:completionHandler:)

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의 형태로 바꾸어 각 변수에 저장하도록 한 내용입니다.

Step 4. Start the task

다음의 모든 과정을 거친 이후에는 task.resume를 통해 일련의 과정을 실행하도록 하였습니다.

profile
iOS Developer

2개의 댓글

comment-user-thumbnail
2022년 2월 2일

좋은 글 잘 읽고 갑니다~

1개의 답글