{"id":15144239,"url":"https://github.com/cccwon2/supa-next-todo","last_synced_at":"2026-02-02T08:02:14.003Z","repository":{"id":257057429,"uuid":"857191293","full_name":"cccwon2/supa-next-todo","owner":"cccwon2","description":"Supabase, Next.js, Vercel","archived":false,"fork":false,"pushed_at":"2024-09-18T09:04:38.000Z","size":918,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"dev","last_synced_at":"2025-06-28T16:49:22.981Z","etag":null,"topics":["nextjs","reactjs","supabase","todo","todolist","vercel"],"latest_commit_sha":null,"homepage":"https://supa-next-todolist.vercel.app","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/cccwon2.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-09-14T02:29:21.000Z","updated_at":"2024-09-20T16:27:51.000Z","dependencies_parsed_at":"2024-12-20T03:31:47.552Z","dependency_job_id":null,"html_url":"https://github.com/cccwon2/supa-next-todo","commit_stats":null,"previous_names":["cccwon2/supa-next-todo"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/cccwon2/supa-next-todo","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cccwon2%2Fsupa-next-todo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cccwon2%2Fsupa-next-todo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cccwon2%2Fsupa-next-todo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cccwon2%2Fsupa-next-todo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cccwon2","download_url":"https://codeload.github.com/cccwon2/supa-next-todo/tar.gz/refs/heads/dev","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cccwon2%2Fsupa-next-todo/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29007380,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-02T06:37:10.400Z","status":"ssl_error","status_checked_at":"2026-02-02T06:37:09.383Z","response_time":58,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["nextjs","reactjs","supabase","todo","todolist","vercel"],"created_at":"2024-09-26T10:23:03.681Z","updated_at":"2026-02-02T08:02:13.989Z","avatar_url":"https://github.com/cccwon2.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://supa-next-todolist.vercel.app/supa_next_vercel.png\" alt=\"Supa Next Todo 로고\"\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cstrong style=\"font-size: 24px;\"\u003eSupa Next Todo\u003c/strong\u003e\n\u003c/p\u003e\n\n## Todo 예제\n\n- **프론트엔드**:\n\n  - [Next.js](https://github.com/vercel/next.js): 프로덕션용 React 프레임워크\n  - [Tailwind CSS](https://tailwindcss.com/): 스타일링과 레이아웃을 위한 도구\n  - [Supabase.js](https://supabase.com/docs/library/getting-started): 사용자 관리 및 실시간 데이터 동기화\n\n- **백엔드**:\n  - [supabase.com/dashboard](https://supabase.com/dashboard/): Supabase.js와 함께 사용되는 RESTful API가 제공되는 호스팅 Postgres 데이터베이스\n  - [Swagger API Docs](https://supa-next-todolist.vercel.app/api-docs): 백엔드쪽 Swagger API 문서\n\n---\n\n## Vercel을 통한 배포\n\nVercel을 사용한 배포는 Supabase 계정 및 프로젝트를 생성하는 과정을 안내합니다. Supabase 통합 설치 후 모든 관련 환경 변수가 자동으로 설정되므로 배포 직후 프로젝트를 사용할 수 있습니다 🚀\n\n[![Vercel로 배포](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2Fsupabase%2Fsupabase%2Ftree%2Fmaster%2Fexamples%2Ftodo-list%2Fnextjs-todo-list\u0026project-name=supabase-nextjs-todo-list\u0026repository-name=supabase-nextjs-todo-list\u0026integration-ids=oac_VqOgBHqhEoFTPzGkPd7L0iH6\u0026external-id=https%3A%2F%2Fgithub.com%2Fsupabase%2Fsupabase%2Ftree%2Fmaster%2Fexamples%2Ftodo-list%2Fnextjs-todo-list)\n\n---\n\n## 처음부터 빌드하기\n\n### 1. 새 프로젝트 생성\n\n[Supabase에 가입](https://supabase.com/dashboard)하고 새로운 프로젝트를 생성하세요. 데이터베이스가 시작될 때까지 기다립니다.\n\n### 2. \"Todo List\" Quick start 실행\n\n데이터베이스가 시작되면 \"Todo List\" 빠른 시작을 실행하세요. 프로젝트 내에서 `SQL Editor` 탭으로 이동하여 `TODO LIST: Build a basic todo list with Row Level Security`를 찾아 실행합니다.\n\n### 3. URL 및 Key 가져오기\n\n프로젝트 설정(톱니바퀴 아이콘)으로 이동하여 API 탭을 열고, API URL과 `anon` 키를 찾습니다. 이는 다음 단계에서 필요합니다.\n\n`anon` 키는 클라이언트 측 API 키로, 로그인하기 전까지는 익명 접근을 허용합니다. 사용자가 로그인하면 키는 해당 사용자의 로그인 토큰으로 전환되어 Row Level Security가 활성화됩니다.\n\n![API 정보](https://user-images.githubusercontent.com/10214025/88916245-528c2680-d298-11ea-8a71-708f93e1ce4f.png)\n\n**주의**: `service_role` 키는 모든 데이터에 대한 완전한 접근 권한을 가지고 있으며, 보안 정책을 무시합니다. 이 키는 서버 환경에서만 사용되며, 절대 클라이언트나 브라우저에서 사용하면 안 됩니다.\n\n---\n\n## Supabase 세부 정보\n\n### Postgres Row Level Security\n\n이 프로젝트는 Postgres의 Row Level Security(RLS)를 사용한 고수준의 권한 관리를 활용합니다. 사용자가 로그인하면 `authenticated` 역할과 UUID가 포함된 JWT가 발급됩니다. 이를 통해 각 사용자가 자신의 데이터만 접근할 수 있도록 세밀한 제어가 가능합니다.\n\n다음은 정책이 포함된 간소화된 스키마입니다:\n\n```sql\ncreate table todos (\n  id bigint generated by default as identity primary key,\n  user_id uuid references auth.users not null,\n  task text check (char_length(task) \u003e 3),\n  is_complete boolean default false,\n  inserted_at timestamp with time zone default timezone('utc'::text, now()) not null\n);\n\nalter table todos enable row level security;\n\ncreate policy \"Individuals can create todos.\" on todos for\n    insert with check ((select auth.uid()) = user_id);\n\ncreate policy \"Individuals can view their own todos.\" on todos for\n    select using ((select auth.uid()) = user_id);\n\ncreate policy \"Individuals can update their own todos.\" on todos for\n    update using ((select auth.uid()) = user_id);\n\ncreate policy \"Individuals can delete their own todos.\" on todos for\n    delete using ((select auth.uid()) = user_id);\n```\n\n---\n\n## 추가 사항\n\n### Swagger 설정\n\n이 프로젝트에서는 Swagger를 통해 API 문서화를 지원합니다. `/api-docs` 경로에서 API 스펙을 확인할 수 있으며, 추가적인 수정 사항은 다음과 같이 Swagger 설정 파일에 반영됩니다.\n\n```typescript\n/**\n * @swagger\n * components:\n *   schemas:\n *     Todo:\n *       type: object\n *       properties:\n *         id:\n *           type: integer\n *           description: \"Todo 항목의 고유 식별자\"\n *         user_id:\n *           type: string\n *           description: \"사용자 ID\"\n *         task:\n *           type: string\n *           description: \"Todo 항목의 작업 내용\"\n *         is_complete:\n *           type: boolean\n *           description: \"Todo 완료 여부\"\n *         inserted_at:\n *           type: string\n *           format: date-time\n *           description: \"생성 시각\"\n */\n```\n\n### Profile 페이지\n\n사용자 프로필을 확인 및 업데이트할 수 있는 `Profile` 페이지입니다.\n사용자는 자신의 정보와 관련된 사항을 조회 및 수정할 수 있습니다.\n\n### 소셜 로그인\n\n이 프로젝트는 다음과 같은 소셜 로그인 옵션을 제공합니다:\n\n- Google\n- GitHub\n- Kakao\n\n사용자는 이러한 소셜 계정을 통해 간편하게 로그인하고 서비스를 이용할 수 있습니다.\n\n---\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcccwon2%2Fsupa-next-todo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcccwon2%2Fsupa-next-todo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcccwon2%2Fsupa-next-todo/lists"}