[โœˆ๏ธ ์ตœ์ข…ํ”„๋กœ์ ํŠธ] supabase ์—์„œ transaction ์ ์šฉํ•˜๊ธฐ

โœ… ๊ฐœ์š”

๊ฒŒ์‹œ๊ธ€ ์‚ญ์ œ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ณผ์ •์—์„œ, ๊ฒŒ์‹œ๊ธ€์„ ์‚ญ์ œํ•  ๋•Œ ํ•ด๋‹น ๊ฒŒ์‹œ๊ธ€์— ์—ฐ๊ด€๋œ ์ด๋ฏธ์ง€๋„ ํ•จ๊ป˜ ์‚ญ์ œ๋˜์–ด์•ผ ํ•œ๋‹ค. ์ด ์ž‘์—…์€ ๊ฒŒ์‹œ๊ธ€๊ณผ ์ด๋ฏธ์ง€ ๋‘ ๊ฐœ์˜ ํ…Œ์ด๋ธ”์—์„œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์ด๋ฃจ์–ด์ ธ์•ผ ํ•˜๋ฉฐ, ๋‘˜ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ์‹คํŒจํ•  ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ์ด ๊นจ์งˆ ์œ„ํ—˜์ด ์žˆ๋‹ค. 

 

๊ทธ๋Ÿฌ๋‚˜... ์ˆ˜ํŒŒ๋ฒ ์ด์Šค๋Š” ํ˜„์žฌ ํŠธ๋žœ์žญ์…˜์„ ๊ฐ„ํŽธํ•˜๊ฒŒ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ ํ•œ๋‹ค. supabase Discussion ์—๋„ ์–ธ๊ธ‰๋˜์—ˆ๋“ฏ, ์ˆ˜ํŒŒ๋ฒ ์ด์Šค๋Š” PostgreSQL ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๊ณ  ์žˆ์–ด์„œ PostgreSQL ์—์„œ ์ œ๊ณตํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜๋ฉด ํŠน์ • ์ฟผ๋ฆฌ์— ๋Œ€ํ•ด ํŠธ๋žœ์žญ์…˜์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค! ๐Ÿฅน

 

๋”ฐ๋ผ์„œ ๋‘ ์š”์ฒญ(๊ฒŒ์‹œ๊ธ€ ์‚ญ์ œ/์ด๋ฏธ์ง€ ์‚ญ์ œ) ์„ ์•ˆ์ „ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋ ค๋ฉด PostgreSQL ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ํŠธ๋žœ์žญ์…˜์„ ์ ์šฉํ•ด ๋ณด๋„๋ก ํ•˜์ž.

 

โœ… ํ•จ์ˆ˜ ๋งŒ๋“ค๊ธฐ

PostgreSQL ๋ฌธ์„œ  ๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ PostgreSQL ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ํŠธ๋žœ์žญ์…˜์ด ์ ์šฉ๋˜๋„๋ก ๊ตฌํ˜„ํ–ˆ๋‹ค. 

create or replace function delete_post_and_images(post_id uuid)
returns void as $$
begin
  -- ๊ฒŒ์‹œ๊ธ€ ์‚ญ์ œ
  update posts
  set deleted_at = now()
  where posts.post_id = post_id;

  -- ์ด๋ฏธ์ง€ ์‚ญ์ œ
  update images
  set deleted_at = now()
  where images.post_id = post_id;

exception
  when others then
  
    raise;
end;
$$ language plpgsql;

๊ฒŒ์‹œ๊ธ€๊ณผ ์ด๋ฏธ์ง€๋ฅผ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ์‚ญ์ œํ•˜๋Š” ๋Œ€์‹  deleted_at ํ•„๋“œ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋ฐฉ์‹์„ ์ฑ„ํƒํ–ˆ๋‹ค. 

 

export const fetchDeletePost = async (postId: string) => {
  const supabase = createClient();

  const { data, error } = await supabase.rpc('delete_post_and_images', {
    post_id: postId,
  });

  if (error) {
    console.log('๊ฒŒ์‹œ๋ฌผ ์‚ญ์ œ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ ', error);
    throw new Error(`๊ฒŒ์‹œ๋ฌผ ์‚ญ์ œ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: ${error.message}`);
  }

  return { message: '๊ฒŒ์‹œ๋ฌผ ์‚ญ์ œ ์„ฑ๊ณต', data };
};

Supabase์—์„œ ์ด ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์œ„ํ•ด ์•„๋ž˜์™€ ๊ฐ™์ด rpc ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค.

 

โœ… ํŠธ๋žœ์žญ์…˜ ํ…Œ์ŠคํŠธ

ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์—ˆ์œผ๋‹ˆ, ํŠธ๋žœ์žญ์…˜์ด ์ž˜ ์ ์šฉ๋˜๋Š”์ง€ ํ…Œ์ŠคํŠธํ•ด ๋ณด๊ณ  ์‹ถ์—ˆ๋‹ค.  ์–ด๋–ป๊ฒŒ ํ…Œ์ŠคํŠธํ•˜์ง€...?

 

