[BaaS] Supabase - rpc, SQL editor๋ฅผ ํ™œ์šฉํ•ด ๋ฐฐ์—ด ํƒ€์ž…์˜ ์ปฌ๋Ÿผ์— (๋ฌธ์ž์—ด) ์›์†Œ ์ถ”๊ฐ€ํ•˜๊ธฐ

2024. 3. 22. 01:41ยท๐Ÿชด DB & BaaS
SMALL

24.3.21  (+ Next.jsํ”„์  ์ค‘ / React / TS)

+ ์ˆ˜์ • 

 

 

< Supabase - rpc ํ™œ์šฉํ•˜๊ธฐ  ( Remote Procedure Calls) >

๊ณต์‹๋ฌธ์„œ ์ฐธ๊ณ 

 

Call a Postgres function | Supabase

You can call Postgres functions as Remote Procedure Calls, logic in your database that you can execute from anywhere. Functions are useful when the logic rarely changes—like for password resets and updates. create or replace function hello_world() return

supabase.com


 

1. RPC ๋ž€?

You can call Postgres functions as Remote Procedure Calls, logic in your database that you can execute from anywhere. Functions are useful when the logic rarely changes—like for password resets and updates. (๊ณต์‹๋ฌธ์„œ)

-

RPC ๋Š” Remote Procedure Calls์˜ ์•ฝ์ž.

์ฆ‰, Postgres ํ•จ์ˆ˜๋ฅผ ๋ถˆ๋Ÿฌ์™€ ์“ธ ์ˆ˜ ์žˆ๋„๋ก ํ•œ ๊ฒƒ์ธ๋ฐ,

๋‚ด๊ฐ€ ์ง์ ‘ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ Postgres ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์„œ ์ฝ”๋“œ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์ž˜ ์•ˆ๋ณ€ํ•˜๋Š” ๋กœ์ง (ํŒจ์Šค์›Œ๋“œ ์ดˆ๊ธฐํ™”๋‚˜ ์—…๋ฐ์ดํŠธ)์— ์ ํ•ฉํ•˜๋‹ค๊ณ  ํ•œ๋‹ค. 

 

 

์•„๋ž˜๋Š” supabase ๋ฅผ ์‚ฌ์šฉํ•ด data๋ฅผ ๊ฐ€์ ธ์™€ ๋ณ€์ˆ˜์— ๋‹ด์„ ๋•Œ์˜ ์ฝ”๋“œ์ธ๋ฐ,

const { data, error } = await supabase.from('users').select('scrappedCommunityPosts').eq('userId', userId);

์›๋ž˜ supabase ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธ ์‹œ

์œ„ ์ฒ˜๋Ÿผ, select , eq, .. update, delete ๋“ฑ supabase์˜ ๋ฌธ๋ฒ• ์„ ์จ์„œ ์‚ฌ์šฉํ•˜๋Š”๋ฐ,

 

rpc๋ฅผ ํ™œ์šฉํ•˜๋ฉด sql๋ฌธ์„ ํ†ตํ•ด ๋งŒ๋“  ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด, ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค.

(๋”์šฑ ๋ณต์žกํ•˜๊ฒŒ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด ์“ธ ์ˆ˜ ์žˆ๋Š”๊ฑฐ๊ฐ™๋‹ค)

 

 

 


 

 

2. Supabase๋ฅผ ํ†ตํ•ด ๋ฌธ์ž์—ด ์›์†Œ๋ฅผ ๋ฐฐ์—ด์— ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ? - ๊ณ ๋ฏผ

 

๋‚ด ๊ฒฝ์šฐ ์Šคํฌ๋žฉํ•œ ๊ธ€์„ ๋‹ด์€ ๋ชฉ๋ก์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด,

์ˆ˜ํผ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”์— ๋ฌธ์ž์—ด์ด ์›์†Œ์ธ ๋ฐฐ์—ด๊ฐ’์„ ๊ฐ€์ง„ ์ปฌ๋Ÿผ column์„ ๋งŒ๋“ค์—ˆ๊ณ , (text [ ]) 

์—ฌ๊ธฐ ๋ฐฐ์—ด์— ๋ฌธ์ž์—ด(๊ธ€ ๊ณ ์œ  ID)์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์‚ญ์ œํ•˜๋Š” ์‹์œผ๋กœ ์ง„ํ–‰ํ•  ์˜ˆ์ •์ด์—ˆ๋‹ค.

 

(๋‚˜์ค‘์— ํŠœํ„ฐ๋‹˜๊ป˜ ์—ฌ์ญค๋ณด๋‹ˆ ํ•œ ์นผ๋Ÿผ์—๋Š” ํ•˜๋‚˜์˜ ๊ฐ’์ด ๋“ค์–ด๊ฐ€๋Š” ๊ฒƒ (1:1)์ด ์ข‹์•„์„œ, ๋ฐฐ์—ด๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ๋น„์ถ”์ฒœํ•˜์…จ์ง€๋งŒ.. ใ… ์ผ๋‹จ ๋ฐฐ์—ด๊ฐ’์˜ column ์„ ๋งŒ๋“ค์—ˆ๊ณ  ์—ฌ๊ธฐ์— ์›์†Œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ณต์œ ํ•œ๋‹ค !!)

 

table editor ๋กœ ๋ณธ ํŠน์ • ํ…Œ์ด๋ธ”. ๋งจ์˜ค๋ฅธ์ชฝ ์•„๋ž˜์— ๋ณด๋ฉด ์ด scrapped... ์นผ๋Ÿผ์— ๋ฌธ์ž์—ด์›์†Œ ๋ฐฐ์—ด์ด ์žˆ๋Š” ๊ฑธ ์•Œ์ˆ˜์žˆ๋‹ค. ["....", "...."]

 

 

๊ทธ๋ ‡๋‹ค๋ฉด supabase๋ฅผ ํ†ตํ•ด์„œ ์–ด๋–ป๊ฒŒ ๋ฌธ์ž์—ด ์›์†Œ๋ฅผ ๋ฐฐ์—ด์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์„๊นŒ?

 

-

์ด์ „์— firebase๋ฅผ ์ผ์—ˆ์„ ๋•Œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด firebase์˜ updateDoc๊ณผ arrayUnion ๋ฉ”์„œ๋“œ๋ฅผ ํ™œ์šฉํ–ˆ์—ˆ๋‹ค.

// ์ฆ๊ฒจ์ฐพ๊ธฐ ์ถ”๊ฐ€
export const addFavoriteChannel = async (userUid, channelId) => {
  try {
    await updateDoc(doc(db, 'users', userUid), {
      favChannels: arrayUnion(channelId)
    });
  } catch (error) {
    console.error('cannot add favorite to firestore: ', error);
  }
};

 

 

์ด๋ฒˆ์— supabase๋ฅผ ์จ๋ดค์„ ๋•Œ๋Š”, ..

์ด๋Ÿฐ firebase์˜ arrayUnion๊ณผ ๊ฐ™์€ ์šฉ์ดํ•œ ๋ฉ”์„œ๋“œ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๊ธฐ๋•Œ๋ฌธ์— ๋‚œํ•ญ์„ ๊ฒช์—ˆ๋‹ค .. ใ… ใ…ก 

๊ฒ€์ƒ‰์„ ํ•ด๋ด๋„ ์ฐพ๊ธฐ ์€๊ทผ ํž˜๋“ค์—ˆ๋‹ค.

 

๋ฌผ๋ก  rpc๋ฅผ ํ™œ์šฉํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๋‹ค.

์ง์ ‘ js์ฝ”๋“œ๋กœ, ๊ธฐ์กด ๋ฐฐ์—ด ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์„œ [... , newString ]   ๊ณผ ๊ฐ™์ด,  ์Šคํ”„๋ ˆ๋“œ ์—ฐ์‚ฐ์ž (...) ๋ฅผ ์จ์„œ ๊ทธ ๋’ค์— ์ถ”๊ฐ€ํ•œ ๋’ค

์›์†Œ ์ถ”๊ฐ€๋œ ๋ฐฐ์—ด์„ supase์˜ column์— 'update' ํ•ด์ฃผ๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๊ฒ ๋‹ค.

(์ง€๊ธˆ ์ƒ๊ฐํ•ด๋ณด๋ฉด ๊ทธ ๋ฐฉ๋ฒ•์ด ํ›จ์”ฌ ํŽธํ–ˆ์„์ง€๋„..!? ํ•˜์ง€๋งŒ ์ด ๋ฐฉ๋ฒ•์€.. ์ˆ˜ํผ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ” ๋ฐฐ์—ด ์นผ๋Ÿผ์—, ์›์†Œ๋ฅผ ์ง์ ‘ ์ถ”๊ฐ€ํ•ด์ค€๊ฒŒ ์•„๋‹ˆ๋ผ, ์ƒˆ๋กœ์šด ๋ฐฐ์—ด๊ฐ’์œผ๋กœ ์—…๋ฐ์ดํŠธํ•ด์ฃผ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ๊ทธ๋ž˜์„œ ์‹œ๊ฐ„์ด ๋” ๊ฑธ๋ฆด์ง€๋„ ๋ชจ๋ฅธ๋‹ค๋Š” ์šฐ๋ ค๊ฐ€ ์žˆ๋‹ค. ?!) 

 

