Search
📚

EP16. Supabase Server Side Database CRUD

생성일
2024/06/09 07:11
마지막 업데이트
2024/07/06

EP16. Supabase Server Side Database CRUD

Supabase의 백엔드 함수 로직에서 데이터베이스를 다루는 방식을 학습합니다.
userRepository에 구현했던 모의 로직을 실제 데이터베이스를 다루는 코드로 변경하겠습니다.

1. Database Fetch Data

fcm_tokens 테이블에서 user_id에 해당하는 토큰 목록을 조회하는 로직을 구현하겠습니다.
export class UserRepository { // userID를 이용해 해당 유저의 FCM 토큰 목록을 반환하는 함수 async getFCMTokensByUserID(userID: string): Promise<string[]> { // fcm_tokens 테이블에서 해당 유저의 FCM 토큰을 조회 const { data: tokensData, error: tokensError } = await supabase .from("fcm_tokens") .select("fcm_token") .eq("user_id", userID); // 조회 시 에러가 발생하면 빈 배열 반환 if (tokensError) { console.error("Error fetching FCM tokens:", tokensError.message); return []; } // FCM 토큰 배열 반환 return tokensData.map((token: { fcm_token: string }) => token.fcm_token); } }
TypeScript
복사
Supabase Fetch Data 가이드
from, select, eq 명령어를 사용하여 fcm_tokens 테이블에서 user_id에 해당하는 fcm_token 목록을 조회합니다.

2. Database Insert Data

// userID와 fcmToken을 인풋으로 받아서 DB에 추가 또는 업데이트하는 함수 async addFCMToken(userID: string, fcmToken: string): Promise<boolean> { // fcm_tokens 테이블에서 동일한 fcmToken이 존재하는지 확인 const { data: existingToken, error: selectError } = await supabase .from("fcm_tokens") .select("*") .eq("fcm_token", fcmToken) .single(); // 선택 시 에러가 발생하면 false 반환 if (selectError && selectError.code !== "PGRST116") { // 'PGRST116'은 no rows 에러 코드 console.error("Error selecting FCM token:", selectError.message); return false; } // 동일한 fcmToken이 존재하면 user_id를 업데이트 if (existingToken) { const { error: updateError } = await supabase .from("fcm_tokens") .update({ user_id: userID }) .eq("fcm_token", fcmToken); // 업데이트 시 에러가 발생하면 false 반환 if (updateError) { console.error("Error updating FCM token:", updateError.message); return false; } // 성공적으로 업데이트되면 true 반환 return true; } else { // 동일한 fcmToken이 없으면 새로운 행 추가 const { error: insertError } = await supabase .from("fcm_tokens") .insert([{ user_id: userID, fcm_token: fcmToken }]); // 삽입 시 에러가 발생하면 false 반환 if (insertError) { console.error("Error inserting FCM token:", insertError.message); return false; } // 성공적으로 삽입되면 true 반환 return true; } }
TypeScript
복사

3. Database Delete Data

export class UserRepository { // userID와 fcmToken을 인풋으로 받아서 DB에서 삭제하는 함수 async deleteFCMToken(userID: string, fcmToken: string): Promise<boolean> { // fcm_tokens 테이블에서 FCM 토큰 삭제 const { error: deleteError } = await supabase .from("fcm_tokens") .delete() .eq("user_id", userID) .eq("fcm_token", fcmToken); // 삭제 시 에러가 발생하면 false 반환 if (deleteError) { console.error("Error deleting FCM token:", deleteError.message); return false; } // 성공적으로 삭제되면 true 반환 return true; } }
TypeScript
복사

4. 배포

bash deploy.sh
TypeScript
복사

5. API 호출 결과

웹 브라우저를 통해 FCM 토큰 목록 조회 API를 호출하면 헤더에 인증정보가 없기 때문에 인증 미들웨어에서 401 Response를 반환합니다.

강의 코드

7
pull