FastAPI์ Supabase ์ฐ๋ ์๋ฒ ์ต์ ํ: DB ์ธ๋ฑ์ฑ(Indexing)์ผ๋ก API ์๋ต ์๋ 10๋ฐฐ ๋์ด์ฌ๋ฆฌ๊ธฐ
์๋น์ค๋ฅผ ์ฒ์ ์คํํ์ ๋์ ๊ทธ ์ง๋ฆฟํจ, ๋ค๋ค ์์ค ๊ฒ๋๋ค. ๋ก์ปฌ ํ๊ฒฝ์์ ํ ์คํธํ ๋๋ง ํด๋ ๋ด๊ฐ ๋ง๋ ๊ฒ์ํ์ ๋ชฉ๋ก์ ๋ถ๋ฌ์ค๋ API๋ 0.1์ด๋ ๊ฑธ๋ฆฌ์ง ์์์ฃ . ํด๋ฆญํ๋ฉด ์ฆ๊ฐ์ ์ผ๋ก ํ๋ฉด์ด ๋จ๋ ๊ฒ์ ๋ณด๋ฉฐ "์ญ์ FastAPI ์ด๋ฆ๊ฐ ํ๋ค, ์์ฒญ ๋น ๋ฅด๋ค!"๋ผ๋ฉฐ ํผ์ ๋ฟ๋ฏํดํ๊ณค ํ์ต๋๋ค.
ํ์ง๋ง ๊ทธ ๊ธฐ์จ์ ๊ทธ๋ฆฌ ์ค๋๊ฐ์ง ์์์ต๋๋ค. ์ฌ์ดํธ์ ๋ฐฉ๋ฌธ์๊ฐ ๋์ด๋๊ณ , ์๋ํ ์คํฌ๋ฆฝํธ์ ์ ์ ๋ค์ด ์์ฑํ ๋ฐ์ดํฐ๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ 1๋ง ๊ฑด, 3๋ง ๊ฑด, 4๋ง ๊ฑด ๊ฐ๊น์ด ์์ด๊ธฐ ์์ํ์ ๋ฌธ์ ๊ฐ ํฐ์ก์ต๋๋ค.
๊ฒ์ํ ์นดํ ๊ณ ๋ฆฌ ํญ์ ๋๋ฅผ ๋๋ง๋ค ํ๋ฉด์ ๋ก๋ฉ ์คํผ๋(๋น๊ธ๋น๊ธ ๋๋ ์์ด์ฝ)๊ฐ 1~2์ด์ฉ ๋จธ๋ฌผ๊ธฐ ์์ํ ๊ฒ์ ๋๋ค. ํ๊ตญ ์ธํฐ๋ท ํ๊ฒฝ์์ 2์ด์ ๋๋ ์ด๋ ์ ์ ๋ค์๊ฒ "๋ค๋ก ๊ฐ๊ธฐ"๋ฅผ ๋๋ฅด๋ผ๋ ๋ฌด์ธ์ ์๋ฐ๊ณผ๋ ๊ฐ์ต๋๋ค. ๋ฑ์ค๊ธฐ์ ์์๋์ด ํ๋ ์ต๋๋ค. ๋๋์ฒด ๋ฌด์์ด ๋ฌธ์ ์์๊น์?
1. ๋ณ๋ชฉ์ ์์ธ ํ์ : ๋ฌธ์ ๋ ์ฝ๋๊ฐ ์๋๋ผ 'DB ๊ฒ์ ๋ฐฉ์'์ ์์๋ค
์ฒ์์๋ ์ ํ์ด์ฌ ์ฝ๋๊ฐ ๋นํจ์จ์ ์ธ ์ค ์๊ณ FastAPI์ ๋น๋๊ธฐ(async/await) ๋ก์ง์ ์์ญ ๋ฒ ๋ฏ์ด๋ณด์์ต๋๋ค. ํ์ง๋ง ์๋ฒ์ ์์(CPU, RAM)์ ๋๋ํ๊ฒ ๋๊ณ ์์์ต๋๋ค.
์์ธ์ ๋ฐฑ์๋ ์ฝ๋๊ฐ ์๋๋ผ, ๋ค์ ๋ถ์ด์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค(Supabase)์ ์์์ต๋๋ค. Supabase์ SQL ์๋ํฐ๋ฅผ ์ด๊ณ , ํน์ ์นดํ ๊ณ ๋ฆฌ์ ๊ธ์ ๋ถ๋ฌ์ค๋ ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ ค๋ณด์์ต๋๋ค.
SELECT id, title, created_at FROM posts WHERE category = 'IT ๊ฒ์ํ' ORDER BY created_at DESC;
๊ฒ์๊ธ์ด ๋ช๋ฐฑ ๊ฐ์ผ ๋๋ ๊ธ๋ฐฉ ์ฐพ์์ง๋ง, ์ ์ฒด ๋ฐ์ดํฐ๊ฐ 4๋ง ๊ฐ์ ์ก๋ฐํ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ 'IT ๊ฒ์ํ' ๊ธ์ ์ฐพ๊ธฐ ์ํด 1๋ฒ ๊ธ๋ถํฐ 4๋ง ๋ฒ ๊ธ๊น์ง ์ฒ์๋ถํฐ ๋๊น์ง ํ๋ํ๋ ๋ค์ ธ๋ณด๋ ์ด๋ฅธ๋ฐ 'ํ ํ ์ด๋ธ ์ค์บ(Full Table Scan)'์ ํ๊ณ ์์๋ ๊ฒ์ ๋๋ค. ๋๊บผ์ด ๋ฐฑ๊ณผ์ฌ์ ์์ ํน์ ๋จ์ด๋ฅผ ์ฐพ๊ธฐ ์ํด 1ํ์ด์ง๋ถํฐ ๋์ฅ๊น์ง ๋์ผ๋ก ๋ค ํ๊ณ ์๋ ์ ์ด์์ฃ .

2. ๊ตฌ์ ํฌ์ ๋ฑ์ฅ: ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ชฉ์ฐจ, ์ธ๋ฑ์ค(Index) ์์ฑํ๊ธฐ
์์ธ์ ์์์ผ๋ ํด๊ฒฐ์ฑ ์ ๋ช ํํ์ต๋๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค์ '๋ชฉ์ฐจ'๋ฅผ ๋ง๋ค์ด์ฃผ๋ ๊ฒ์ ๋๋ค. ์ ๊ณต ์ฉ์ด๋ก๋ ์ธ๋ฑ์ฑ(Indexing)์ด๋ผ๊ณ ๋ถ๋ฆ ๋๋ค.
๋ฐฑ๊ณผ์ฌ์ ๋งจ ๋ค์ ์๋ '์ฐพ์๋ณด๊ธฐ(์์ธ)' ํ์ด์ง๋ฅผ ์ด์ฉํ๋ฉด, ๋จ์ด์ ์์น๋ฅผ 1์ด ๋ง์ ์ฐพ์ ์ ์๋ ๊ฒ๊ณผ ์๋ฒฝํ๊ฒ ๋๊ฐ์ ์๋ฆฌ์
๋๋ค. ์ ๋ ์ ์ ๋ค์ด ๊ฐ์ฅ ๋ง์ด ๊ฒ์ํ๋ ์กฐ๊ฑด์ธ category ์นผ๋ผ๊ณผ, ์ต์ ์ ์ ๋ ฌ์ ์ํด ๋งค๋ฒ ์ฌ์ฉํ๋ created_at ์นผ๋ผ์ ๋ณตํฉ ์ธ๋ฑ์ค๋ฅผ ๊ฑธ์ด์ฃผ๊ธฐ๋ก ํ์ต๋๋ค.
Supabase๋ ๋ด๋ถ์ ๊ฐ๋ ฅํ PostgreSQL์ ํ๊ณ ์๊ธฐ ๋๋ฌธ์, ์์ฃผ ๊ฐ๋จํ SQL ๋ช ๋ น์ด ํ ์ค์ด๋ฉด ์ธ๋ฑ์ค๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ์ ๋ SQL ์๋ํฐ์ ๋ค์๊ณผ ๊ฐ์ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ์ต๋๋ค.
CREATE INDEX idx_posts_category_created ON posts (category, created_at DESC);
์ํฐ๋ฅผ ์น๋ ์๊ฐ, ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ด๋ถ์์๋ 4๋ง ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์นดํ ๊ณ ๋ฆฌ๋ณ๋ก, ๊ทธ๋ฆฌ๊ณ ์๊ฐ์์ผ๋ก ๊น๋ํ๊ฒ ์ ๋ฆฌํ '๋น๋ฐ ๋ชฉ์ฐจ'๋ฅผ ์์ฑํ๊ธฐ ์์ํ์ต๋๋ค. ์์ ์ ๋ถ๊ณผ ๋ช ์ด ๋ง์ ๋๋ฌ์ต๋๋ค.
3. ๊ฒฐ๊ณผ ํ์ธ: 800ms ๋๋ ์ด๊ฐ 40ms๋ก, ๋ฌด๋ ค 20๋ฐฐ์ ์๋ ํฅ์
"๊ณผ์ฐ ์ผ๋ง๋ ๋นจ๋ผ์ก์๊น?" ๋จ๋ฆฌ๋ ๋ง์์ผ๋ก FastAPI ์๋ฒ๋ฅผ ์ฌ๊ฐ๋ํ๊ณ , API ํ ์คํธ ๋๊ตฌ(Postman)๋ฅผ ์ด์ฉํด ๋๊ฐ์ ๊ฒ์๋ฌผ ๋ชฉ๋ก ํธ์ถ API๋ฅผ ๋ ๋ ค๋ณด์์ต๋๋ค.
๊ฒฐ๊ณผ๋ ๊ทธ์ผ๋ง๋ก ์ถฉ๊ฒฉ์ ์ด์์ต๋๋ค. ์ธ๋ฑ์ค๋ฅผ ๊ฑธ๊ธฐ ์ ์๋ 800ms(0.8์ด) ๊ฐ๊น์ด ๊ฑธ๋ฆฌ๋ฉฐ ๊ตผ๋ฒต์ด์ฒ๋ผ ์๋ตํ๋ API๊ฐ, ์ด์ ๋ ๋จ 40ms(0.04์ด) ๋ง์ JSON ๋ฐ์ดํฐ๋ฅผ ๋ฑ์ด๋ด๊ธฐ ์์ํ์ต๋๋ค. ๋ฌด๋ ค 20๋ฐฐ ๊ฐ๊น์ด ์ฑ๋ฅ ํฅ์์ด์์ต๋๋ค.

