본문 바로가기

iOS & Swift

[iOS] URL에서 가져온 JSON, Parsing 하기

웹에서 데이터 가져오기

 


🚀 String(주소 문자열) -> URL

 

가장 먼저 할 일은 String형태의 변수에 url주소를 저장한 후, 이를 URL 객체로 변환해주는 것입니다.

 

이 때, 만약 String형태의 url주소가 비어있다면, URL의 생성자는 nil값을 반환합니다. 

 

그렇기 때문에, 위와같이 guard-let 구문을 통해서, 혹시모를 오류상황을 잡아주도록 합니다.

 

🚀 URL -> String

Url 객체를 통해 새로운 String값을 생성합니다. 이 때, 입력된 url로 연결된 웹 서버에서 값을 가져오는 작업이 일어나기 때문에, do-catch와 try구문을 통해서 안전하게 묶어줘야 합니다.

 

참고로 이 상태의 String값은 다음과같은 형태입니다.

 

 

🚀 String(받은 데이터) -> data

 

이번엔 위에서 얻은 String값을 date객체로 변환합니다. 이 때 전달받은 String값이 어떠한 형식으로 인코딩 되어있는지에 대한 값을 인자로 전달해야합니다.

 

사실 이 부분에서 올바르지 않은 인코딩 타입을 삽입하면 오류가 발생해야 할 것 같은데, 개인적으로 실험했을때는 오류가 따로 발생하지 않았습니다. 좀 더 알아봐야 할 것 같습니다.

 

 

 

🚀 data -> 객체

드디어 마지막 단계입니다. 

 

마지막으로 얻은 data 형태의 값을 JSONDecoder를 통해 decode해줍니다. 

 

JSONDecoder는 첫번째 인자로 JsonData에대한 Value Object를 받고, 두번 째 인자로 위에서 만든 data 값을 받습니다.

 

마지막으로 여기서 반환된 값을 원하는 객체(VO)에 담아주기만 하면, 파싱이 끝납니다.

 

사실 좀 더 복잡하게 하고싶다면 NSArray나 NSDictionarry등으로 변환해서 하나씩 파싱하는 방법도 있습니다.

 

하지만 목적이 그냥 단순하게 받은 데이터를 객체형태로 담고싶은 것 뿐이라면, 이 방법이 가장 간단한 것 같습니다.

 

 

⭐️⭐️⭐️ https://app.quicktype.io/

참고로 위 사이트는, Json데이터를 입력하면, 그와 대응하는 VO를 자동으로 생성해서 만들어주기 때문에 매우 유용합니다!

 

 

 

왜 이렇게 복잡한가?

먼저 보셨듯이, url을 통해 json데이터를 가져오는 과정이,  그렇게 간단하지는 않습니다.

 

url을 통해 데이터를 받아오기 위해선, 먼저 String형태의 주소값을 가져와야하고, 이를 url객체로 변환하고, 또 다시 요청한 값을 String형태로 받으며, 이후 data객체로 인코딩하고 ... 등등 굉장히 복잡한 과정을 거칩니다.

 

저도 처음엔 그냥 String만 넣으면 Json데이터가 뚝딱 나오는 함수는 왜 없는지, 그리고 아무도 왜 그런 함수를 만들어놓지 않는지에 불평을 했었습니다.

 

하지만 이렇게 할 경우 꽤 많은 문제가 발생할 수 있습니다.

 

가장 먼저 생각나는 문제는 오류상황에 대한 대처가 어려워진다는 것입니다.

만약 String을 넣어서 JsonData를 받았는데 원하는 값이 들어오지 않거나 런타임 에러가 발생한 상황을 예로들어 보겠습니다.

 

여기서 오류가 발생한 이유는 뭘까요?

 

나올 수 있는 상황은 너무 다양합니다.

String-> Url 변환에 실패했을 수도 있고, 네트워크 문제로 데이터를 가져오지 못했을 수도 있고, JsonDecoder에서 오류가 발생했을지도 모를 일입니다.

 

이렇듯 다양한, 오류상황에 대처하고, 더 나아가 원하는 상황에 원하는 대처코드를 넣을 수 있게 하기위해선, 조금 불편하더라도 복잡한 단계를 거치는게 더 나을 수도 있다는 것이 제 결론입니다.

 

함수형 프로그래밍에서, 함수를 기능단위로 잘게 쪼개는 이유 중 하나도 "유닛테스트"에 용이하기 때문입니다. 

그 이유를, 연결해서 생각해본다면 어느정도 납득이 가는 과정입니다.

'iOS & Swift' 카테고리의 다른 글

Swift 문법 정리 [객체 관련]  (0) 2019.07.31
Swift 문법 정리 [기본]  (0) 2019.07.28
XCode로 유튜브 앱 만들기 #1 레이아웃 작업  (0) 2019.07.27