Supabase๋ก TABLE์ ์์ฑํ์ฌ CRUD๋ฅผ ํ๋ ค ํ๋๋ฐ ๋ญ ํ ๋๋ง๋ค
๊ถํ์ด ์๋ค
์ ๊ทผ์ด ์ ํ๋์๋ค
์คํค๋ง์ ๋น์ ์ด ์์ฑํ TABLE์ด ์กด์ฌํ์ง ์๋๋ค
๋ฑ ๋ด ๊ธฐ์ค ์ฉ๋ฑ๋ง์ ์๋ฌ๊ฐ ๋๋ฌด ๋ง์ด ๋๋ค.
์๋ฌด๋๋ ๋ด๊ฐ SQL์ ์์ฃผ ๋ง์ด ๊น๋จน์ ๊ฒ ๊ฐ์๋ฐ....๋ค์ ๋ณต์ต ๊ฒธ ์ ๋ฆฌํด์ผ๊ฒ ๋ค.
1. ๋ด๊ฐ ํ์ฌ ์ ์ํ ๊ณ์ (User) ์๊ธฐ
SELECT current_user;
์ด๋ผ๊ณ ์ ์ํ๋ฉด

์ด๋ ๊ฒ ๋จ๋๋ฐ ๊ทธ๋ผ ์ฌํ๊น์ง postgreSQL์ ์ต์์ ๊ด๋ฆฌ์ ๊ณ์ ์์ ์ค์ ์ ์งํํ๋ค๋ ๋ป์ด๋ฏ๋ก ์ ๋ ์ด ๊ณ์ ์ผ๋ก ์ ์๋์ด ์์ผ๋ฉด ์๋๋ค..
๊ฐ ์ ์์ด์ง๋ง Supabase์์ postgres๊ฐ ์๋ ๋ค๋ฅธ ๊ณ์ ์ผ๋ก ์ ์ํ ์ ์๋ค๊ณ ํ๋ค.
๋ฌผ๋ก ์ผ๋ฐ์ ์ธ PostgreSQL์์ ๊ณ์ ์ ๋ฐ๊ฟ ์ ์๋ค. ์๋ ์คํ๋ ค ๋ฐ๊ฟ์ ํด์ผ ํ๋ค..!
2. ๋ด DB์ ์ญํ (Role) ์ ์ฒด๋ฅผ ์๊ธฐ
Supabase์์ Database > Configuration > Roles์ ๊ฒ์ํ๋ฉด Supabase์์ ์ ๊ณตํ๋ ๋ค์ํ Role, ๊ทธ๋ฆฌ๊ณ PostegreSQL์ ์ต๊ณ ๊ด๋ฆฌ์์ธ postgres๊ฐ ๋์จ๋ค.

ํต์ฌ์ ์ธ๊ฒ๋ง ์์ฑํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
- ์ ํ๋ฆฌ์ผ์ด์
์ฌ์ฉ์
- anon : Anonymous = ์ต๋ช ์ฌ์ฉ์, ๋ก๊ทธ์ธํ์ง ์์ ์ํ์ ํด๋ผ์ด์ธํธ ์์ฒญ์ ์ฌ์ฉ๋๋ค.
- ๊ด๋ฆฌ ๋ฐ ์ ๊ทผ
- anthenticated : ์ธ์ฆ๋ ์ฌ์ฉ์. ๋ก๊ทธ์ธํ ์ฌ์ฉ์์ ํด๋ผ์ด์ธํธ ์์ฒญ์ ์ฌ์ฉ๋๋ค.
- postgres : ์ต๊ณ ๊ด๋ฆฌ์(Superuser), ๋ชจ๋ ๊ถํ์ ๊ฐ์ง๋ฉฐ ์ผ๋ฐ์ ์ธ ํ ์คํธ๋ ์ด์์์ ์ฌ์ฉ๋์ ์๋๋ค.
- supabase_admin : ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๋ฆฌ์. postgres์ ์ ์ฌํ๋ ์ฃผ๋ก Supabase ๋ด๋ถ ๊ด๋ฆฌ ์์ ์ ์ฌ์ฉ๋๋ค.
- ์ธ์ฆ ๋ฐ ์ฐ๊ฒฐ
- authenticator : ํด๋ผ์ด์ธํธ์ JWT ํ ํฐ์ ๊ฒ์ฆ, ์ธ์ ๊ถํ์ anon ํน์ authenticated๋ก ์ ํํ๋ ์ญํ . ๋ฐ์ดํฐ๋ฅผ ์ง์ ์ฝ๊ฑฐ๋ ์ฐ์ง ์๋๋ค.
- pgbouncer : ์ฐ๊ฒฐ ํ๋ง ์ญํ . ๋ค์์ ํด๋ผ์ด์ธํธ ์์ฒญ์ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ์ฌ DB ๋ถํ๋ฅผ ์ค์ธ๋ค.
์ง๊ธ ๋ด๊ฐ DB์ ์ ์ํ ๊ณ์ ์ postgres์ด์ง๋ง, ์ค์ ์๋น์ค์์ ํด๋ผ์ด์ธํธ๋ postgres, ์ฆ ๊ณ์ ์ผ๋ก ์ ๊ทผํ์ง ์๋๋ค.
Supabase์์๋ ํด๋ผ์ด์ธํธ ์์ฒญ์ด ๋ค์ด์ฌ ๋ โญโญ์ต๋ช
์ฌ์ฉ์์๊ฒ๋ anon ์ญํ , ๋ก๊ทธ์ธํ ์ฌ์ฉ์์๊ฒ๋ authenticated ์ญํ ์ด ์๋์ผ๋ก ์ ์ฉ๋๋ค. โญโญ
anon๊ณผ authenticated๋ ์ง์ ๋ก๊ทธ์ธํ ์ ์๋ DB ๊ณ์ ์ด ์๋๊ธฐ ๋๋ฌธ์, DB ๋ด๋ถ์์ ์ด ์ญํ ์ ํ
์คํธํ๋ ค๋ฉด SET ROLE anon ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ญํ ์ ์ ํํด ๋์์ ํ์ธํ๋ค.
SET ROLE anon;
-- ๋๋ SET ROLE authenticated;
-- ์ฌ๊ธฐ์ ํ
์คํธ ์ฟผ๋ฆฌ ์คํ (SELECT, INSERT ๋ฑ)
RESET ROLE; -- ๊ด๋ฆฌ์ ๊ณ์ ์ผ๋ก ๋์์์ผ ํ๋ค.
๊ณ์ (User) vs ์ญํ (Role)
๊ณ์ (User)
postgreSQL์์ User๋ DB์ ์ ์ํ ์ ์๋ ์ฃผ์ฒด์ด๋ค.
์ฆ, ์์ด๋ + ๋น๋ฐ๋ฒํธ๋ก ์ง์ง ์ ์ํ ์ ์๋ ์ฌ์ฉ์
Supabase๋ ๋ณด์๊ณผ ๊ตฌ์กฐ์ PostgreSQL์ ์ผ๋ฐ์ ์ธ ๊ณ์ ๋ฐฉ์์ ์ ํํ๊ณ ,
๊ฒฐ๊ตญ ์ง์ DB์ ๋ก๊ทธ์ธํ ๋๋ postgres ํ๋๋ง ์ฐ๊ฒ ๋ง๋ค์ด๋จ๋ค.
์ญํ (Role)
๊ถํ ๋ฌถ์(permissions group)์ ๊ฐ๋ .
์ด๋ค ์ก์ ์ ํ ์ ์๋์ง, ์ด๋ค ํ ์ด๋ธ์ ์ฝ๊ณ ์ธ ์ ์๋์ง, ์ด๋ค ์ ์ฑ ์ด ํ์ฉ๋๋์ง์ ๋ํ ์ค์ ์ ํ๊บผ๋ฒ์ ๋ฌถ์ด์ ์ ์ฉํ ์ ์๋ ๊ฒ์ด๋ค.
์ฆ, ๋ก๊ทธ์ธ ์์ฒด๋ User๋ก ํ๊ณ ,
๊ทธ User๊ฐ ์ด๋ค ํ๋์ ํ ์ ์๋์ง๋ Role์ด ๊ฒฐ์ ํ๋ค.
๋ค์ํ๋ฒ ๊ฐ์กฐํ์ง๋ง, ํท๊ฐ๋ฆฌ๋ฉด ์๋๋ ์ฌ์ค์
anon๊ณผ authenticated๋ ๊ณ์ (User)์ด ์๋๋ผ ์ญํ (Role)
3. ๋ด ํ ์ด๋ธ๋ค์ ์ ์ฑ (Policy) ํ์ธํ๊ธฐ
์ง๊ธ ๋ด๊ฐ ์ฌ์ฉํ๋ ์คํค๋ง(public, dalmuri)์ ์ ์ฑ ์ ๋ณด๋ฉด


๋ค์๊ณผ ๊ฐ์ด ๋์ด ์๋๋ฐ, applied to์ public์ด๋ผ๊ณ ๋์ด ์๋ค.
ํท๊ฐ๋ฆฌ์ง ์์๊ฒ : Row Level Security(RLS)์์ public์ด ์๋ฏธํ๋ ๋์
์ฌ๊ธฐ์ public์ schema์ ์๋ public์ด ์๋๋ผ anon, authenticated...๋ฑ๋ฑ DB์ ์ ๊ทผํ ์ ์๋ '๋ชจ๋ ์ญํ (Roles) ๊ทธ๋ฃน'๋ค์ ์ ๊ทผ์ ํ์ฉํ๋ค๋ ๋ป์ด๋ค.
โ ๏ธ ๋จ, postgres(์ํผ๊ณ์ , ๊ทธ๋๊น ๊ณ์ )์ RLS ์ ์ฑ ์ ์ํฅ์ ๋ฐ์ง ์์ผ๋ฉฐ, ์ด๋ ํ ์ ์ฑ ์ด ์ค์ ๋์ด ์์ด๋ ๋ชจ๋ ํ ์ด๋ธ์ ์์ ๋กญ๊ฒ ์ ๊ทผํ๋ค ๐ postgres๋ “๊ณ์ (user)”์ด์ “์ํผ์ ์ ์ญํ ”์ ๋์์ ๊ฐ์ง ์กด์ฌ → ์ผ๋ฐ ์ญํ ๊ณผ ๋ฌ๋ฆฌ RLS๋ฅผ ์์ ๋ฌด์ํ๊ณ ๋ค ํต๊ณผํ๋ค.
public ์์ ์๋ VIEW๋ ๋ด๊ฐ openAPI๋ก ์ด์ด๋๊ธฐ ๋๋ฌธ์ ๊ทธ๋ ๋ค๊ณ ์ณ๋, dalmuri ์คํค๋ง ์์ ํ ์ด๋ธ๋ค์ anon, authenticated ์ญํ ์์๋ง ์ ๊ทผ ๊ฐ๋ฅํด์ผํ์ง ์๋? ์ถ์ด์ gpt์๊ฒ ๋ฌผ์ด๋ดค๋ค..
์งํผํฐ ์ ๐ฝ :
“dalmuri ์คํค๋ง insert/delete๋ anon/authenticated๋ง ๋๊ฒ ํด์ผ ํ์ง ์๋?”
๐ ์๋ฒฝํ๊ฒ ๋ง์. ๊ทธ๋ฆฌ๊ณ Supabase๋ ์๋ ๊ทธ๋ ๊ฒ ๋์ํด.
• open API๋ JWT๋ก Supabase์์ ์๋์ผ๋ก ROLE์ ์ ํด์ค.
• ๋ก๊ทธ์ธ ์ ํจ → anon ๋ก๊ทธ์ธ ํจ → authenticated postgres ๋ฑ์ API๋ก ์ ๊ทผ ๋ถ๊ฐ
• ์ฆ, API๋ฅผ ํตํด dalmuri์ insert/delete๋ฅผ ํ ์ ์๋ ์ญํ ์ ์๋ anon/authenticated ๋ ๊ฐ๋ฟ์ด์ผ.
• ๋ค๊ฐ ์๋์ผ๋ก ๋ค๋ฅธ ROLE์ ๋ง๋ค์ง ์๋๋ค๋ฉด ๋ค๋ฅธ ROLE์ด ์ ๊ทผํ ์ผ ์์ฒด๊ฐ ์์ด.
์ ์ ํ ๊ถํ ์ค์ :
GRANT INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA dalmuri TO anon, authenticated;โ“public schema ์์ view๋ ๋ชจ๋ ROLE(public)์ select ๊ฐ๋ฅํ๋๋ก ํด๋ ๋๋ ๊ฑด๊ฐ?”
๐๊ธฐ์ ์ ์ผ๋ก๋ “public ๊ทธ๋ฃน์ SELECT๋ฅผ ํ์ฉํ๋ค”๋ ๋ป์ด์ง๋ง, Supabase ํ๊ฒฝ์์๋ ๋ค์์ฒ๋ผ ์๋ํด:
โ ์ค์ ๋ก DB์ ์ ๊ทผํ ์ ์๋ ROLE์ postgres, anon, authenticated ์ธ ๊ฐ๋ฟ์ด์ผ.
์ด ์ค์์ API๋ก ์ ๊ทผ ๊ฐ๋ฅํ ๊ฑด anon/authenticated๋ฟ.
์ฆ, ๊ฒฐ๊ตญ public์ SELECT๋ฅผ ์ค๋ API๋ฅผ ํตํด SELECT๋ฅผ ์คํํ๋ ๊ฑด anon/authenticated ๋๋ฟ์ด์ผ.
๊ทธ๋์ “public์ด๋ผ์ ์๋ฌด๋ ์ ๊ทผ ๊ฐ๋ฅํ ๊น?”๋ ๊ฑฑ์ ํ์ง ์์๋ ๋ผ.
Supabase์์ ๊ถ์ฅํ๋ ๊ถํ ์ค์ :
REVOKE ALL ON ALL TABLES IN SCHEMA public FROM public; GRANT SELECT ON ALL TABLES IN SCHEMA public TO anon, authenticated;โ
- ๊ถํ์ anon, authenticated๋ง ๋ช ์์ ์ผ๋ก ํ์ฉ
- postgres, supabase_admin ๋ฑ ์์คํ ๊ณ์ ์๊ฒ๋ ์ง์ ๊ถํ์ ๊ฑด๋๋ฆฌ์ง ์๋๋ค.
๋ฐ๋ผ์ CRUD๊ถํ์ ๋ชจ๋ ์ญํ ์ ์ฃผ๋ ๊ฒ๋ณด๋ค ํน์ ์ญํ (anon, authenticated)์๋ง ์ฃผ๋ ์ชฝ์ด ์ข๋ค!



'Backend๐ฅ๏ธ > DB, SQL๐ข๏ธ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [Supabase] cron (์ค์ผ์ค๋ง) ์ค์ ํ๊ธฐ (0) | 2025.12.02 |
|---|---|
| [SQL] Connection Pool์ด๋ ๋ฌด์์ธ๊ฐ (0) | 2025.11.26 |
| [Supabase] Supabase์ ๋ํด ์์๋ณด๊ธฐ, ๊ธฐ๋ณธ ์ธํ (0) | 2025.11.25 |