๊ณ ์˜๋กœ ์˜ค๋ฅ˜ ๋‚ด๊ธฐ ํ…Œ์ŠคํŠธ

ํ•จ์ˆ˜์˜ ํŠธ๋žœ์žญ์…˜์ด ์ œ๋Œ€๋กœ ๋™์ž‘ํ•˜๋Š”์ง€ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•ด ์ผ๋ถ€๋Ÿฌ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•์„ ๊ณ ์•ˆํ–ˆ๋‹ค. ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ํ•จ์ˆ˜๋ฅผ ์•ฝ๊ฐ„ ์ˆ˜์ •ํ•˜์—ฌ ๊ฒŒ์‹œ๊ธ€์˜ post_id ์™€ ์ด๋ฏธ์ง€์˜ post_id ๋ฅผ ๊ฐ๊ฐ ๋ณ„๋„์˜ ๊ฐ’์œผ๋กœ ๋ฐ›๋„๋ก ๋ณ€๊ฒฝํ–ˆ๋‹ค. ์ดํ›„ images ์˜ post_id ์— ์ž˜๋ชป๋œ ๊ฐ’์„ ๋„ฃ์–ด ์˜ค๋ฅ˜๋ฅผ ์œ ๋„ํ–ˆ๋‹ค.

create or replace function delete_post_and_images(post_post_id uuid, image_post_id uuid)
returns void as $$
begin
  -- ๊ฒŒ์‹œ๊ธ€ ์‚ญ์ œ
  update posts
  set deleted_at = now()
  where posts.post_id = post_post_id;

  -- ์ด๋ฏธ์ง€ ์‚ญ์ œ
  update images
  set deleted_at = now()
  where images.post_id = image_post_id;

exception
  when others then
   
    raise;
end;
$$ language plpgsql;

 

ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ

  • ๊ณ ์˜๋กœ ์˜ค๋ฅ˜ ๋ฐœ์ƒ : images ํ…Œ์ด๋ธ”์˜ post_id ์— ์ด์ƒํ•œ ๊ฐ’์„ ๋„ฃ์–ด ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ, ํ•จ์ˆ˜ ์‹คํ–‰ ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.
  • ํŠธ๋žœ์žญ์…˜ ๋กค๋ฐฑ ํ™•์ธ : ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  posts ์™€ images ํ…Œ์ด๋ธ” ๋ชจ๋‘์—์„œ deleted_at ํ•„๋“œ๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š์•˜๋‹ค.

์‚ฌ์‹ค ํ…Œ์ŠคํŠธ ๋ฐฉ๋ฒ•์ด ์ ์ ˆํ•œ์ง€ ํŒ๋‹จ์ด ์„œ์ง€๋Š” ์•Š์ง€๋งŒ... ์ด์ •๋„๋ฉด ํŠธ๋žœ์žญ์…˜์ด ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ๋ด๋„ ๋˜๊ฒ ์ง€..?? :)

์•„๋ฌดํŠผ! ์ž˜ ๋˜๋Š” ๊ฑฐ๋กœ ๋ณด๊ณ ! ๋‘ ์ž‘์—…(๊ฒŒ์‹œ๊ธ€ ์‚ญ์ œ์™€ ์ด๋ฏธ์ง€ ์‚ญ์ œ) ์ค‘ ํ•˜๋‚˜๋ผ๋„ ์‹คํŒจํ•  ๊ฒฝ์šฐ ์ „์ฒด ์ž‘์—…์ด ๋กค๋ฐฑ๋˜์–ด ๋ฐ์ดํ„ฐ์˜ ๋ฌด๊ฒฐ์„ฑ์ด ์œ ์ง€๋œ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค!! 

 

โœ… ๊ฒฐ๋ก 

PostgreSQL ํ•จ์ˆ˜๋ฅผ ํ™œ์šฉํ•œ ํŠธ๋žœ์žญ์…˜ ๊ตฌํ˜„๊ณผ Supabase์˜ rpc ํ˜ธ์ถœ์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ์„ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ํŠนํžˆ, ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•ด ํŠธ๋žœ์žญ์…˜์ด ์˜๋„ํ•œ ๋Œ€๋กœ ๋™์ž‘ํ•˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์€ Supabase์™€ PostgreSQL์˜ ๊ฐ•๋ ฅํ•œ ์กฐํ•ฉ์„ ํ™œ์šฉํ•œ ์‹ค์šฉ์ ์ธ ์ ‘๊ทผ๋ฒ•์ด๋ผ ์ƒ๊ฐ๋œ๋‹ค.

 


๊ฐœ์„ ํ•˜๊ฑฐ๋‚˜ ๊ณ ๋ฏผ์ด ํ•„์š”ํ•œ ๋ถ€๋ถ„์ด ์žˆ๋‹ค๋ฉด ์–ธ์ œ๋“  ๊ณต์œ  ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค!