๐Ÿš€ ๋‚˜๋Š” supabase-markdown์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค โ€” ๋ชจ๋“  ์Šคํ‚ค๋งˆ์— ๊ฑธ์ณ ์ „์ฒด Supabase ERD๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋„๊ตฌ (Visualizer๊ฐ€ ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์—)

๋ฐœํ–‰: (2025๋…„ 12์›” 20์ผ ์˜คํ›„ 04:41 GMT+9)
3 min read
์›๋ฌธ: Dev.to

Source: Dev.to

Cover image for ๐Ÿš€ I built supabase-markdown โ€” A tool to generate a full Supabase ERD across all schemas (because Visualizer canโ€™t)

์†Œ๊ฐœ

์—ฌ๋Ÿฌ๋ถ„ ์•ˆ๋…•ํ•˜์„ธ์š” ๐Ÿ‘‹

Supabase ์Šคํฌ๋ฆฐ์ƒท 1

Supabase ์Šคํฌ๋ฆฐ์ƒท 2

Supabase Visualizer๋ฅผ ์‚ฌ์šฉํ•ด ๋ณธ ์ ์ด ์žˆ๋‹ค๋ฉด, ์ •๋ง ํŽธ๋ฆฌํ•˜์ง€๋งŒ ํ•œ ๊ฐ€์ง€ ์ œํ•œ์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋  ๊ฒ๋‹ˆ๋‹ค:

ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ์Šคํ‚ค๋งˆ๋งŒ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž‘์€ ํ”„๋กœ์ ํŠธ๋ผ๋ฉด ๊ดœ์ฐฎ์ง€๋งŒ, ์•ฑ์ด ์„ฑ์žฅํ•˜๋ฉด์„œ public, storage, auth, graphql_public ๊ทธ๋ฆฌ๊ณ  ์‚ฌ์šฉ์ž ์ •์˜ ์Šคํ‚ค๋งˆ์™€ ๊ฐ™์ด ์—ฌ๋Ÿฌ ์Šคํ‚ค๋งˆ๊ฐ€ ์ƒ๊ธฐ๋ฉด ์ „์ฒด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ตฌ์กฐ๋ฅผ ํ•œ๋ˆˆ์— ํŒŒ์•…ํ•˜๊ธฐ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. โ€œ์ „์ฒด ๋ณด๊ธฐโ€๊ฐ€ ์ ˆ์‹คํžˆ ํ•„์š”ํ–ˆ๊ธฐ์— ์ง์ ‘ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ”ฅ supabase-markdown ์†Œ๊ฐœ

GitHub:

npm์œผ๋กœ ์„ค์น˜:

pnpm add -D supabase-markdown

๐Ÿง  ์–ด๋–ค ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋‚˜์š”?

Supabase Visualizer๋Š” ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ์Šคํ‚ค๋งˆ๋งŒ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์–ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์‹ค์ œ ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. supabase-markdown์„ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  • ํ•˜๋‚˜์˜ ํŒŒ์ผ
  • ํ•˜๋‚˜์˜ ๋‹ค์ด์–ด๊ทธ๋žจ
  • ๋ชจ๋“  ํ…Œ์ด๋ธ”
  • ๋ชจ๋“  ์Šคํ‚ค๋งˆ์— ๊ฑธ์ณ
  • ๋ชจ๋“  ๊ด€๊ณ„๋ฅผ ํ•œ ๋ฒˆ์— ํ‘œ์‹œ

์ด์ œ ์•„๋ž˜์™€ ๊ฐ™์€ ๋‹จ์ผ ํ†ตํ•ฉ ERD๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ์‹œ ERD (Mermaid)

