본문 바로가기
UIKit Project/UIKit Troubleshooting

[날씨앱] 날씨 데이터를 찾아서..기상청 API 사용하기, 네트워크 오류 해결 (MVVM, URLSession, JSONDecoder)

by thekoon 2023. 6. 21.

저번에 Apple WeatherKit에 이어

정확한 날씨데이터를 찾기 위해

data.go.kr에 접속하거나, API를 호출했는데 

며칠동안 접속도 안되고 API도 묵묵부답이었습니다...

설마하는 마음으로 폰으로 테더링을 하니 접속도 잘 되고 API 요청도 잘 됐습니다!

아무래도 저희 집 네트워크 IP에 문제가 있는 것 같은데

사이트에 문의를 해도 IP 차단같은건 하지 않았다고 하셔서 원인을 모르겠네요..

그래서 얼마 없는 데이터를 아껴가면서 API를 호출하고 앱을 만들고 있습니다!

 

처음 사용한 데이터는 기상청 단기예보 조회 서비스입니다!

초단기예보, 단기예보 등이 있는데

제가 만들고 있는 날씨앱은 오늘 하루 날씨를 확인하고, 비가 온다면 우산을 챙기라는 알림을 보내주려고 생각하고 있기 때문에

그날 하루 날씨를 알 수 있는 단기예보조회를 활용할 생각입니다.

 

요청 페이지 명세를 보고 Postman을 활용해 사용할 데이터를 미리 요청해봅니다! (잘 들어오네요!)

 

 

이제 이 JSON을 파싱하기 위해! 여기로 이동해서 모델을 짜줍니다!

https://app.quicktype.io

 

Instantly parse JSON in any language | quicktype

 

app.quicktype.io

JSON을 넣어주기만 하면 알아서 모델을 짜 주기 때문에 편리하게 사용하고 있습니다!ㅎㅎ

 

그리고 만든 모델을 가지고 필요한 정보만 꺼내 활용하려 합니다!

이번에 MVVM 아키텍처로 구조를 만들어보려고 했는데요

너무 좋은 영상을 보고 이 구조를 적용해서 만들어 보려고 합니다! (저번 Rx 강의도 잘 봤었는데 강의 많이 찍어주세요!)

https://www.youtube.com/watch?v=M58LqynqQHc 

영상을 보면 

- Entity

- Repository 

- Model

- Service

- ViewModel

- View

로 구성되어 있는데! 글이 길어질 것 같아서 MVVM은 다음 글에서 더 자세히 다뤄보겠습니다!

 

구조에 맞게 폴더링을 한 뒤

 

최초에 서버에서 받아오는 날씨 데이터인 WeatherEntity를 아까 사이트에서 가져 옵니다.

이제 이 모델의 데이터를 WeatherRepository를 통해 가져옵니다.

가져올때는 URLSession과 JSONDecoder를 활용했는데요

enum으로 네트워크 에러타입을 만들고, Result 타입으로 활용할 예정입니다.

그리고 데이터를 요청하는 함수를 URLSession을 통해 요청합니다.

data를 성공적으로 받아오면 JSON을 파싱하는 함수를 만들고, JSONDecoder로 파싱한 뒤 데이터를 활용하려 했습니다!

하지만..역시 처음부터 쉽게 되지 않았는데...

 

데이터를 받아오기도 전에 네트워크 에러가 나네요ㅎㅎ

 

그래서 찾아보니 info.plist에 아래 내용을 추가해주니 간단히 해결됐습니다!

 

이제 드디어 되나..? 했는데 이번엔 네트워크 오류는 지나갔지만 JSON 파싱 오류가 나네요

역시 한번에 될리가 없지~하며 JSON파싱 쪽 코드를 살펴봤는데요!

여기서 조금 헤맸습니다

 

JSONDecoder()를 만들어주고

.decode로 가져온 데이터를 원하는 구조로 변경하면 된다고 알고있었는데요 

처음에는 필요한 데이터인 Items로 변경이 되는 줄 알고 바로 접근했었는데

가져온 JSON을 자세히 보니 처음부터 타고타고 가져와야 될 것 같았습니다.

필요한 데이터인 Item으로 접근하기 위해

WeatherEntity -> response -> body -> items -> item 배열 순으로 구조를 타고 타고 가서 요청했습니다!

그랬더니 드디어 성공..!

 

이제 서버에서 우리가 활용할 데이터만 골라쓰기 위해 Model을 만들고

 

WeatherService를 활용해 데이터를 가져옵니다.

todayDate변수를 만들어 오늘 날짜를 가져오고,

JSON에서 파싱한 데이터 중 오늘 날짜에 해당하는 데이터와 카테고리에 필요한 데이터를 filter를 통해 가지고 왔습니다.

그렇게 하니..!

이렇게 JSON 파싱도 성공하고,

오늘 날짜의 WeatherModel을 가지고 올 수 있었습니다!

애플 WeatherKit과 비교해봐도 역시 우리나라! 기상청 데이터가 오늘 날씨와 더 맞는것 같아서

앞으로 기상청 API를 활용해 앱을 만들어보려고 합니다!

출시하는 그날까지 화이팅 화이팅!!!