sql editor - rpc ๋ฅผ ์“ฐ๋Š” ๋ฐฉ๋ฒ•์ด ๋” ํšจ์œจ์ ์ด๋ƒ๊ณ ํ•˜๋ฉด ๋‚˜๋„ ์ž˜ ๋ชจ๋ฅด๊ฒ ๋‹ค ใ…Žใ…Ž 

 

๊ทธ๋Ÿฐ๋ฐ ๋งŒ์•ฝ ์ด๋Ÿฌํ•œ ๋กœ์ง์„ ํ•œ ๋ฒˆ๋งŒ ์“ฐ๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ, ์—ฌ๋Ÿฌ ๋ฒˆ ์ˆ˜ํ–‰ํ• ๊ฑฐ๋ผ๋ฉด

๋งŒ๋“ค์–ด๋‘” rpc ํ•จ์ˆ˜๋ฅผ ๊ฐ€์ ธ์™€์„œ (๋Œ๋ ค)์“ฐ๋ฉด ๋˜๋‹ˆ๊นŒ ์—ฌ๋Ÿฌ๋ฒˆ ํ™œ์šฉํ•  ๊ณ ์ •๋œ ๋กœ์ง์ด ํ•„์š”ํ•˜๋‹ค๋ฉด ์ ํ•ฉํ•œ ๋“ฏ ํ•˜๋‹ค!

 

์—ฌํŠผ ๊ตฌ๊ธ€๋ง์„ ํ•ด๋ดค์„ ๋•Œ ์™ธ๊ตญ ์ปค๋ฎค ๋‹ต๋ณ€์—์„œ๋„

๋ฐฐ์—ด์— ์›์†Œ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฑด rpc ๋ฅผ ์ž์ฃผ ์“ด๋‹ค๋Š” ๋‹ต๋ณ€์„ ๋ดค๊ธฐ ๋•Œ๋ฌธ์— ํ•œ๋ฒˆ ์‹œ๋„ํ•ด๋ณด๊ณ ์‹ถ์—ˆ๋‹ค.

(๊ทผ๋ฐ ๋‚œ  postgreSQL ๋“ฑ sql ์— ์ต์ˆ™ํ•˜์ง€์•Š์•„์„œ... ใ… ใ…  

sql์— ์ต์ˆ™ํ•˜๋‹ค๋ฉด supabase์˜ sql editor๋ฅผ ์ •๋ง ์ž˜ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค. )

 

์—ฌํŠผ ๊ตฌ๊ธ€๋ง ๋์— rpc ๋ฅผ ํ™œ์šฉํ•ด์„œ ๋ฐฐ์—ด ํƒ€์ž… ์ปฌ๋Ÿผ์— ๋ฌธ์ž์—ด ์›์†Œ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค!!

(+ chat gpt์˜ ๋„์›€์€ ๋ค..ใ…Žใ…Ž) 

 

 

 


 

3. ๐Ÿ’šํ•ต์‹ฌ! - Supabase์—์„œ SQL editor๋กœ Postgres functionํ•จ์ˆ˜ ๋งŒ๋“ค์–ด rpcํ™œ์šฉํ•˜๊ธฐ

 

์•„๋ž˜ editor ๋‚ด์šฉ ์ฐธ๊ณ !

 

์ฐธ๊ณ ๋กœ sql editor ์—์„œ ํ•จ์ˆ˜๋ช… ๋“ฑ์—๋Š” ๋Œ€๋ฌธ์ž๊ฐ€ ๋“ค์–ด๊ฐ€๋ฉด ์•ˆ๋œ๋‹ค.

์Šค๋„ค์ดํฌ ์ผ€์ด์Šค ํ˜•ํƒœ (ex. add_post_to_scrapped_posts) ๋กœ ์“ฐ๋ฉด ๋œ๋‹ค. 

 

