[BaaS/Next.js] Supabase ์†Œ๊ฐœ / next.js ํ”„๋กœ์ ํŠธ์™€ ํ•จ๊ป˜ ์„ค์น˜ํ•ด์„œ ํ…Œ์ด๋ธ” ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์™€๋ณด๊ธฐ

2024. 3. 20. 01:13ยท๐Ÿชด DB & BaaS
SMALL

 

์ด์ „ ํŒ€ํ”„๋กœ์ ํŠธ์—์„œ๋Š” BaaS๋กœ firebase ๋งŒ ์จ๋ดค์—ˆ๋Š”๋ฐ ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์—์„œ  supabase๋ฅผ ์ฒ˜์Œ์œผ๋กœ ์จ๋ณด๊ฒŒ ๋๋‹ค. firebase๊ฐ€ ์‚ฌ์šฉํ•˜๊ธฐ ํŽธ๋ฆฌํ•œ ๊ฑฐ ๊ฐ™์•„ supabase๋Š” ์–ด๋ ต์ง€ ์•Š์„๊นŒ ๊ณ ๋ฏผ์ด ์žˆ์—ˆ์ง€๋งŒ supabase๊ฐ€ ์ต์ˆ™ํ•ด์ง€๊ธฐ๋งŒ ํ•˜๋ฉด ์ •๋ง ์ข‹๋‹ค๊ณ  ๋“ค์—ˆ๋Š”๋ฐ ์ด๋ฒˆ ๊ธฐํšŒ์— ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์–ด ์„ค๋ Œ๋‹คใ…Žใ…Ž ๊ฐ„๋žตํ•˜๊ฒŒ supabase์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๊ณ  DB๋ฅผ ์ƒ์„ฑํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๊ณผ์ •๋„ ์กฐ๊ธˆ ์จ๋ณด๊ธฐ๋กœ!

 


๐Ÿ’š 1. Supabase ๋ž€?

 

  •  firebase (ํŒŒ์ด์–ด๋ฒ ์ด์Šค) ์˜ ๋Œ€์•ˆ์œผ๋กœ ์ธ๊ธฐ๋ฅผ ์–ป๊ณ  ์žˆ๋Š” *BaaS ํ”Œ๋žซํผ์ด๋‹ค.
  •  PostgreSQL ๊ธฐ๋ฐ˜์˜ SQL DB ๊ธฐ๋Šฅ, REST API ๋“ฑ์˜ ๊ธฐ๋Šฅ์„ ์˜คํ”ˆ ์†Œ์Šค๋กœ ์ œ๊ณต
  •  firebase๋งŒํผ ํŽธ๋ฆฌํ•˜๋ฉด์„œ๋„, firebase๊ฐ€ ๋ชป ๊ฐ–์ถ˜ ์žฅ์ ์„ ์ง€๋‹ˆ๊ณ  ์žˆ๋‹ค.
    • RDB(Relational-Database)๋ฅผ ํ†ตํ•ด ์—‘์…€ ์‹œํŠธ์ฒ˜๋Ÿผ ๋‚ด์šฉ์„ ์ฑ„์šฐ๋Š” DB๋ฐฉ์‹์„ ์ œ๊ณต
    • firebase๋Š” NoSQL ๊ธฐ๋ฐ˜ DB๋กœ, ์ฟผ๋ฆฌ ๊ธฐ๋Šฅ์ด ํ˜‘์†Œํ•ด ๋ฐ์ดํ„ฐ ๊ฒ€์ƒ‰์ด ์–ด๋ ต์ง€๋งŒ, supabase๋Š” PostgreSQL ๊ธฐ๋ฐ˜์˜ SQL DB ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ด ๋ฐ์ดํ„ฐ ๊ฒ€์ƒ‰ ๋“ฑ ์šฉ์ดํ•œ ์ ์ด ๋งŽ์Œ
    • SQL Editor๋ฅผ ํ†ตํ•ด SQL ์ฟผ๋ฆฌ๋ฅผ ์›นํŽ˜์ด์ง€์—์„œ ์ž‘์„ฑ,์ €์žฅ,์‹คํ–‰ ๊ฐ€๋Šฅํ•˜๊ณ , Table Editor๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์Šคํ”„๋ ˆ๋“œ์‹œํŠธ(์—‘์…€)์ฒ˜๋Ÿผ๋„ ์กฐํšŒ,์ž‘์„ฑ ๊ฐ€๋Šฅ
    • ํด๋ผ์ด์–ธํŠธ, ์„œ๋ฒ„ ํ™˜๊ฒฝ ๋ชจ๋‘์—์„œ ๋™์ผํ•œ ๋ฐฉ์‹ ์ž‘์—…์ด ๊ฐ€๋Šฅํ•œ ismorphic JavaScript ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ œ๊ณต
