개요
현재 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에서
디코딩하더라도 잘 디코딩이 된다.

'iOS' 카테고리의 다른 글
| [Swift] MusicKit으로 음악 검색기능 구현하기 - 2 (0) | 2025.06.29 |
|---|---|
| [Swift] MusicKit 내부 살펴보기 - 1 (1) | 2025.06.27 |
| [Swift] 1인 앱 개발로 사용할 기술 스택 및 서비스 (4) | 2024.10.02 |
| [SwiftUI] onAppear는 화면이 그려진 뒤에 불리는 함수가 아니다? (0) | 2024.09.25 |
| [SwiftUI] ViewModifier? Custom ViewModifier 만들기 (1) | 2024.09.11 |