(ํ…Œ์ด๋ธ” ์ƒ์„ฑ ์‹œ์—๋„ ์นผ๋Ÿผ๋ช…์€ ์Šค๋„ค์ดํฌ ์ผ€์ด์Šค๊ฐ€ ์ข‹๋‹ค .. ํ•˜์ง€๋งŒ ๋‚˜๋Š” ๊ทธ๋ƒฅ ์นด๋ฉœ์ผ€์ด์Šค๋ฅผ ์จ๋ฒ„๋ ธ๊ณ ใ…Žใ…Ž

์นผ๋Ÿผ๋ช…์— ์นด๋ฉœ์ผ€์ด์Šค๋ฅผ ์“ด ๊ฒฝ์šฐ, sql๋ฌธ์—์„œ ๊ทธ๋ƒฅ ์“ฐ๋ฉด ์•ˆ๋˜๊ณ , " " ํฐ๋”ฐ์˜ดํ‘œ๋กœ ๊ฐ์‹ธ์„œ ์จ์ค„ ์ˆ˜ ์žˆ๋‹ค.

์•„๋ž˜ "scrappedCommunityPosts"์ฒ˜๋Ÿผ!  )

-- sql editor

CREATE OR REPLACE FUNCTION add_post_to_scrapped_posts (user_id VARCHAR,post_id TEXT) RETURNS VOID AS $$
DECLARE
  existing_array TEXT[];
BEGIN
  -- ๊ธฐ์กด ๋ฐฐ์—ด์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
  SELECT INTO existing_array "scrappedCommunityPosts" FROM "users" WHERE "userId" = user_id;

  -- ์ƒˆ ๋ฌธ์ž์—ด์„ ๋ฐฐ์—ด์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  existing_array := array_append(existing_array, post_id);

  -- ์—…๋ฐ์ดํŠธ๋œ ๋ฐฐ์—ด์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
  UPDATE "users"
  SET "scrappedCommunityPosts" = existing_array
  WHERE "userId" = user_id;
END;
$$ LANGUAGE plpgsql;

 

 

add_post_to_...posts ๋ผ๋Š” ์ด๋ฆ„์˜ ํ•จ์ˆ˜๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ์ธ์ž๋Š” user_id ์™€ post_id , ์ธ์ž์— ๋ชจ๋‘ ๊ผญ ํƒ€์ž…์„ ์˜†์— ๋ช…์‹œํ•ด์ค˜์•ผ.

SELECT INTO ๋กœ ๊ธฐ์กด ๋ฐฐ์—ด์„ ๊ฐ€์ ธ์˜จ๋‹ค. 

"scrappedCommunityPosts" ์ž๋ฆฌ์— ๊ฐ€์ ธ์˜ฌ ์ปฌ๋Ÿผ๋ช…์„ ์จ์ค€๋‹ค. (๋ฐฐ์—ด ๊ฐ’์„ ๊ฐ€์ง„ ์ปฌ๋Ÿผ)  ..

SELECT INTO existing_array "์ปฌ๋Ÿผ๋ช…" FROM "ํ…Œ์ด๋ธ”๋ช…" WHERE ์กฐ๊ฑด

(WHERE ๋ง๊ณ  LIMIT 1 ๋“ฑ์œผ๋กœ ์ œํ•œํ•ด์ค„์ˆ˜๋„์žˆ๋‹ค)

์—ฌ๊ธฐ์„œ๋Š” users ํ…Œ์ด๋ธ”์˜ userId ์ปฌ๋Ÿผ์˜ ๊ฐ’๊ณผ , ์ธ์ž user_id ๊ฐ€ ๋™์ผํ•˜๋‹ค๋Š” ์กฐ๊ฑด์„ ์ฃผ์—ˆ๋‹ค.

๊ทธ ์กฐ๊ฑด ํ•˜์— ํ•ด๋‹น ์ปฌ๋Ÿผ์˜ ๋ฐฐ์—ด๊ฐ’์„ ๊ฐ€์ ธ์˜จ๋‹ค.

(์—ฌ๊ธฐ์„œ ์ด WHERE ๋’ค์˜ ์กฐ๊ฑด์ด ํ•ต์‹ฌ์ด์—ˆ๋‹ค !!! ์ด๊ฒŒ ์žˆ์–ด์•ผ๋งŒ ์›ํ•˜๋Š” ์ปฌ๋Ÿผ ๋ฐฐ์—ด๊ฐ’ ์„ ๊ฐ€์ ธ์˜ค๊ณ  ์ถ”๊ฐ€ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.)

 

