[iOS] Supabase 알아보기

Han's·2024년 1월 3일
0
post-thumbnail
post-custom-banner

항상 NoSQL DB인 Firebase를 사용하다가 이전 프로젝트에서 SQL DB에 대한 필요성을 느끼고 있던 찰나 Supabase를 알게 되어서 사용해 보려고 합니다.

Supabase란?

Supabase는 PostgreSQL 데이터베이스를 기반으로 하며, 실시간 웹 소켓 기능과 REST API를 제공하여 개발자들이 애플리케이션을 구축하고 데이터를 관리할 수 있도록 다양한 기능을 제공하는 오픈 소스의 서버리스 클라우드 데이터베이스입니다.

위에서 짧게 설명을 했지만... 이렇게 설명하는 것보다 아래의 재미있는 영상을 보고 오는 것을 추천드립니다!

간략 소개: https://www.youtube.com/watch?v=tvX9f8FqMFI

'Supabase is an open source Firebase alternative.'

Supabase 홈페이지에 들어가면 가장 먼저 보이는 문구로 Firebase를 대체하기 위해 탄생했기 때문에 Firebase에 있는 대부분의 기능을 제공한다고 보면 됩니다.

특히 Supabase는 PostgreSQL의 기능과 호환성을 제공하므로 PostgreSQL의 강력한 기능을 사용할 수 있기 때문에 관계형 데이터베이스의 특징을 활용할 수 있습니다.


Supabase 기능

아래에서 Supabase의 강력한 기능 중 하나를 소개해 드리겠습니다!

Supabase의 강력한 기능 중 하나는 AI를 활용해서 SQL 문을 자동으로 생성해 준다는 것인데, SQL Editor에서 아래 사진에서처럼 초록색 부분에 원하는 것을 입력하고 Enter를 누르면

짜잔~ SQL 문을 자동으로 생성해 주는 것을 볼 수 있습니다. 생성된 SQL 문을 보고 마음에 들면 Accept change를 누르면 됩니다!

그렇게 되면 아래처럼 생성된 SQL 문이 Editor에 입력되고, Run 버튼을 누르고 Table Editor에 가보면

아래 사진과 같이 page2라는 Table이 잘 생성된 것을 볼 수 있습니다.


Supabase 초기 설정

이제 Supabase를 사용하기 위해 프로젝트를 생성하고 초기 설정하는 부분을 본격적으로 시작하겠습니다.

Dashboard에서 New Project를 선택합니다.

프로젝트 명을 입력하고 Database Password는 빨간 박스의 Generate a password를 선택하여 자동 생성하면 됩니다.(비밀번호 추후 변경 가능)

Table Editor에서 Create a new table을 선택하면 아래와 같이 테이블을 설정할 수 있는 페이지가 나타납니다.

여기서 중요한 것은 Enable Row Level Security (RLS) 부분인데 Firebase의 규칙과 같은 것이라고 생각하면 됩니다.

저는 간단하게 Supabase를 사용해 보기 위한 프로젝트라서 RLS를 선택 해제하고 사용하지만 서비스 배포를 위한 프로젝트에서는 반드시 사용하셔야 합니다!

그리고 Columns를 설정해야 하는데 Column이 어떤 건지 다들 아시죠...? 혹시나 모르는 분들을 위해 사진 첨부하겠습니다.

출처: https://www.fun-coding.org/post/mysql_basic1.html#gsc.tab=0

id를 보면 Is Identity가 자동으로 선택되어 있는데, 행을 만들 때마다 id column에 순차 고유 번호를 자동으로 할당하기 때문에 식별자로 사용할 수 있는 것입니다. 여기서는 id의 Type이 int이기 때문에 1씩 증가하게 됩니다.

  • Table 예시

Table의 column을 설정하고 Save 하면, 아래와 같이 Table이 만들어진 것을 볼 수 있습니다.

이제 테스트를 위해 더미 데이터를 넣도록 하겠습니다. 아래 사진에서 Insert row를 선택하면

