오늘은 API를 통한 데이터를 받아와 간단한 날씨 앱을 만들어보는 시간을 가졌다.
이번 앱을 만들기 위해 날씨 데이터를 요청할 수 있는 사이트는 https://openweathermap.org
라는 날씨 정보를 제공해주는 사이트이다.
여러가지 종류의 API를 제공해주는데 오늘 사용해볼 API는 2가지이다.
API를 요청하기 위한 주소로는 https://api.openweathermap.org/data/2.5/weather?lat={lat}&lon={lon}&appid={API key}
이다.
여기서 필요로 하는 부분은 위도(lat)
경도(lot)
를 나타내는 부분과 개인의 API(API key)
가 필요로 하다.
?lat={lat}&lon={lon}&appid={API key}
앞의 주소를 제외하고 ?
뒤에는 query라고 하며, key = value형식으로 이루어져 있고 여러 쿼리문을 연결하는 &
기호가 사용이 된다.
우리는 이런 API 요청을 하는 주소를 이용해서 요청이 이루어지는데 URLComponents
를 이용해 쿼리문을 쉽게 추가할 수 있다.
var urlComponents = URLComponents(string: "https://api.openweathermap.org/data/2.5/weather")
urlComponents?.queryItems = self.urlQueryItems
// 공통적으로 URL 쿼리에 들어가는 아이템을 선언
private let urlQueryItems: [URLQueryItem] = [
URLQueryItem.init(name: "lat", value: "37.5"),
URLQueryItem.init(name: "lon", value: "126.9"),
URLQueryItem.init(name: "appid", value: "개인 API"),
URLQueryItem.init(name: "units", value: "metric")
]
// https://api.openweathermap.org/data/2.5/weather?lat=37.5&lon=126.9&appid=개인 API&units=metric 이라는 주소가 완성이 된다.
디코딩이 이루어지기 위해서 JSON형식에 맞게 구현해주어야 한다. json 데이터는 많은 정보를 주지만 우리는 모든 데이터를 사용하지 않기에 필요한 부분만 골라서 디코딩을 해주면 된다.
JSON Data | 디코딩을 할 코드 |
---|---|
아래의 사진은 Current Weather Data를 요청하기 위한 메서드이다.
위에서 미리 만들어 놓은 fetchData메서드를 이용해 API를 요청하면 된다. fetchData에서 API요청 후 데이터 값을 디코딩 해준 후 result으로 반환해 준다.
이렇게 result에 저장된 값을 이용해 아래의 현재 기온, 최저 기온, 최고 기온, 날씨 아이콘 등을 보여줄 수 있게된다. 그리고 중요한 부분은 UI를 업데이트
를 하기위해서는 항상 main 스레드
에서 작업이 이루어져야 하기에 우리는 DisPathQueue.main
을 사용해서 업데이트를 해주면 된다.
앞에서 설명한 부분과 크게 다른 부분은 없고 다른 API 요청을 하기에 디코딩하는 데이터들 또한 아래와 같이 따로 만들어주어야한다.
JSON Data | 디코딩을 할 코드 |
---|---|
Forecast 요청하는 API 메서드 또한 큰 차이는 없고 요청한 데이터를 디코딩한 후 어떻게 처리하는지에 차이가 있다고 보면 된다.
DisPathQueue.main
에서 이루어지는 코드들은 tableView에 데이터를 보여주기위해서 저장(forecastData라는 배열을 만들고 그 변수안에 result.list값을 저장)하고 테이블 뷰를 reloadData
를 해주는 과정이다. 초기에 reloadData
를 해주지 않아 tableView에 아무런 데이터가 보여지지 않았었다. 만약 reloadData를 해주지 않는다면 테이블 뷰는 데이터가 변경이 되었는지 감지하지 못한다. 그렇기에 현재 fetchForcastWeather메서드를 통해 새로운 데이터를 업데이트를 했지만 이 배열이 바뀐지 모른다면 비어있는 배열을 보여주게된 것이다.
numberOfRowInSection
, cellForRowAt
으로 테이블 뷰에 보여줄 셀의 갯수를 정해주고, 셀의 들어갈 구성을 정해주는 메서드들이다. 앞에서 API요청 후 받은 데이터를 forcastDataItem
이라는 상수에 넣어서 필요한 데이터를 일기예보의 날짜와 그날의 기온을 보여주게 코드로 구현을 하였다.