본문 바로가기
iOS

[Swift] Supabase에서 받아온 created_at이 디코딩 되지 않을 때

by 워뇨옹2 2024. 10. 17.
728x90
반응형

개요

현재 Typescript로 만들어놓은 서버를 사용하는 애플리케이션을 운영중인데,

서버 개발자가 없다보니 aws, typescript, mongodb, firebase auth,

그리고 클라이언트단을 한번에 작업중이다.

 

아.... 이골이 난다. 기능 한 번 테스트 해보려고 하면 aws를 수십번을 들락날락 거리고

vscode, xcode를 수백번 왔다갔다 해야하니 여간 귀찮은 작업이 아니다.

 

결국 지금까지의 작업물을 Supabase로 통합해 아예 갈아 엎어버리기로 했다.

한 마디로 SwiftUI로 풀스택 앱을 만드는 것이다.

이 과정에 대해서는 나중에 한 번 포스팅 하기로 하겠다.

 

Supabase SDK도 굉장히 잘 만들어져서 쿼리를 제대로 몰라도 쉽게 사용할 수 있다.

다만 한 가지에서 크게 막혔는데, Date가 제대로 디코딩 되지 않는다는 문제이다.

 

사실 해결은 했지만, 레퍼런스도 거의 없고 그 레퍼런스에서 조차

이유는 모르고 해결만 한 경우이다.

 

일단 보도록 하자

Value사용

쿼리 빌더를 사용해 쿼리를 만들고 execute로 빌더를 실행하면 다음과 같은

스니펫들이 등장한다.

이 중에서 우리는 value를 통해 디코딩을 supabase SDK에게 맡기는 것이다.

value는 Sendable 프로토콜을 채택해 return 값에 대응하도록 디코딩을 진행한다.

 

이렇게 진행하면 문제 없이 Date를 포함하는 필드를 디코딩해서 값을 반환할 수 있다.

근데 data를 디코딩할 때가 문제가 된다.

Data직접 디코딩

이 경우에는 원인을 알 수 없지만 Date(TimeStamp)를 포함하는 필드는 전혀 디코딩이 되지 않는다.

다행스럽게도 인코딩은 문제 없어서 insert는 잘 된다.

 

value를 사용해도 충분하지만 필요없는 함수가 많아지고 커스텀을 해야하는

함수가 필요해서 좀 찾아봤다.

https://github.com/orgs/supabase/discussions/28293

 

Why can't I use Date when querying in the swift client? · supabase · Discussion #28293

I'm trying to only fetch rows after a specific date. There is a URLQueryRepresentable protocol and most types have an extension for it, but there is none for Date. I also couldn't find anything in ...

github.com

수파베이스 깃에서 발견한 이슈다.

 

Codable한 데이터 타입들에는 거의 다 `URLQueryRepresentable`이라는 프로토콜을

채택해서 인코딩 디코딩이 문제 없이 진행되게 하는데, Date 타입에만 이게 존재하지 않는다고 한다.

 

따라서 우리는 Date에 URLQueryRepresentable을 채택해서 사용하면된다.

@retroactive의 경우 프로토콜을 확장하기 위해 사용하는 것이지만, Swift6부터 적용되었다.

본인은 Swift5를 쓰고 있어 존재하질 않아 일단 제거했다.

 

또 웃긴게, 다음 이미지를 보자.

이미 PostfREST패키지에서 Date에 프로토콜을 채택해두었다고 한다.

저 이슈가 self answer한 건데, 7/31에 만들어진 이슈이니

지금은 프로토콜만 채택을 해둔듯 하다.

 

결과적으로 아래처럼 Date를 확장해서 queryValue:String 값을 추가해주면 Date를 Data에서 

디코딩하더라도 잘 디코딩이 된다.

728x90
반응형