๋”๋ณด๊ธฐ

* Baas : Backend as Service - ์„œ๋น„์Šคํ˜• ๋ฐฑ์—”๋“œ๋กœ, ํ”„๋ก ํŠธ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋ฐฑ์—”๋“œ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ๋ชจ๋ธ. BaaS๊ฐ€ ๋ฐฑ์—”๋“œ ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค์–ด์ค˜์„œ DB ์„œ๋ฒ„ ์šด์˜/๊ด€๋ฆฌ ๋“ฑ์˜ ๋ฐฑ์—”๋“œ ์—…๋ฌด๋ฅผ ์•Œ์•„์„œ ๋‹ค ๋งก์•„์ฃผ๊ธฐ ๋•Œ๋ฌธ์—, BaaS ์‚ฌ์šฉ์ž๋Š” ํ”„๋ก ํŠธ์—”๋“œ/์‚ฌ์šฉ์ž ์ธก๋ฉด ๊ฐœ๋ฐœ์—๋งŒ ์ง‘์ค‘ ํ•  ์ˆ˜ ์žˆ๋‹ค.         

(ex ) Firebase, Supabase, AWS Amplify ๋“ฑ)

 


 

๋˜ํ•œ  supabase ๋„ firebase auth ์ฒ˜๋Ÿผ ์†Œ์…œ ๋กœ๊ทธ์ธ์„ ๋น„๋กฏํ•ด ๋กœ๊ทธ์ธ/ํšŒ์›๊ฐ€์ž… ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์˜ค๋Š˜์€ ์ผ๋‹จ next.js ํ”„์  ์ƒ์„ฑ ํ›„ DB๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋ถˆ๋Ÿฌ์™€๋ดค๋Š”๋ฐ ์ฒ˜์Œ ํ•˜๋‹ค๋ณด๋‹ˆ ์ข€ ์• ๋ฅผ ๋จน์—ˆ๋‹ค .. (ํŠนํžˆ RLS policy๋•Œ๋ฌธ์— ๐Ÿฅฒ) ๊ณต์‹๋ฌธ์„œ์™€ ๊ตฌ๊ธ€๋ง์„ ํ†ตํ•ด ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ๋Š”๋ฐ, ์ด ๊ณผ์ • - Supabase - DB ์ƒ์„ฑ, ๋ฐ์ดํ„ฐ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋ฐฉ๋ฒ•์„ ๊ธฐ๋กํ•ด๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค.

 

๐Ÿ’š 2. Next.js ํ”„๋กœ์ ํŠธ๋ฅผ supabase์™€ ํ•จ๊ป˜ ์ƒ์„ฑํ•˜๊ณ  supabase์™€ ์—ฐ๊ฒฐํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ

 

1 )  supabase ์‚ฌ์ดํŠธ์—์„œ (next.jsํ”„์ ๊ณผ ์—ฐ๊ฒฐํ• ) ํ”„๋กœ์ ํŠธ ์ƒ์„ฑํ•˜๊ธฐ

์šฐ์„  supabase ์‚ฌ์ดํŠธ์— ๊ฐ€์ž…ํ•œ ์ ์ด ์—†๋‹ค๋ฉด ๊ฐ€์ž…์„ ํ•˜๊ณ  ๋กœ๊ทธ์ธ์„ ํ•œ๋‹ค. 

https://supabase.com/

 

Supabase | The Open Source Firebase Alternative

Build production-grade applications with a Postgres database, Authentication, instant APIs, Realtime, Functions, Storage and Vector embeddings. Start for free.

supabase.com

 

๊ทธ๋ฆฌ๊ณ  start your project ๋‚˜, ๋‚ด dashboard ์—์„œ New project ๋ฅผ ๋ˆŒ๋Ÿฌ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜์ž.

ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ์œ„ ์ด๋ฏธ์ง€์ฒ˜๋Ÿผ ํ”„๋กœ์ ํŠธ url, ํ”„๋กœ์ ํŠธ api key ๊ฐ€ ๋œฌ๋‹ค!

์•„๋ž˜์—” JS ๋“ฑ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์ฝ”๋“œ๋กœ ์“ฐ์—ฌ์žˆ์Œ

 

 