๊ทธ๋ฆฌ๊ณ  := array_append ๋ฅผ ์จ์„œ ๋ฐฐ์—ด์— ์›์†Œ๋ฅผ ์ถ”๊ฐ€ํ•ด์ค€๋‹ค. !!

(PostgreSQL์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ฐฐ์—ด ํ•จ์ˆ˜)

js์—์„œ [ ... ,   ]  ์Šคํ”„๋ ˆ๋“œ ์—ฐ์‚ฐ์ž๋ฅผ ์“ด ๊ฒƒ๊ณผ ๋™์ผํ•œ ์ด์น˜๊ฐ™๋‹ค

 

๊ทธ๋ฆฌ๊ณ  ์—…๋ฐ์ดํŠธ๋œ ๋ฐฐ์—ด์„  SET ํ•ด์ฃผ๋ฉด ๋จ

๊ทธ๋ฆฌ๊ณ  ์—ฌ๊ธฐ์„œ UPDATE ๋’ค์— WHERE ์กฐ๊ฑด์€ ๊ผญ ๋ถ™์—ฌ์•ผ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์—๋Ÿฌ๊ฐ€ ์•ˆ๋‚œ๋‹ค.

 

 

๊ทธ๋Ÿผ ์ด๋ ‡๊ฒŒ sql editor ๋ฅผ ํ†ตํ•ด ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค๋ฉด ์ด์ œ ์ฝ”๋“œ์—์„œ ์“ธ ์ˆ˜ ์žˆ๋‹ค. (์ฐธ๊ณ ๋กœ ์ฝ”๋“œ๋Š” ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ) 

 

supabase ๋Š” ํด๋ผ์ด์–ธํŠธ๋กœ ์—ฐ๊ฒฐํ–ˆ์„ํ…Œ๋‹ˆ supabase.rpc ํ•ด์„œ ์“ฐ๋ฉด๋œ๋‹ค

return ๊ฐ’์ด ์žˆ๋‹ค๋ฉด data ๋ฅผ ๋ฐ›๊ณ , ์—†๋‹ค๋ฉด ๊ทธ๋ƒฅ ์•„๋ž˜์ฒ˜๋Ÿผ error ๊ฐ์ฒด๋งŒ ๋ฐ›์•„์„œ ์—๋Ÿฌ ์‹œ ๋ฉ”์„ธ์ง€๋ฅผ ๋„์šธ ์ˆ˜ ์žˆ๋‹ค. 

supabase.rpc("ํ•จ์ˆ˜๋ช…", {'ํŒŒ๋ผ๋ฏธํ„ฐ๋ช…': ๋„˜๊ฒจ์ค„ ์ธ์ž })
// update.. ๋‚˜๋จธ์ง€ scrappedPosts ์œ ์ง€ํ•˜๋ฉด์„œ ๊ทธ ๋ฐฐ์—ด์— ์ถ”๊ฐ€
export const addScrappedPost = async (userId: string, postId: string) => {
  console.log(userId);
  const { error } = await supabase.rpc('add_post_to_scrapped_posts', { post_id: postId, user_id: userId });
  if (error) {
    console.error(`Failed to add data to Supabase - ${error.message}`);
  }
};

 

 

 

 

 


+

๊ทผ๋ฐ ๋งŒ์•ฝ ํ•จ์ˆ˜๋ฅผ ์ž˜๋ชป ๋งŒ๋“ค์—ˆ๋‹ค๋ฉด?

์ด๊ฒŒ ํ•จ์ˆ˜๊ฐ€ ํ•œ๋ฒˆ ๋งŒ๋“ค๋ฉด ์ €์žฅ์ด ๋˜๋Š”๋ฐ, ์ด๋ฆ„์ด ๊ฒน์นœ๋‹ค๋“ ์ง€? ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค.

์ผ๋‹จ ์ €์žฅ๋œ ํ•จ์ˆ˜๋ฅผ ํ™•์ธํ•ด๋ณด๋ ค๋ฉด ์™ผ์ชฝ ํƒญ์˜ ๋งจ ์•„๋ž˜์˜ API Docs -> Stored Procedures ๋ฉ”๋‰ด๋ฅผ ํ™•์ธํ•ด๋ณด๋ฉด ๋‚˜์™€์žˆ๋‹ค.

