์ด๋ฒ ์ ๊ธฐ๋๋ฌผ ๊ณต๊ณ ๊ด๋ จ ํ ์ด ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉด์,
์ฌ์ฉ์ ๊ด๋ จ ๋ฐ์ดํฐ ๋ก์ง์ Supabase๋ฅผ ํตํด ๊ตฌํํ์๋ค.
๊ทธ๋ฐ๋ฐ ์ฌ๊ธฐ์ Supabase๋ ์ ํํ ์ด๋ค ์ญํ ์ ํ๋ ๊ฑธ๊น?
๐ฅ๏ธ BaaS
- Backend as a Service; ์๋น์คํ ๋ฐฑ์๋
- ํ๋ก ํธ์๋ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ฐฑ์๋ ์๋น์ค๋ฅผ ์ ๊ณตํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ๋ชจ๋ธ์ด๋ค.
- ๋ฐฑ์๋ ์ธก๋ฉด ๊ฐ๋ฐ์ ์๋ํ์ํค๊ณ ํด๋ผ์ฐ๋ ์ธํ๋ผ๋ฅผ ๋ค๋ฃจ๋ ํ๋ซํผ์ด๋ค.
- BaaS์ ์์
- Firebase
- Supabase
- AWS Amplify
- Game Sparks
- BaaS ๊ณต๊ธ์
์ฒด๋ ํ์ฅ์ฑ ๋ฐ ๋ณด์ ๋ณด์ฅ์ ์ํด ํด๋ผ์ฐ๋ ๋ฐ ์๋ฒ๋ฆฌ์ค ํ๊ฒฝ์ ์ ๊ณตํ๋ค.
- BaaS๋ฅผ ํตํด ๊ฐ๋ฐ์๋ ํธ๋ฆฌํ๊ฒ ์ต์์ UI/UX๋ฅผ ์ ๊ณตํ ์ ์๊ฒ ๋๋ฉฐ, ๋ชจ๋ ๋ฐฑ์๋ ์ฝ๋๋ฅผ BaaS ๊ณต๊ธ์
์ฒด์ ์์์์ฑ ํ ์ ์๋ค.
- ๋ค์ ๋งํด ๊ฐ๋ฐ์๋ ์ 3์์๊ฒ ์๋ฒ ์ด์ ๋ฐ ๊ด๋ฆฌ์ ๋ํ ์ฑ
์์ ์ํํ๊ณ ํ๋ก ํธ์๋ ๋ฐ ์ฌ์ฉ์ ์ธก๋ฉด ๊ฐ๋ฐ์ ์ด์ ์ ๋ง์ถ ์ ์๋ค.
- ๋ํ BaaS๋ ๋ฐฑ์๋ ์ฝ๋๋ฅผ ๋ง๋ค๊ณ DX๋ฅผ ํฅ์์ํฌ ์ ์๋ ๋๊ตฌ๋ค์ ์ ๊ณตํ๋ค.
- API๋ฅผ ํตํด DB์ ๋ํ ์ ๊ทผ์ ๋ณด์ฅํ๊ณ , ์ฌ์ฉ์ ์ธ์ฆ, ํ์ผ ์ ์ฅ, ํธ์ ์๋ฆผ, ์๋ํ๋ ํ
์คํธ ์๋ฃจ์
๋ฑ์ ์๋น์ค๊ฐ ํฌํจ๋์ด ์๋ค.
- ์ด๋ก์จ ๊ฐ๋ฐ ํ๋ก์ธ์ค ์๋๊ฐ ํฅ์๋๋ฉฐ ์ต์ข
์ฌ์ฉ์๋ ๊ฐ๋ฅํ ํ ๋น ๋ฅด๊ฒ ์๋น์ค์ ์ ๊ทผํ ์ ์๊ฒ ๋๋ค.
BaaS VS. Custom Backend
- ๋ฐฑ์๋๋ฅผ ์ง์ ์ปค์คํ
ํ ๊ฒฝ์ฐ ์ง์ ๋ฐฑ์๋ ์์ญ์ ๊ตฌ์ถํ๊ณ ์ธํ๋ผ๋ฅผ ๋ค๋ค์ผ ํ๋ค.
- ์ฅ์ : ์ ์ฐ์ฑ ๋ฐ ๋ง์ถคํ ๊ธฐ๋ฅ
- ๋จ์ : ๋ ๋์ ๊ฐ๋ฐ ๋น์ฉ๊ณผ ์๊ฐ ์๋ชจ
- BaaS๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ ๋ง๋ค์ด์ง ๋ธ๋ก๊ณผ ์ฝ๋ ์์ฑ ๋๊ตฌ๋ฅผ ์ด์ฉํ ์ ์๋ค.
- ์ฅ์ : ๋น ๋ฅธ ๊ฐ๋ฐ ์๋, ๊ฐ๋ฐ ๋น์ฉ ์ ์ฝ, ํด๋ผ์ฐ๋ ์ธํ๋ผ ๊ด๋ฆฌ ์ํ
- ๋จ์ : ์ ์ฐ์ฑ์ด ๋ฎ๊ณ ํ์คํ๋ ๊ตฌ์กฐ๋ฅผ ๋ฐ๋ฅด๊ฒ ๋๋ค.
๐ฅ Firebase ๋์ Supabase๋ฅผ ์ฌ์ฉํ๋ ์ด์
Firebase ์ฅ์
- ์น์์ผ๊ณผ SSE(Server-Sent-Event)๊ฐ ๋์คํ ๋๊ธฐ ์ ๊น์ง ํ์ ์ ์ธ ์ค์๊ฐ DB๋ฅผ ์ ๊ณตํ๋ค.
- RTSP(Real-Time-Stream-Protocol) ๋ฐฉ์์ DB๋ฅผ ์ง์ํ์ฌ ์ค์๊ฐ ๋ฐ์ดํฐ ๋๊ธฐํ ๊ธฐ๋ฅ์ ๋ฌด๋ฃ๋ก ์ ๊ณตํด์ค๋ค.
- ์ต์ ๋ฐ์ดํฐ์ ๊ด๋ จ๋ ํด๋ผ์ด์ธํธ ์ํ ๊ด๋ฆฌ ๋ฌธ์ ์ ์ด ํด๊ฒฐ๋๋ค.
- ์๋ฒ ๊ด๋ฆฌ์ ํ์ด์ง, ์๊ฒฉ ๊ตฌ์ฑ ๋ฐ ์ฌ์ฉ์ ํต๊ณ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ค.
Firebase ๋จ์
- ์๋ฒ๊ฐ ํด์ธ์ ์์นํ์ฌ ์๋ฒ์ ์๋ต ์ฒ๋ฆฌ ์๋๊ฐ ๋๋ ค์ง ๋๊ฐ ์๋ค.
- NoSQL ๊ธฐ๋ฐ์ DB์ด๋ฏ๋ก ์ฟผ๋ฆฌ๊ฐ ๋น์ฝํด ๋ฐ์ดํฐ ๊ฒ์์ด ์ด๋ ต๋ค.
- ๋ก์ปฌ์์์ ์๋ฒฝํ ์คํ์ด ๋ถ๊ฐ๋ฅํ๋ฉฐ ์ธ๋ฑ์ค ์์ฑ์ด ๋๋๋ค.
- ์คํ์์ค๊ฐ ์๋๋ผ ์ง์์ ์ผ ๊ฒ์ด๋ผ๋ ๋ณด์ฅ์ด ์๊ณ , CLI(๋ช
๋ น์ค ์ธํฐํ์ด์ค)๊ฐ ํ์์ ์ด๋ค.
- Cloud Function CI/CD(์ง์์ ํตํฉ/์ง์์ ๋ฐฐํฌ)๊ฐ ๋๋น ์ก๋ค.
๊ทธ๋์, Supabase
- Supabase๋ PostgreSQL ๊ธฐ๋ฐ์ SQL DB ๊ธฐ๋ฅ๊ณผ REST API, ์ด๋ฒคํธ ์ฒ๋ฆฌ ๋ฑ์ ๊ณ ์ ํ ๊ธฐ๋ฅ์ ์คํ์์ค๋ก ์ ๊ณตํ๋ค.
- Firebase์ฒ๋ผ ํธ๋ฆฌํ๋ฉฐ Firebase์์๋ ์ ๊ณตํ์ง ๋ชปํ๋ RDB๋ฅผ ์ ๊ณตํ๋ค.
- RDB(Relational-DataBase): ์์
์ํธ์ฒ๋ผ ๋น ์นธ์ ๋ด์ฉ์ ์ฑ์๊ฐ๋ DB ๋ฐฉ์
- ํธ๋ฆฌํ ์ฌ์ฉ์ฐฝ
- SQL Editor: SQL ์ฟผ๋ฆฌ๋ฅผ ์นํ์ด์ง์์ ์์ฑ, ์ ์ฅ, ์คํ ๊ฐ๋ฅํ๊ฒ ํด์ค๋ค. ํ
์ด๋ธ ์คํค๋ง๋ฅผ ์ฝ๊ฒ ์์ฑํ ์ ์๋ค.
- Table Editor: DB ๋ด๋ถ์ ๋ฐ์ดํฐ๋ฅผ ์คํ๋ ๋์ํธ(์์
)์ฒ๋ผ ๋ณผ ์ ์๋ค.
- ํด๋ผ์ด์ธํธ, ์๋ฒ ํ๊ฒฝ ๋ ๊ณณ์์ ๋์ผํ ๋ฐฉ์์ ์์
์ด ๊ฐ๋ฅํ๋๋ก isomorphic JavaScript ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ๊ณตํ๋ค.
- isomorphic: ๋ํ ์ฌ์. ์๋ก ๊ตฌ์กฐ๊ฐ ๊ฐ์ ๋ ๋์ ์ฌ์ด์ ๋ชจ๋ ๊ตฌ์กฐ๋ฅผ ๋ณด์กดํ๋ ์ฌ์
๐ค Supabase, ์ด๋ ๊ฒ ์ฌ์ฉํฉ์๋ค!
ํ๋ก์ ํธ ์์ฑํ๊ธฐ
์์
๋ก๊ทธ์ธ ๊ตฌํํ๊ธฐ
const { data, error } = await supabase.auth.signUp({
email: "example@email.com",
password: "example-password",
});
supabase.auth.signup
๋ฅผ ํธ์ถํด Supabase์ ์๋ฒ์ ์ ์ฅ๋ ์๋ก์ด ์ ์ ๋ฅผ ์์ฑํ ์ ์๋ค.
- ์ด๋ฌํ ์ฌ์ฉ์์ ๋ํ ๋ก๊ทธ์ธ์ ๊ตฌํํ๋ ค๋ฉด
- ๋จ์ ID/password ๋ก๊ทธ์ธ: supabase.auth.signInWithPassword
- ๋ก๊ทธ์ธ ๋ ์ ์ ์ ๋ณด ํ์ธ:
supabase.auth.getUser()
(์ธ์
์ด ๋ก์ปฌ ์ฟ ํค์ ์ ์ฅ๋จ)
์์
๋ก๊ทธ์ธ ๊ตฌํํ๊ธฐ
- Supabase๋ 10๊ฐ ์ด์์ ์ฃผ์ ์์
๋ก๊ทธ์ธ ํ๋ก๋ฐ์ด๋๋ฅผ ๊ตฌํํ๊ณ ์์ด์ ๊ฐํธํ๊ฒ ์ฝ๋ ๋ช ์ค๋ง ์
๋ ฅํ๋ฉด ์์
๋ก๊ทธ์ธ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋ค.
async function signInWithGoogle() {
const { data, error } = await supabase.auth.signInWithOAuth({
provider: "google",
});
}
DB ์์ฑํ๊ธฐ
- Supabase ํ๋ก์ ํธ ์์ฑ ์ ๊ฐ์ด ๋ง๋ค์ด์ง PostgreSQL DB๋ Supabase ํ์ด์ง์ ๋์๋ณด๋์์ ๊ฐํธํ๊ฒ ๊ด๋ฆฌํ ์ ์๋ค.
- ํ
์ด๋ธ์ ์๋ก ์ถ๊ฐํ๋ ค ํ๋ค๋ฉด ์๋์ ์ฐฝ์ ์ด๋ฆ์ ๋ถ์ฌํ์ฌ ์์ฑํ ์ ์๋ค.
- ๊ฐ ๋ฐ์ดํฐ์ key์ value์ type ๋ฑ๋ ํธ๋ฆฌํ๊ฒ ์ค์ ํ ์ ์๋ค.
- ์ด์ฒ๋ผ ํ
์ด๋ธ์ ์์ฑํ๋ฉด ์ด์ ์ ๊ทผํ๊ธฐ ์ํ REST API๊ฐ ์๋ ์์ฑ๋๊ณ , ํด๋ผ์ด์ธํธ ์ธก์์๋ SDK๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๊ฒ ์ ๊ทผํ ์ ์๋ค.
- SDK (Software Development Kit): ์ํํธ์จ์ด ๊ฐ๋ฐ ๋๊ตฌ ๋ชจ์
- ํ๋ก ํธ์๋์์ DB ์ฟผ๋ฆฌ๋ฅผ ํ์์ ๋ฐ๋ผ ์ง์ ์์ฑํด ์คํํ ์ ์์ผ๋ฏ๋ก ๋จ์ CRUD๋ฅผ ์ํด ๋ฐฑ์๋์์ ๋ณ๋์ API๋ฅผ ๊ตฌํํ ํ์๊ฐ ์๋ค.
RLS (Row-Level-Security)
- ํ ์์ค ๋ณด์
- '์์ ์ ๋ฐ์ดํฐ๋ง ๊ฐ์ ธ์ฌ ์ ์๋ค'๋ฅผ ๊ตฌํํ ์ ์๋ ๋ณด์ ์ ์ฑ
์ค์ ์ด ๊ฐ๋ฅํ๋ค.
- ํ๋ก ํธ์๋ ์ธก์์ ํ์ํ DB ์ฟผ๋ฆฌ๋ฅผ ์ง์ ์คํํ๊ธฐ ์ํด ํ์ํ๋ค.
- PostgreSQL์ Row Level Security ๊ธฐ๋ฅ์ ํตํด Supabase์ ๊ตฌํ๋์ด ์๋ค.
- ์: Supabase ๋์๋ณด๋๋ฅผ ์ฌ์ฉํด ํน์ ํ
์ด๋ธ์ ๋ํด ๋ณธ์ธ์ Row๋ง ์กฐํ ๊ฐ๋ฅํ๋ค๋ ์ ์ฑ
์ถ๊ฐํ๊ธฐ
- ์ด๋ Supabase๋ ์๋ฌต์ ์ผ๋ก ์ด ์ ์ฑ
์ ๊ธฐ๋ฐํ์ฌ ์ฌ์ฉ์๊ฐ ์คํํ๋ ์ฟผ๋ฆฌ์ ๋ํ ํํฐ๋ง ์กฐ๊ฑด์ ์๋์ผ๋ก ์ถ๊ฐํด์ค๋ค.
๐ References