티스토리 뷰

반응형

 

문제 상황 이해하기

카카오 API를 활용해서 JSON을 받아오고, iOS에서 decoding 하려고 하는데 문제가 발생했어요.

 

우선 아래는 Kakao API 개발 가이드에 나오는 내용이에요.

datetime의 타입은 Datetime이고, 그 형식은 IOS 8601이에요.

 

그래서 아래와 같은 코드로 Decoder를 설정한 후 Decoding을 진행했어요.

 

let decoder = JSONDecoder()
    decoder.dateDecodingStrategy = .iso8601

 

분명히 dateDecodingStrategy가 iso8601이기 때문에 문제가 없어 보였어요. ISO 8601은 일종의 규격이기 때문에 통일되어 있을 거라고 판단했어요.

 

그런데 원하는 결과물이 나오지 않았고, 어디에서 문제가 발생했는지 디버그 중 문제가 Date에서 발생하는 것을 발견했어요.

 

 

문제 원인 파악하기

처음에는 ISO8601이라는 곳이 문제일 것이라고 생각도 하지 못했어요. 그래서 다른 부분을 변경해보다가 혹시나 하는 마음에 검색을 해봤어요.

 

그러다가 Stack OverFlow에서 답변을 발견했어요.

 

 

ISO-8601이 공식적인 규격이라고 하더라도 더 다양하게 세분화되어있었어요.

Swift의 경우 RFC3339 포맷에서 ISO-8601 포맷을 따르기 때문에, 위에 나오는 예시의 Date 타입을 변환할 수 있어요.

 

그런데 카카오 공식 문서로 되돌아가 보면

으로 타입이 상세히 명세되어 있는데, 위에 보이는 RFC3339에는 카카오 API에서 제공하는 Date 타입이 존재하지 않아요.

결론적으로 "초 이하 단위의 세 자리 숫자"와 함께 타임존을 제공하는 ISO8601 DateTime 자료형은 iOS의 .iso8601 타입에서는 매칭이 불가능한 것이에요.

단순히 ISO8601을 따른다고 해서 무조건 변환되는 것이 아닌 것이죠.

 

 

문제 해결하기

문제가 되는 것이 decoder의 dateDecodingStrategy였기 때문에 당연히 이 부분을 변경해줘야겠죠?

 

방법은 여러 가지가 있겠지만 저는 아래와 같은 방법을 사용했어요.

 

let decoder = JSONDecoder()
    let dateFormatter = DateFormatter().then {
      $0.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.sssZ"
    }
    decoder.dateDecodingStrategy = .formatted(dateFormatter)

 

카카오 API에서 주어지는 타입과 완벽히 매칭 되는 구조로 dateFormat을 설정해줌으로써 해결했어요! :]

반응형
댓글