์—ฌ๊ธฐ ์ด๋ฏธ์ง€์—์„œ add_post_to_scrapped_posts ๊ฐ€ ์•„๊นŒ ๋งŒ๋“  ํ•จ์ˆ˜์ด๋‹ค.

์ด๊ฑธ ๋ˆŒ๋Ÿฌ ๋“ค์–ด๊ฐ€๋ฉด ์นœ์ ˆํ•˜๊ฒŒ ์•„๋ž˜ ๋‘๋ฒˆ์งธ ์ด๋ฏธ์ง€์™€ ๊ฐ™์ด, rpc ์“ฐ๋Š” ๋ฒ•๋„ ๋‚˜์™€์žˆ๋‹ค. ์ธ์ž ํƒ€์ž…๋„ ๋‚˜์™€์žˆ์Œ

 

์•„๋ž˜์™€ ๊ฐ™์ด ์ž˜๋ชป ๋งŒ๋“  ํ•จ์ˆ˜๋Š” sql editor์—์„œ ์—†์• ์ฃผ๋ฉด ๋œ๋‹ค. (  ) ์•ˆ์— ๊ผญ ์ธ์ž ํƒ€์ž…๊นŒ์ง€ ์จ์ค„ ๊ฒƒ!

DROP FUNCTION IF EXISTS add_post_to_scrappedposts (new_string TEXT);


DROP FUNCTION IF EXISTS ํ•จ์ˆ˜๋ช… (์ธ์ž๋ช… ์ธ์žํƒ€์ž…);

 

SMALL

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

[BaaS] Supabase - Stroage RLS policy ์„ค์ •ํ•ด์ค˜์•ผ ๋ชจ๋‘ ์ด๋ฏธ์ง€๋“ฑ๋ก ๊ฐ€๋Šฅ!  (0) 2024.03.24
[BaaS] Supabase foreign key (์™ธ๋ž˜ ํ‚ค) ํ™œ์šฉํ•ด ํ…Œ์ด๋ธ” ์ƒ์„ฑํ•˜๊ณ  ์กฐํšŒํ•˜๊ธฐ  (2) 2024.03.21
[BaaS/TS] Supabase - Supabase CLI๋กœ Database์˜ ํƒ€์ž… ์ƒ์„ฑํ•˜๊ธฐ  (0) 2024.03.20
[BaaS/Next.js] Supabase ์†Œ๊ฐœ / next.js ํ”„๋กœ์ ํŠธ์™€ ํ•จ๊ป˜ ์„ค์น˜ํ•ด์„œ ํ…Œ์ด๋ธ” ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์™€๋ณด๊ธฐ  (0) 2024.03.20
'๐Ÿชด DB & BaaS' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [BaaS] Supabase - Stroage RLS policy ์„ค์ •ํ•ด์ค˜์•ผ ๋ชจ๋‘ ์ด๋ฏธ์ง€๋“ฑ๋ก ๊ฐ€๋Šฅ!
  • [BaaS] Supabase foreign key (์™ธ๋ž˜ ํ‚ค) ํ™œ์šฉํ•ด ํ…Œ์ด๋ธ” ์ƒ์„ฑํ•˜๊ณ  ์กฐํšŒํ•˜๊ธฐ
  • [BaaS/TS] Supabase - Supabase CLI๋กœ Database์˜ ํƒ€์ž… ์ƒ์„ฑํ•˜๊ธฐ
  • [BaaS/Next.js] Supabase ์†Œ๊ฐœ / next.js ํ”„๋กœ์ ํŠธ์™€ ํ•จ๊ป˜ ์„ค์น˜ํ•ด์„œ ํ…Œ์ด๋ธ” ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์™€๋ณด๊ธฐ
๋ จ๋””
๋ จ๋””
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 ๐Ÿ˜บ
    • ๋„ค์ด๋ฒ„ ๋ธ”๋กœ๊ทธ ๐ŸŽต๐ŸŽง (์ผ์ƒ,์Œ์•… ๋“ฑ)
  • ๊ณต์ง€์‚ฌํ•ญ

  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

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

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.0
๋ จ๋””
[BaaS] Supabase - rpc, SQL editor๋ฅผ ํ™œ์šฉํ•ด ๋ฐฐ์—ด ํƒ€์ž…์˜ ์ปฌ๋Ÿผ์— (๋ฌธ์ž์—ด) ์›์†Œ ์ถ”๊ฐ€ํ•˜๊ธฐ
์ƒ๋‹จ์œผ๋กœ

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