2 )  IDE : supabase์™€ ํ•จ๊ป˜ next.js ํ”„๋กœ์ ํŠธ ์ƒ์„ฑํ•˜๊ณ  .env ์— ํ”„๋กœ์ ํŠธ url, api key ๋„ฃ๊ธฐ

๋กœ์ปฌ IDE ํ„ฐ๋ฏธ๋„ ์—์„œ (์ €๋Š” VSC ํ„ฐ๋ฏธ๋„ ์‚ฌ์šฉ) next.js ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ๊ณผ ๋™์‹œ์— supabase๊นŒ์ง€ ๊ฐ™์ด ์„ค์น˜!

 

โœจ ์•„๋ž˜๊ณต์‹๋ฌธ์„œ ์ฐธ์กฐ

https://supabase.com/docs/guides/getting-started/quickstarts/nextjs

 

Use Supabase with Next.js | Supabase Docs

_10 return {JSON.stringify(notes, null, 2)}

supabase.com

 

โ—yarn ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๋ฅผ ์“ด๋‹ค๋ฉด,   yarn create next-app -e with-supabase   ํ•ด๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ž˜ ์„ค์น˜๋œ๋‹ค.

(์—ฌ๊ธฐ์„œ - ํ•˜๋‚˜๋ผ๋„ ๋น ์ง€๋ฉด ์•ˆ๋˜๋‹ˆ๊นŒ ์ฃผ์˜ํ•˜์ž ใ… ใ… ) 

์ด๋ ‡๊ฒŒ ์„ค์น˜ํ•˜๋ฉด ์•Œ์•„์„œ next.js ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ ํ›„ supabase api ํ‚ค ๋“ฑ์„ ๋‹ด์•„๋‘˜ ์ˆ˜ ์žˆ๋Š”  .env.example ํŒŒ์ผ๊นŒ์ง€ ์นœ์ ˆํ•˜๊ฒŒ ์ƒ์„ฑ๋œ๋‹ค.

  NEXT_PUBLIC_SUPABASE_URL=<SUBSTITUTE_SUPABASE_URL>
  NEXT_PUBLIC_SUPABASE_ANON_KEY=<SUBSTITUTE_SUPABASE_ANON_KEY>

 

๊ทธ๋Ÿผ  .env ํŒŒ์ผ์— ์œ„์ฒ˜๋Ÿผ ํ”„๋กœ์ ํŠธ url๊ณผ api key๋ฅผ ์จ์ฃผ์ž.

< .. > ๋ถ€๋ถ„์— ์•„๊นŒ supabase์—์„œ ๋งŒ๋“  ํ”„๋กœ์ ํŠธ์˜ url , api key ์“ฐ๊ธฐ  ( < > ์“ฐ๋Š” ๊ฑฐ ์•„๋‹™๋‹ˆ๋‹ค!)

 

 

3 )  supabase ์‚ฌ์ดํŠธ์—์„œ ํ•ด๋‹น ํ”„๋กœ์ ํŠธ์— ๋“ค์–ด๊ฐ€ table editor๋กœ ํ…Œ์ด๋ธ” ์ƒ์„ฑํ•˜๊ธฐ

(table editor ๋ง๊ณ ๋„ sql editor ๊ฐ€ ์žˆ์ง€๋งŒ, sql ๋ฌธ์„ ์ž‘์„ฑ ์•ˆํ•ด๋ดค๋‹ค๋ฉด ํ…Œ์ด๋ธ”์ด ํŽธํ•  ๊ฒƒ์ด๋‹ค) 

 

schema ๋Š” ๋ณดํ†ต public.   ์—ฌ๊ธฐ๋‹ค๊ฐ€ new table ์ƒ์„ฑํ•ด์„œ, ํ…Œ์ด๋ธ”๋ช…์„ ์ง“๊ณ 

 

*RLS ๋Š” ์ถ”์ฒœํ•œ๋‹ค๊ณ  ํ•˜๋‹ˆ ์„ค์ •ํ•˜๋Š”๊ฒŒ ์ข‹๊ณ  - (์•„์ง ๋‚˜๋„ ์ž์„ธํžˆ๋Š” ๋ชจ๋ฅธ๋‹ค... ํ•˜์ง€๋งŒ ํ–‰ ์ˆ˜์ค€์˜ ๋ณด์•ˆ์ด๋ผ๋Š” ์  ์ •๋„ ์ฒดํฌ.)