erDiagram
  accounts ||--o{ posts : account_id
  posts ||--o{ post_hashtags : post_id
  hashtags ||--o{ post_hashtags : hashtag_id
  profiles ||--|| accounts : id
  storage.objects ||--o{ public_posts : image_id

ํ•œ ๊ณณ์— ๋ชจ๋‘ ๋ชจ์—ฌ ์žˆ์Šต๋‹ˆ๋‹ค. ์Šคํ‚ค๋งˆ๋ฅผ ํด๋ฆญํ•ด์„œ ์ด๋™ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๐Ÿ› ๏ธ ์ž‘๋™ ์›๋ฆฌ

Supabase๋Š” ์ด๋ฏธ ์ „์ฒด ์Šคํ‚ค๋งˆ ์ •๋ณด๋ฅผ ๋‹ค์Œ ๋ช…๋ น์„ ํ†ตํ•ด ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค:

supabase gen types typescript

์ƒ์„ฑ๋œ TypeScript ํŒŒ์ผ์—๋Š” ๋‹ค์Œ ์ •์˜๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค:

  • ํ…Œ์ด๋ธ”
  • ์ปฌ๋Ÿผ
  • ์—ด๊ฑฐํ˜•(enum)
  • ๊ด€๊ณ„
  • ์™ธ๋ž˜ ํ‚ค
  • ์Šคํ‚ค๋งˆ

supabase-markdown์€ ํ•ด๋‹น ํŒŒ์ผ์„ ํŒŒ์‹ฑํ•˜์—ฌ ๋‹ค์Œ์„ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค:

  • ์ „์ฒด Markdown ๋ฌธ์„œ
  • ์Šคํ‚ค๋งˆ๋ฅผ ๋„˜๋‚˜๋“œ๋Š” ํ†ตํ•ฉ ERD
  • ์Šคํ‚ค๋งˆ๋ณ„๋กœ ๊ทธ๋ฃนํ™”๋œ ํ…Œ์ด๋ธ” ๋ชฉ๋ก
  • ์™„์ „ ์ •์  ์ถœ๋ ฅ (GitHub, Notion, ๋ฌธ์„œ ์‚ฌ์ดํŠธ์— ์ตœ์ )
Back to Blog

๊ด€๋ จ ๊ธ€

๋” ๋ณด๊ธฐ ยป

Synapse ๊ตฌ์ถ•: React Native์™€ Supabase๋ฅผ ํ™œ์šฉํ•œ ์ „์ฒด ๊ธฐ๋Šฅ์„ ๊ฐ–์ถ˜ ์†Œ์…œ ๋ฏธ๋””์–ด ์•ฑ (๊ณง ์ถœ์‹œ!)

Synapse๋ž€ ๋ฌด์—‡์ธ๊ฐ€? Synapse๋Š” ์˜๋ฏธ ์žˆ๋Š” ์—ฐ๊ฒฐ์„ ์œ„ํ•ด ์„ค๊ณ„๋œ ์†Œ์…œ ๋ฏธ๋””์–ด ํ”Œ๋žซํผ์ด๋‹ค. X/Threads์™€ ๋น„์Šทํ•˜์ง€๋งŒ ํ’๋ถ€ํ•œ ์ฝ˜ํ…์ธ  ๋ธ”๋ก๊ณผ mathematica๋ฅผ ์ง€์›ํ•œ๋‹ค.

ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ ๊ฒ€์‚ฌ๊ธฐ

PSX๋Š” ํ”„๋กœ์ ํŠธ ์œ ํ˜•(Node, Go ๋“ฑ)์„ ์ž๋™ ๊ฐ์ง€ํ•˜๊ณ , ์ €์žฅ์†Œ์— ํ•„์ˆ˜ ํŒŒ์ผ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์ผ๋ จ์˜ ๊ทœ์น™์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋ˆ„๋ฝ๋œ ๊ฒƒ์ด ์žˆ์œผ๋ฉดโ€ฆ

parallelHTTP๋ฅผ ๋งŒ๋‚˜๋ณด์„ธ์š” โ€” API๋ฅผ ์œ„ํ•œ ๊ฐ„๋‹จํ•œ ์ŠคํŠธ๋ ˆ์Šค ํ…Œ์ŠคํŠธ ๋„๊ตฌ

ParallelHTTP๋ž€ ๋ฌด์—‡์ธ๊ฐ€ ParallelHTTP๋Š” ์ตœ์†Œ์ฃผ์˜์ ์ด๋ฉด์„œ๋„ ๊ธฐ๋Šฅ์ ์ธ ๋„๊ตฌ๋กœ, ๋‹ค์Œ์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค: - ์—ฌ๋Ÿฌ HTTP ์š”์ฒญ์„ ๋™์‹œ์— ์ „์†กํ•œ๋‹ค. - GET, POST ๋“ฑ ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌ์„ฑํ•œ๋‹ค.