XML Decoding 삽질

Beaver's Knowledge Storage·2022년 11월 17일
0

삽질

목록 보기
1/1
post-thumbnail

개발을 하면서 REST API와 통신을 하게되면 일반적으로 응답모델을 JSON 형태로 많이 받게 된다. 기억을 더듬어보면 나 또한 JSON 이외에는 받아 본 기억이 거의 없다.

이번에 공부한 SwiftUI를 사용해보기 위해 공공데이터를 활용해서 간단한 앱을 만들어보기로 하였다.

Alamofire 라이브러리를 이용해서 API 통신하였고, 응답모델을 확인했을 때 JSON이 아닌 XML 형태로 내려오는 것을 확인하였다. JSONDecoder를 이용해 디코딩 할 때 처럼 XML도 방법이 있을거라 생각하고 구글링을 하였다.

구글링 결과 애플에서 기본으로 제공해주는 XML Parser 라는 기능이 있었다. 내용을 읽어보니 통신 기능부터 delegate를 통해 XML를 디코딩하는 기능들을 제공해주고 있었다.
뭔가 delegate에서 내가 직접 파싱을 해줘야하는게 번거롭다 생각들어서 JSONDecoder처럼 알아서 한번에 디코딩 해주는 것을 찾다 XMLCoder라는 서드파티 라이브러리를 찾게 되었다.

문서에 나온 예제를 토대로 나의 응답모델에 맞게 Struct 구현하고 디코딩을 하였으나 계속해서 디코딩 에러가 발생하였다.

에러 내용은 item 내 필드들을 찾을 수 없다는 것이다.🤯
아무리 생각을 해도 틀린게 없다 생각이 들었지만 어딘가 문제가 있으니 발생했을거라 생각해서 CodingKeys를 이용해 직접 파싱을 해보기도 하고 예제를 똑같이 따라하면서 정상적으로 디코딩 되는 로직에 나의 응답모델을 추가해가면서 어디가 문제인지 따라가다 실마리를 발견하였다.

Array 형태만 들어가면 에러가 발생하였다. 이 부분을 집중적으로 구글링을 하다보니 이유를 찾게 되었다. 바로 XML 트리 구조를 제대로 파악하지 못해서 응답모델 설계를 잘못했던 것이다.

items 내 item이 여러개이니 let items: [Item] 이렇게 하면 되겠지 생각했는데 그게 아니라 중간에 items를 완충해주는 또 다른 Struct가 필요했던 것이다.

위와 같이 변경해주니 비로소 디코딩이 정상적으로 되었다.

이번에 겪은 내용은 XML Parser를 이용했어도 동일하게 겪었을 문제였었다. 평소 많이 접할 기회가 없던 영역이라 다소 생소했지만 이번 기회를 통해 색다른 경험을 한 것 같아 좋았다.

0개의 댓글