(*RLS : Row Level Security ํ–‰ ์ˆ˜์ค€ ๋ณด์•ˆ์œผ๋กœ, '์ž์‹ ์˜ ๋ฐ์ดํ„ฐ๋งŒ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค'๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๋ณด์•ˆ ์ •์ฑ… ์„ค์ •์ด ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ํ•จ.)

 

Enable Realtime ๋„ ์ฒดํฌํ•ด์•ผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฐ˜์˜๋œ๋‹ค๊ณ  ํ•œ๋‹ค. 

 

๊ทธ๋ฆฌ๊ณ  columns ๋ฅผ ๋งŒ๋“ค๋ฉด ๋ !

 

 

โ—columns ๋งŒ๋“ค ๋•Œ ์ฃผ์˜์‚ฌํ•ญ

  • ํŒŒ์ด์–ด๋ฒ ์ด์Šค ๋•Œ์™€ ๋‹ฌ๋ฆฌ, ์ž๋ฃŒํ˜• ํƒ€์ž…์ด ๋‹ค์–‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ข€ ๋” ์ฃผ์˜ํ•  ๊ฒƒ.
    number (int, float, numeric,..) ๋‚˜ string (varchar, text) ์˜ type ๋„ ๋‹ค์–‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ข€ ๋” ์ƒ๊ฐํ•ด์•ผ ํ•œ๋‹ค
    ๐Ÿ˜ถ‍๐ŸŒซ๏ธ (๋‚˜ ์—ญ์‹œ ๊ฒ€์ƒ‰ํ•ด๊ฐ€๋ฉฐ ๋”ฐ์ ธ๋ณด์•˜๋‹ค)
  • ์„ค์ • ์‚ฌํ•ญ๋“ค
    - default value ์ดˆ๊ธฐ๊ฐ’ ์„ค์ • ๊ฐ€๋Šฅ   (ex. null, 0 )
    - ํ†ฑ๋‹ˆ๋ฐ”ํ€ด ๋ˆŒ๋Ÿฌ์„œ ์นผ๋Ÿผ๊ฐ’์„ array ๋ฐฐ์—ด๋กœ ํ• ๊ฑด์ง€, ๊ณ ์œ ํ•œ ๊ฐ’์œผ๋กœ ํ• ๊ฑด์ง€ ๋“ฑ ์„ค์ • ๊ฐ€๋Šฅ.
    - primary key ๋„ ์ฒดํฌํ•ด์„œ ์„ค์ • ๊ฐ€๋Šฅ. (์ค‘๋ณต ๊ฐ€๋Šฅ) 
      ์ด primary key ๊ฐ€, ์—ฌ๋Ÿฌ ํ…Œ์ด๋ธ” ๊ฐ„ ์—ฐ๊ฒฐ์„ ์‹œ์ผœ์ฃผ๋Š” foreign key  (์™ธ๋ž˜ํ‚ค)์™€ ์ƒ๊ด€์ด ์žˆ๋‹ค!

    ์—ฌ๋Ÿฌ ํ…Œ์ด๋ธ”์„ ์—ฐ๊ฒฐ์‹œ์ผœ์ฃผ๋Š” foreign keys (์™ธ๋ž˜ํ‚ค)์— ๊ด€ํ•ด์„œ๋Š” ๋‹ค์Œ์— ๊ธ€์„ ์“ฐ๊ธฐ๋กœ ํ•˜๊ฒ ๋‹ค ..!

๊ทธ๋ฆฌ๊ณ  ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜๋ฉด ์˜ค๋ฅธ์ชฝ์— ๋œจ๋Š” API Docs ๋ฅผ ๋ˆ„๋ฅด๋ฉด ์นœ์ ˆํ•˜๊ฒŒ ์‚ฌ์šฉ๋ฒ•๋„ ๋‹ค ๋‚˜์™€์žˆ์Œ. ใ…Žใ…Ž 

 

( + ์ฐธ๊ณ  : ๊ทผ๋ฐ ์ด ๋•Œ ์ƒ์„ฑํ•  ๋•Œ ๋ถ€ํ„ฐ ๋‚œ ์•ˆ๋์Œ..ใ… -ใ…  ์•Œ์•„๋ณด๋‹ˆ, CORS์—๋Ÿฌ๋ฅผ ์ €๋ฒˆ์— ์ ‘ํ•ด์„œ ๊ด€๋ จ ํ™•์žฅํ”„๋กœ๊ทธ๋žจ์„ ์„ค์น˜ํ•ด์„œ ๋Œ๋ฆฌ๊ณ  ์žˆ์—ˆ๋Š”๋ฐ, ๊ทธ๊ฑฐ ๋•Œ๋ฌธ์— supabase์˜ patch request๋ฅผ ๋ฌดํšจํ™”ํ•ด์„œ ์ƒ๊ธด ๋ฌธ์ œ์˜€๋˜ ๊ฒƒ์œผ๋กœ ๋ณด์˜€๋‹ค. ๊ทธ๊ฑธ ๋„๋‹ˆ๊นŒ create table ์„ฑ๊ณต!)

 

 

4 )  ๊ผญ! supabase ์ƒ์„ฑํ•œ ํ…Œ์ด๋ธ”์— ADD RLS policy ํ•ด์ฃผ๊ธฐ!!! 

๋‚œ ์ด๊ฒƒ์„ ์•ˆํ•ด์ค˜์„œ ๋‚˜์ค‘์— VSC์—์„œ ์ฝ”๋“œ ์“ฐ๊ณ  ๊ณ„์† ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค์ง€ ๋ชปํ–ˆ์—ˆ๋‹ค ... ใ… ใ… 

 

supabase table

 

์ƒ์„ฑํ•œ ํ…Œ์ด๋ธ” ์ฐฝ์—์„œ Add RLS policy ํ•˜๊ณ  - New Policy - ๋กœ ์ƒˆ๋กœ์šด row ์ˆ˜์ค€์˜ ๋ณด์•ˆ์ •์ฑ…์„ ์ถ”๊ฐ€ํ•ด๋ณด์ž.

๋ณ„๋„์˜ ์„ค์ •์„ ํ•  ๊ฒŒ ์•„๋‹ˆ๋ผ๋ฉด   Get started quickly -

 

supabase rls policy

 

Enable read access to everyone (This policy gives read access to your table for all users via the SELECT operation.)

(๋ฅผ ์„ ํƒํ•˜๋ฉด ๋ชจ๋‘๊ฐ€ ์ฝ์„ ์ˆ˜ ์žˆ๋„๋ก ๊ถŒํ•œ์„ ์„ค์ •ํ•˜๋Š” ๊ฒƒ. ๋ฌผ๋ก  ๋‹ค๋ฅธ ์„ค์ •์„ ์„ ํƒํ•  ์ˆ˜๋„ ์žˆ๋‹ค. authenticated ์œ ์ €๋งŒ insert๋ฅผ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค๋“ ์ง€..) 

- Use this template ํด๋ฆญ 

- Allowed operation ์— ๋Œ€ํ•ด์„œ๋Š” ALL๋งŒ ์„ ํƒํ•˜๊ณ  Review - Save policy ๋ฒ„ํŠผ ๋ˆ„๋ฅด๊ธฐ! 

 

 

 

5 )   supabase table editor์—์„œ ํ…Œ์ด๋ธ”์— ๋ฐ์ดํ„ฐ ์ง์ ‘ ๋„ฃ์–ด๋ณด๊ธฐ 

ํ•œ๋ฒˆ supabase์‚ฌ์ดํŠธ์—์„œ ์ง์ ‘ ๋ฐ์ดํŠธ ๋„ฃ์–ด๋ณด๊ณ  ์กฐํšŒ๊ฐ€ ๋˜๋Š”์ง€ ํ…Œ์ŠคํŠธ๋ฅผ ํ•ด๋ณด์ž!

insert ๋ฒ„ํŠผ -> insert row ํ•ด์ฃผ๋ฉด ๋จ !

 

๋””ํดํŠธ๊ฐ’์„ ์„ค์ •ํ–ˆ๋‹ค๋ฉด ๊ฐ’ ์•ˆ๋„ฃ์œผ๋ฉด ์•Œ์•„์„œ ๋””ํดํŠธ๊ฐ’์œผ๋กœ ์„ค์ •๋จ. 

 

์ดํ›„ ์ง์ ‘ ํ…Œ์ด๋ธ”ํ‘œ์—์„œ์˜ ๊ฐ’ ์ˆ˜์ •์€ ํ•ด๋‹น ํ…Œ์ด๋ธ” ์นธ์„ ๋ˆŒ๋Ÿฌ์ฃผ๋ฉด ๋˜๋Š”๋ฐ,

string - text,.. ๋“ , number ๋“  ๊ทธ๋ƒฅ  ๋ฌธ์ž๋งŒ ์ˆซ์ž๋งŒ ๊ทธ๋Œ€๋กœ ์จ์ฃผ๋ฉด ๋จ. 

ํ•˜์ง€๋งŒ ๋ฌธ์žstring์˜ ๋ฐฐ์—ด๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ, ["   ", "  "] ์™€ ๊ฐ™์€ ํ˜•ํƒœ๋ฅผ ์ง€์ผœ์„œ ์จ์ค˜์•ผํ•œ๋‹ค. 

 

๋ฌธ์žstring์˜ ๋ฐฐ์—ด๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ, ["   ", "  "] ์™€ ๊ฐ™์€ ํ˜•ํƒœ๋ฅผ ์ง€์ผœ์„œ ์จ์ค˜์•ผํ•œ๋‹ค.

 

์—ฌ๊ธฐ์„œ ๋ฐฐ์—ด์€ string์ธ text๊ฐ€ ์›์†Œ์ธ ๋ฐฐ์—ด: text [ ]

 

 

 

6 )  IDE : ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์—์„œ server.ts์˜ createClient ๋ถˆ๋Ÿฌ์„œ ๋ฐ์ดํ„ฐ ๋‹ค ๊ฐ€์ ธ์˜ค๊ธฐ

์•„๊นŒ ์œ„ ๊ณต์‹๋ฌธ์„œ๋Œ€๋กœ ๊ทธ๋Œ€๋กœ ํ•˜๋ฉด ๋œ๋‹ค.

์•„๊นŒ IDE -VS code ํ„ฐ๋ฏธ๋„๋กœ next.js ํ”„์  ์ƒ์„ฑํ•˜๋ฉด์„œ supabase๋„ ์„ค์น˜ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—, 

utilsํด๋” - supabase ์•ˆ์— server.ts๊ฐ€ ์ƒ์„ฑ๋˜์–ด์žˆ๋‹ค.

 

์—ฌ๊ธฐ์žˆ๋Š” createClient ํ•จ์ˆ˜๋ฅผ ์›ํ•˜๋Š” ์„œ๋ฒ„์ปดํฌ๋„ŒํŠธ์—์„œ ๋ถˆ๋Ÿฌ์™€์„œ 'supabase'์™€ ๊ฐ™์€ ๋ณ€์ˆ˜์— ๋‹ด๊ณ , 

await supabase.from("ํ…Œ์ด๋ธ”๋ช…").select();      (ํ˜น์€ select('*') ๋กœ ๋ชจ๋“  ํ…Œ์ด๋ธ” ๋‚ด์šฉ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ) 

ํ•˜๋ฉด ๋„์• !!

 

 


 

๐Ÿ’ก ์ถ”๊ฐ€ : JS ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์„œ๋ฒ„ / ํด๋ผ์ด์–ธํŠธ ํ™˜๊ฒฝ ๋ชจ๋‘์—์„œ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•œ createClient ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํŽธ๋ฆฌํ•˜๋‹ค!

์ฐธ๊ณ : Supabase ๊ณต์‹๋ฌธ์„œ - javascript/installing

 

 

Installing | Supabase

_10

supabase.com

์œ„์˜ 6๋ฒˆ ๊ณผ์ •์—์„œ,

๋งŒ์•ฝ Javascript, (typescript) ๋ฅผ ์“ด๋‹ค๋ฉด 

@supabase/supabase-js ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ createClient ๋ฅผ import ํ•ด์„œ ์“ฐ๋ฉด ์„œ๋ฒ„/ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ ๋ชจ๋‘์—์„œ ์“ธ ์ˆ˜ ์žˆ๋‹ค.

 

์ด๊ฑฐ ์ •๋ง ์™„์ „ ์žฅ์ ์ด๋‹ค !!!! ๐Ÿ˜ถ

์ด๊ฑธ ๋ชจ๋ฅด๊ณ  ;; ๊ทธ๋ƒฅ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” server.ts์˜ createClient ์“ฐ๋‹ค๊ฐ€,

ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” ๋จนํžˆ์ง€๋„์•Š๊ณ  client.ts ๊ฑธ import ํ•ด๋„ ์•ˆ๋ผ์„œ.. ํŠœํ„ฐ๋‹˜๊ป˜ ์งˆ๋ฌธํ•ด๋„ ์•ˆ๋˜๊ณ . ์ง„์งœ ์• ๋จน์—ˆ์—ˆ๋‹ค....... ๐Ÿ˜…

 

๋‚ด ๊ฒฝ์šฐ ์•„๋ž˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ ๋”ฐ๋กœ createClientJs ๋ผ๊ณ  ๊ทธ๋ƒฅ ๋งŒ๋“ค๊ตฌ.. ๊ทธ๊ฑธ import ํ•ด์„œ ํ˜ธ์ถœํ•ด์„œ ์“ฐ๋„๋ก ํ–ˆ๋‹ค. 

