1. PUBLIC_SUPABASE_SERVICE_ROLE_KEY를 사용하는 client를 준비해야한다.

import { createServerClient } from "@supabase/ssr";
import { cookies } from "next/headers";

export async function createClientAdmin() {
  const cookieStore = await cookies();

  return createServerClient(
    process.env.NEXT_PUBLIC_SUPABASE_URL!,
    process.env.NEXT_PUBLIC_SUPABASE_SERVICE_ROLE_KEY!,
    {
      cookies: {
        getAll() {
          return cookieStore.getAll();
        },
        setAll(cookiesToSet) {
          try {
            cookiesToSet.forEach(({ name, value, options }) =>
              cookieStore.set(name, value, options)
            );
          } catch {
            // The `setAll` method was called from a Server Component.
            // This can be ignored if you have middleware refreshing
            // user sessions.
          }
        },
      },
    }
  );
}


import { createServerClient } from "@supabase/ssr";
import { cookies } from "next/headers";

export async function createClient() {
  const cookieStore = await cookies();

  return createServerClient(
    process.env.NEXT_PUBLIC_SUPABASE_URL!,
    process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!,
    {
      cookies: {
        getAll() {
          return cookieStore.getAll();
        },
        setAll(cookiesToSet) {
          try {
            cookiesToSet.forEach(({ name, value, options }) =>
              cookieStore.set(name, value, options)
            );
          } catch {
            // The `setAll` method was called from a Server Component.
            // This can be ignored if you have middleware refreshing
            // user sessions.
          }
        },
      },
    }
  );
}

// 일반적인 작업을 할 때에는 NEXT_PUBLIC_SUPABASE_ANON_KEY를 사용

 

2. 계정을 삭제하기 전에 연결된 스토리지와 테이블의 데이터가 삭제되어야 한다.

export async function deleteUser() {
  const supabase = await createClientAdmin();
  const userData = await getCurrentUserServer(["id"]);

  if (!userData?.id) {
    throw new Error("로그인이 필요합니다.");
  }

  // 1. 먼저 스토리지의 파일 삭제
  const { error: objectsError } = await supabase.storage
    .from(process.env.NEXT_PUBLIC_SUPABASE_BUCKET_NAME!)
    .remove([`${userData.id}/avatar.jpg`]);

  if (objectsError && objectsError.message !== "The resource was not found") {
    throw objectsError;
  }

  // 2. users 테이블의 데이터 삭제
  const { error: userDataError } = await supabase
    .from("users")
    .delete()
    .eq("id", userData.id);

  if (userDataError) {
    throw userDataError;
  }

  // 3. 마지막으로 auth.users에서 사용자 삭제
  const { error } = await supabase.auth.admin.deleteUser(userData.id);

  if (error) {
    return {
      success: false,
      error: {
        name: "AuthError",
        message: error.message,
        code: error.code,
      } as AuthError,
    };
  }

  return {
    success: true,
    error: undefined,
  };
}

 

이렇게 하면 성공적으로 작동한다.

'개발 > NEXTJS' 카테고리의 다른 글

nextjs에서 사용자 정보를 swr과 zustand를 사용하여 관리하기  (0) 2025.02.23
nextjs 쿠키 옵션 설정  (1) 2025.02.16
모달창에서 스크롤 방지  (0) 2025.02.10
error.tsx 사용  (0) 2025.02.10
nextjs 에러 관리  (0) 2025.02.05

+ Recent posts