아래와 같이 입력할 수 있는 창이 나타납니다.

id는 Table을 설정할 때 자동적으로 할당하도록 설정하였기 때문에 따로 설정하지 않아도 되고, 마찬가지로 created_at 또한 Default 값이 현재 시간으로 되어있어서 따로 설정하지 않아도 됩니다.

title과 body에만 text를 입력한 후 Save 하면 아래와 같이 Table에 더미 데이터가 들어간 것을 볼 수 있습니다.

그리고 Settings -> API에서 Project URL과 Project API keys를 메모장에 복사해 주세요~


사용하기

이제부터 Xcode에서 Supabase에 CRUD를 하는 방법에 대해 알아보겠습니다. 아래 내용들은 모두 공식 문서에 나와있으니 하다가 막히면 문서 읽어보세요~

문서: https://supabase.com/docs/reference/swift/initializing

먼저 Xcode 프로젝트를 생성한 후 SPM으로 아래의 URL을 복붙해서 Supabase 패키지를 추가해 주세요.

https://github.com/supabase-community/supabase-swift.git

그다음 데이터를 가져오기 위한 구조체를 만들어 줘야 하는데 column 명, 타입을 동일하게 만들어 주면 됩니다.
(columns을 설정할 때 id는 자동 할당 되도록 만들었고, created_at은 Default 값을 현재 시간으로 설정했기 때문에 Optional 타입으로 만들었습니다.)

struct Test: Codable {
    var id: Int? = nil
    let title: String
    let body: String
    var created_at: Date? = nil
}
  • Create
func insertData() {
        let test = Test(title: "insert", body: "insert Data")
        
        Task {
            try await supabase.database
                .from("page")
                .insert(test)
                .execute()
        }
    }

데이터를 insert 하면 아래 사진과 같이 id가 1 증가한 3으로 자동 할당되어서 title과 body 데이터가 들어간 것을 볼 수 있습니다.


  • Read

select 메서드를 보면 파라미터로 columns: String이 들어가는 것을 볼 수 있는데 Default 값이 " * "인 것을 볼 수 있습니다.

SQL에서 " * "가 어떤 뜻인지는 다들 알고 계시죠? " * "은 전체를 뜻하는 것이기 때문에 전체 column들이 기본적으로 선택되어 있습니다.

func fetchData() {
       Task {
           let test: [Test] = try await supabase.database
               .from("page")
               .select()
               .execute()
               .value
           
           print(test)
       }
   }

따라서 아래와 같이 전체 데이터를 리스트 형식으로 받을 수 있습니다.


  • Upsert
    Upsert는 Update + Insert를 합친 말로 중복되는 값이 있다면 Update를 하고 중복되는 값이 없다면 Insert를 하는 쿼리라고 합니다.
    물론 Update가 따로 있지만 여기서는 Upsert를 사용해 보겠습니다.

    Upsert는 Primary key가 반드시 있어야 한다고 합니다. Primary key가 없으면 Update 대신 Insert가 됩니다!
func upsertData() {
        let test = Test(id: 3, title: "upsert", body: "upsert Data")
        
        Task {
            try await supabase.database
                .from("page")
                .upsert(test)
                .execute()
        }
    }


  • Delete
func deleteData() {
        Task {
            try await supabase.database
              .from("page")
              .delete()
              .eq("id", value: 3)
              .execute()
        }
    }

마무리

이번 글에서는 Supabase에서 기본적인 CRUD를 해봤는데 메서드 명이 SQL에서 사용하는 것과 비슷해서 개인적으로 친숙한 느낌을 받았고, 짧고 간결한 코드로 빠르게 사용할 수 있어서 편하다는 느낌이 들었습니다.

SQL을 잘 모르면 기본적인 부분만이라도 공부하고 사용해 보시면 직관적이게 잘 만들었다는 생각이 들 거라고 생각합니다.

profile
🍎 iOS Developer
post-custom-banner

0개의 댓글