import { createClient } from '@supabase/supabase-js';

export const createClientJs = () =>
  createClient(process.env.NEXT_PUBLIC_SUPABASE_URL!, process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!);
const supabase = createClientJs();

 

 


 

๋‹ค์‹œ ๋ณธ๋ก ์œผ๋กœ ๋Œ์•„๊ฐ€์„œ, ์•„๋ž˜์˜ ๋‚ด๊ฐ€ ์“ด ์ฝ”๋“œ๋ฅผ ์ฐธ๊ณ ํ•˜์ž.

 

createClient ํ•จ์ˆ˜๋ฅผ ๋ณ€์ˆ˜์— ๋‹ด๊ณ ,  --  const supabase = createClient(); 
์ด ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด from('ํ…Œ์ด๋ธ”').select(..) ๋ฅผ ํ•ด์ค€ ๊ฒƒ.  --  const { data, error } = await supabase.from('communityPosts').select('*');

 

๊ทธ๋Ÿผ Supabase์˜ ํ…Œ์ด๋ธ” ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š” ๊ฒƒ !! ๐Ÿ˜†

// ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ
import { createClient } from '@/utils/supabase/server';

const CommunityDetailPage = async () => {
	try {
  		const supabase = createClient(); 
	    const { data, error } = await supabase.from('communityPosts').select('*');
  		if (error) throw error
    } catch (error) {
    console.log(error);
  	}

  return (
    <div className="m-20">
       <p>{data[0].userId}</p>
       
      // ....

 

๊ทธ๋ฆฌ๊ณ  ๊ฐ€์ ธ์˜จ data ๊ฐ์ฒด์—๋Š” ํ…Œ์ด๋ธ” ๋ฐ์ดํ„ฐ๋“ค์ด [{   }, {   } ... ]  ๋ฐฐ์—ด ์•ˆ์— ์ž˜ ๋‹ด๊ฒจ์žˆ์œผ๋‹ˆ, 

data[0] ์œผ๋กœ ์ฒซ๋ฒˆ์งธ ํ–‰์˜ ๋‚ด์šฉ๋“ค์„ (ํ•˜๋‚˜์˜ ๊ฐ์ฒด) ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

 

๊ทธ๋ž˜์„œ ์œ„ ์ฝ”๋“œ return ๋ฌธ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ, data[0].userId    ์™€ ๊ฐ™์ด ์จ์ค˜์„œ ์›ํ•˜๋Š” ๋ฐธ๋ฅ˜๊ฐ’ ํ•˜๋‚˜๋งŒ ๊ฐ€์ ธ์˜ฌ ์ˆ˜๋„ ์žˆ๋‹ค.

 

๋งŒ์•ฝ ํ…Œ์ด๋ธ” ์ „์ฒด ๋ฐ์ดํ„ฐ- ๋ชจ๋“  column์ด ์•„๋‹Œ, ํŠน์ • column ๋“ค๋งŒ ๊ฐ€์ ธ์˜ค๋ ค๋ฉด

let { data: communityPosts, error } = await supabase
  .from('communityPosts')
  .select('some_column,other_column')

select ('์นผ๋Ÿผ๋ช…,์นผ๋Ÿผ๋ช…') ์ฒ˜๋Ÿผ  ์•ˆ์— ๊ฐ™์ด ์จ์ฃผ๋ฉด๋œ๋‹ค.

 

๊ทธ ์™ธ ๋ฐฉ๋ฒ•๋„ api docs ์— ์นœ์ ˆํ•˜๊ฒŒ ๋‚˜์™€์žˆ์œผ๋‹ˆ ์ฐธ๊ณ ํ•ด๋ณด์ž!

 

 

 

 

SMALL

'๐Ÿชด DB & BaaS' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[BaaS] Supabase - Stroage RLS policy ์„ค์ •ํ•ด์ค˜์•ผ ๋ชจ๋‘ ์ด๋ฏธ์ง€๋“ฑ๋ก ๊ฐ€๋Šฅ!  (0) 2024.03.24
[BaaS] Supabase - rpc, SQL editor๋ฅผ ํ™œ์šฉํ•ด ๋ฐฐ์—ด ํƒ€์ž…์˜ ์ปฌ๋Ÿผ์— (๋ฌธ์ž์—ด) ์›์†Œ ์ถ”๊ฐ€ํ•˜๊ธฐ  (2) 2024.03.22
[BaaS] Supabase foreign key (์™ธ๋ž˜ ํ‚ค) ํ™œ์šฉํ•ด ํ…Œ์ด๋ธ” ์ƒ์„ฑํ•˜๊ณ  ์กฐํšŒํ•˜๊ธฐ  (2) 2024.03.21
[BaaS/TS] Supabase - Supabase CLI๋กœ Database์˜ ํƒ€์ž… ์ƒ์„ฑํ•˜๊ธฐ  (0) 2024.03.20
'๐Ÿชด DB & BaaS' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [BaaS] Supabase - Stroage RLS policy ์„ค์ •ํ•ด์ค˜์•ผ ๋ชจ๋‘ ์ด๋ฏธ์ง€๋“ฑ๋ก ๊ฐ€๋Šฅ!
  • [BaaS] Supabase - rpc, SQL editor๋ฅผ ํ™œ์šฉํ•ด ๋ฐฐ์—ด ํƒ€์ž…์˜ ์ปฌ๋Ÿผ์— (๋ฌธ์ž์—ด) ์›์†Œ ์ถ”๊ฐ€ํ•˜๊ธฐ
  • [BaaS] Supabase foreign key (์™ธ๋ž˜ ํ‚ค) ํ™œ์šฉํ•ด ํ…Œ์ด๋ธ” ์ƒ์„ฑํ•˜๊ณ  ์กฐํšŒํ•˜๊ธฐ
  • [BaaS/TS] Supabase - Supabase CLI๋กœ Database์˜ ํƒ€์ž… ์ƒ์„ฑํ•˜๊ธฐ
๋ จ๋””
๋ จ๋””
FE - ๊ฐœ๋ฐœ ๊ณต๋ถ€์˜ ๊ธฐ๋ก
  • ๋ จ๋””
    Ryeon's Devstory
    ๋ จ๋””
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (69)
      • ๐Ÿชด JavaScript & TypeScript (11)
        • ๐Ÿงฉ Algorithm (6)
      • ๐Ÿชด React (12)
      • ๐Ÿชด Next.js (8)
      • ๐Ÿชด HTML & CSS (2)
      • ๐Ÿชด DB & BaaS (5)
      • ๐Ÿชด Git &Github (0)
      • โœ๏ธ ํ”„๋กœ์ ํŠธ ๊ณผ์ • & ํšŒ๊ณ  (18)
      • โœ๏ธ Today what I Learned _T.. (11)
      • ๐Ÿ•Š๏ธ IT ์•„ํ‹ฐํด (0)
      • etc. (2)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
    • ๋ฐฉ๋ช…๋ก
  • ๋งํฌ

    • My Github ๐Ÿ˜บ
    • ๋„ค์ด๋ฒ„ ๋ธ”๋กœ๊ทธ ๐ŸŽต๐ŸŽง (์ผ์ƒ,์Œ์•… ๋“ฑ)
  • ๊ณต์ง€์‚ฌํ•ญ

  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    ํ‹ฐ์Šคํ† ๋ฆฌ๋ธ”๋กœ๊ทธ์Šคํ‚จ
    ์˜ค๋ธ”์™„
    axios
    tailwind
    ์ปดํฌ๋„ŒํŠธ๋ถ„๋ฆฌ
    json-server
    NVM
    route handler
    useEffect
    Vite
    State
    Next.js
    BAAS
    useMutation
    Array.filter
    props
    ๋ Œ๋”๋งํŒจํ„ด
    reacthook
    ์›น๊ฐœ๋ฐœ ๊ธฐ์ดˆ
    ์˜์กด์„ฑ๋ฐฐ์—ด
    Supabase
    ๋น„๋™๊ธฐํ†ต์‹ 
    reactquery
    ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ
    ๋ฆฌ์•กํŠธ์ฟผ๋ฆฌ
    ๋ฐฐ์—ด ๋ฉ”์„œ๋“œ
    ํ‹ฐ์Šคํ† ๋ฆฌ์ฑŒ๋ฆฐ์ง€
    ์—๋Ÿฌ
    fetch
    react
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.0
๋ จ๋””
[BaaS/Next.js] Supabase ์†Œ๊ฐœ / next.js ํ”„๋กœ์ ํŠธ์™€ ํ•จ๊ป˜ ์„ค์น˜ํ•ด์„œ ํ…Œ์ด๋ธ” ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์™€๋ณด๊ธฐ
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”