์ค์ ์น์ฌ์ดํธ์ ์ ์ํด์ ํญ์ ๋๋ฌ๋ณด๋, ํด๋ฆญ๊ณผ ๋์์ ๋ก๋ฉ ์คํผ๋๋ฅผ ๋ณผ ์๋ ์์ด ์ฆ๊ฐ์ ์ผ๋ก ๊ฒ์๋ฌผ ๋ชฉ๋ก์ด ํ๋ฉด์ ๋ ๋๋ง ๋์์ต๋๋ค. ํ ํ ์ด๋ธ ์ค์บ์ผ๋ก ํ๋์ด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ, ์ด์ ๋ ์ธ๋ฑ์ค๋ผ๋ ๋ชฉ์ฐจ๋ฅผ ๋ณด๊ณ ํ์ํ ๋ฐ์ดํฐ๋ง ์์ ๋ฝ์์ ๋ฐฑ์๋๋ก ์ ๋ฌํด์ฃผ๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋งบ์ผ๋ฉฐ: ๊ธฐ๋ณธ๊ธฐ์ ์ค์์ฑ, ํ๋ ์์ํฌ ๋๋จธ๋ฅผ ๋ณด์
1์ธ ๊ฐ๋ฐ์ ํ๋ค ๋ณด๋ฉด ๋์ ๋น์ฅ ๋ณด์ด๋ ํ๋ คํ ํ๋ก ํธ์๋ UI๋ ์ต์ ๋ฐฑ์๋ ํ๋ ์์ํฌ ๊ธฐ์ ์๋ง ์ง์ฐฉํ๊ธฐ ์ฝ์ต๋๋ค. ์ ์ญ์ FastAPI๋ผ๋ ์ต์ ๋น๋๊ธฐ ํ๋ ์์ํฌ๋ฅผ ์ผ์ผ๋ ๋ฌด์กฐ๊ฑด ๋น ๋ฅผ ๊ฒ์ด๋ผ๋ ์ฐฉ๊ฐ์ ๋น ์ ธ ์์์ต๋๋ค.
ํ์ง๋ง ๊ฒฐ๊ตญ ๋ฐ์ดํฐ๋ฅผ ๋ด์๋๊ณ ๊บผ๋ด๋ ๊ทผ๋ณธ์ ์ธ ๊ทธ๋ฆ์ '๋ฐ์ดํฐ๋ฒ ์ด์ค'์ ๋๋ค. ์๋ฌด๋ฆฌ ์๋ฒ ์ฝ๋๋ฅผ ์ต์ ํํ๋๋ผ๋, DB ๊ตฌ์กฐ๊ฐ ๋นํจ์จ์ ์ด๋ฉด ์๋น์ค๋ ๋ฐ๋์ ๋ณ๋ชฉ ํ์์ ๊ฒช๊ฒ ๋๋ค๋ ๋ผ์ ๋ฆฐ ๊ตํ์ ์ป์์ต๋๋ค.
์ค๋๋ ํธ๋ํฝ ์ฆ๊ฐ์ API ์๋ ์ ํ๋ก ๊ณ ํต๋ฐ๊ณ ๊ณ์ ๊ฐ๋ฐ์๋ถ์ด ๊ณ์ ๋ค๋ฉด, ์๋ฒ ์ฌ์(RAM, CPU)์ ๋ ์ฃผ๊ณ ์ ๊ทธ๋ ์ด๋ํ๊ธฐ ์ ์ ๋ฐ๋์ ์ฟผ๋ฆฌ ์คํ ๊ณํ(EXPLAIN)์ ๋ถ์ํด ๋ณด๊ณ ์ธ๋ฑ์ค๊ฐ ์ ๋๋ก ๊ฑธ๋ ค ์๋์ง ํ์ธํด ๋ณด์๊ธธ ๊ฐ๋ ฅํ ๊ถ์ฅํฉ๋๋ค. ๋ช ๋ น์ด ํ ์ค์ด ์๋ฒ ๋น์ฉ ์์ญ๋ง ์์ ์๊ปด์ฃผ๋ ๋ง๋ฒ์ ๊ฒฝํํ์ค ์ ์์ ๊ฒ์ ๋๋ค.
๐ฌ ๋๊ธ 0๊ฐ