ํด๋ผ์ฐ๋์ ํธ๋ฆฌํจ์ ๋ฒ๋ฆฌ๊ณ ์จํ๋ ๋ฏธ์ค๋ก ๋์์จ ์ด์
์ต๊ทผ ์ ๋ FastAPI์ SQLAlchemy๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ ์น ํ๋ซํผ์ ๊ฐ๋ฐํ๋ฉฐ, ๋น ๋ฅด๊ณ ์ง๊ด์ ์ธ ํด๋ผ์ฐ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ธ Supabase๋ฅผ ์ ๊ทน์ ์ผ๋ก ํ์ฉํ๊ณ ์์์ต๋๋ค. ์ด๊ธฐ ๊ฐ๋ฐ ๋จ๊ณ์์๋ ํด๋ผ์ฐ๋๊ฐ ์ฃผ๋ ๊ด๋ฆฌ์ ํธ๋ฆฌํจ์ ๊ฐํํ์ง๋ง, ์๋น์ค์ '์๋ํ ํฌ์คํ ๋ด' ๋ก์ง์ ๋ณธ๊ฒฉ์ ์ผ๋ก ์ฐ๋ํ๋ฉด์ ์์์น ๋ชปํ ๊ฑฐ๋ํ ๋ฒฝ์ ๋ถ๋ชํ๊ธฐ ์์ํ์ต๋๋ค.
์์ญ ๊ฐ์ ๊ฒ์๊ธ๊ณผ ์ธ๋ค์ผ ๋ฏธ๋์ด๋ฅผ ๋ฒ์ญ API์ ์ฐ๋ํ์ฌ 4~16๋ถ ๊ฐ๊ฒฉ์ผ๋ก ๊ณ์ํด์ ๋ฐ์ด ๋ฃ๋ค ๋ณด๋, ํด๋ผ์ฐ๋ DB ํน์ ์ Disk I/O ๋ณ๋ชฉ ํ์๊ณผ ์ปค๋ฅ์
ํ(Connection Pool) ํ๊ณ๊ฐ ์ ๋๋ผํ๊ฒ ๋๋ฌ๋ฌ์ต๋๋ค. ๋ฐ์ดํฐ๊ฐ ์ฌ๋ผ๊ฐ๋ค ๋ง๊ณ ์๋ฒ ์ ์ฒด๊ฐ ๋ป์ด๋ฒ๋ฆฌ๋ ํ์์ ์์ฐจ๋ก ๊ฒช์ผ๋ฉฐ, ์ ๋ ์ค๋ํ ๊ฒฐ๋จ์ ๋ด๋ ธ์ต๋๋ค. ์ธ๋ถ ๋คํธ์ํฌ๋ฅผ ํ๋ฉด์ ๋ฐ์ํ๋ ์ง์ฐ(Latency)์ ์์ ๊ณ ๋ด ์๋ฒ์ ์์์ 100% ํ์ฉํ๊ธฐ ์ํด, ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ํด๋ผ์ฐ๋์์ ๋ฐฑ์๋ ์๋ฒ๊ฐ ๊ตฌ๋ ์ค์ธ ๋ก์ปฌ ํ๊ฒฝ(PostgreSQL, localhost:5432)์ผ๋ก ์จํ๋ ๋ฏธ์ค ๋ง์ด๊ทธ๋ ์ด์
ํ๋ ๋๋์ ์ธ ๊ณต์ฌ๋ฅผ ์์ํ์ต๋๋ค.
์ด ํ๋ํ ์ด์ ๊ณผ์ ์์ ์ ๊ฐ ๊ฒช์๋ ํผ๋๋ฌผ ๋๋ 3๊ฐ์ง ํธ๋ฌ๋ธ์ํ ๊ฒฝํ์ ๊ณต์ ํด ๋ณด๋ ค ํฉ๋๋ค.
1. ์ฒซ ๋ฒ์งธ ์ฝ์ง: ํ๊ฒฝ๋ณ์๋ฅผ ๋ฐ๊ฟจ๋๋ฐ ์ ์๋ฑํ ํฌํธ๋ฅผ ์ฐพ์๊น? (Connection refused)
๊ฐ์ฅ ๋จผ์ ๊ฒช์ ํฉ๋นํ ๋ฌธ์ ๋ DB ์ฐ๊ฒฐ ์ค๋ฅ์์ต๋๋ค. ์ฐ๋ถํฌ ์๋ฒ์ PostgreSQL์ ๋ฌด์ฌํ ์ค์นํ๊ณ , .env ํ์ผ์ DB ์ ์ URL ํฌํธ๋ฅผ ํด๋ผ์ฐ๋์ฉ ํฌํธ์์ ๋ก์ปฌ ๊ธฐ๋ณธ ํฌํธ์ธ 5432๋ก ๋ณ๊ฒฝํ์ต๋๋ค. ํ์ง๋ง ์๋ฒ๋ฅผ ์ฌ์์ํ์ ํฐ๋ฏธ๋์ ๋์ฐํ ์๋ฌ๊ฐ ์ถ๋ ฅ๋์์ต๋๋ค.
Connection refused: Cannot connect to port 6543
๋ถ๋ช
.env์๋ 5432๋ฅผ ์
๋ ฅํ๋๋ฐ, ์์คํ
์ ๊ณ์ํด์ 6543 ํฌํธ๋ฅผ ์ฐพ์ผ๋ฉฐ ์ฐ๊ฒฐ์ ๊ฑฐ๋ถํ๊ณ ์์์ต๋๋ค. ์บ์๋ฅผ ์ง์๋ณด๊ณ ์ปจํ
์ด๋๋ฅผ ์ฌ์์ํด๋ ์์ฉ์ด ์์์ต๋๋ค. ๋๋์ฒด ์ด๋์ ํฌํธ ๋ฒํธ๊ฐ ๊ผฌ์ธ ๊ฒ์ผ๊น์? ์ ๋ ๋ฆฌ๋
์ค ํฐ๋ฏธ๋์ ์ด๊ณ ํ
์คํธ ๊ฒ์์ ๊ฐ๋ ฅํ ๋ฌด๊ธฐ์ธ grep ๋ช
๋ น์ด๋ฅผ ๋นผ๋ค์์ต๋๋ค.
๊ฒ์ ๊ฒฐ๊ณผ๋ ์ถฉ๊ฒฉ์ ์ด์์ต๋๋ค. ๊ณผ๊ฑฐ์ Supabase ์ธ๋ถ ์ปค๋ฅ์
ํ๋ง(Connection Pooling)์ ์ธํ
ํ ๋, database.py ํ์ผ ๊น์ํ ๊ณณ์ URL ๋ฌธ์์ด ์ค .replace(":5432/", ":6543/")์ ํตํด ๊ฐ์ ๋ก ํฌํธ๋ฅผ ๋ณํํด๋ฒ๋ฆฌ๋ ํ๋์ฝ๋ฉ ๋ก์ง์ ์ ๊ฐ ์ง์ ์ง๋๊ณ ๊น๋งฃ๊ฒ ์๊ณ ์์๋ ๊ฒ์
๋๋ค. ์ด ํ๋์ฝ๋ฉ๋ ์ฝ๋๋ฅผ ์ฐพ์๋ด์ด ๊น๋ํ๊ฒ ์ญ์ ํ๊ณ ๋๋, ๊ทธ์ ์ผ FastAPI๊ฐ ๋ก์ปฌ DB์ ์ ์์ ์ผ๋ก ๋ฟ๋ฆฌ๋ฅผ ๋ด๋ฆฌ๊ธฐ ์์ํ์ต๋๋ค. ๊ณผ๊ฑฐ์ ์ ๊ฐ ํ๋์ ํจ์ ์ ์ ๊ฐ ๋น ์ง ์
์ด์์ต๋๋ค.
2. ๋ ๋ฒ์งธ ์ฝ์ง: ๊ทนํ์ ์ฑ๋ฅ์ ํฅํด, ๋น๋๊ธฐ ๋๋ผ์ด๋ฒ(asyncpg) ์ ํ
๋ก์ปฌ DB ์ฐ๊ฒฐ์๋ ์ฑ๊ณตํ์ง๋ง, ๋๋์ ํธ๋ํฝ๊ณผ ๋ฒํฌ ์ธ์ํธ๋ฅผ ๊ฐ๋นํ๊ธฐ ์ํด ์ ๋ ๊ธฐ์กด์ ์ฌ์ฉํ๋ ๋๊ธฐ์ ๋๋ผ์ด๋ฒ(psycopg) ๋์ , ํ์ด์ฌ ์ํ๊ณ์์ ๊ฐ์ฅ ๋น ๋ฅธ ๋น๋๊ธฐ PostgreSQL ๋๋ผ์ด๋ฒ์ธ asyncpg๋ก ์์ง์ ์์ ํ ๊ต์ฒดํ๊ธฐ๋ก ํ์ต๋๋ค.
ํ์ง๋ง ๋๋ผ์ด๋ฒ๋ฅผ ๋ฐ๊พธ์ ์ด๋ฒ์๋ SQLAlchemy ์ค์ ์์ ํธํ์ฑ ์๋ฌ๊ฐ ๋ฟ์ด์ ธ ๋์์ต๋๋ค. ๊ธฐ์กด ๋๊ธฐ์์์ ์ ์๋ํ๋ ์ปค๋ฅ์
ํ์์์์ด๋ ์๋ฒ ์ธํ
์ธ์๋ค์ด asyncpg ๊ท๊ฒฉ๊ณผ ์ ํ ๋ง์ง ์์๊ธฐ ๋๋ฌธ์
๋๋ค. ๊ณต์ ๋ฌธ์๋ฅผ ์์ญ ๋ฒ ๋ค์ ธ๊ฐ๋ฉฐ database.py์ connect_args ์ค์ ์ ๋น๋๊ธฐ ๊ท๊ฒฉ์ ๋ง๊ฒ ์ ๊ตํ๊ฒ ํ๋ํด์ผ๋ง ํ์ต๋๋ค.

์ด ํ๋์ ๊ฑฐ์น ํ ๋น๋๊ธฐ ์ฒ๋ฆฌ์ ๋ง๋ฒ์ด ์์๋์์ต๋๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค ์๋ต์ ๊ธฐ๋ค๋ฆฌ๋๋ผ ๋ฉ์ถฐ์๋ ๋ฐฑ์๋ ์ค๋ ๋๋ค์ด ๋ณ๋ ฌ๋ก ์์ ๋กญ๊ฒ ํ๋ ค๋๋ฉด์, ์๋ฒ์ ๋์ ์ฒ๋ฆฌ ๋ฅ๋ ฅ์ด ์ฐจ์์ด ๋ค๋ฅด๊ฒ ์พ์ ํด์ก์ต๋๋ค.
3. ์ธ ๋ฒ์งธ ์ฝ์ง: Cloudflare 524 ์๋ฌ์ ์ฒญํฌ(Chunk) ์ต์ ํ
๋ง์นจ๋ด ์ํคํ ์ฒ ์ธํ ์ ๋๋ด๊ณ ๋ด์ ๊ฐ๋ํ์ฌ ์์ญ ๊ฐ์ ๊ฒ์๊ธ์ ํ ๋ฒ์ ์ฌ๋ฆฌ๋ ํ ์คํธ๋ฅผ ์งํํ์ต๋๋ค. ๊ทธ๋ฐ๋ฐ ์ ๋ก๋ ๋์ค ๊ฐ์๊ธฐ ์น ํ๋ฉด์ 'Cloudflare 524 A timeout occurred' ์๋ฌ๊ฐ ๋จ๋ฉด์ ์ค๋ณต ๊ฒ์๊ธ์ด ๋ง๊ตฌ์ก์ด๋ก ์ฌ๋ผ๊ฐ๋ ์น๋ช ์ ์ธ ๋ฒ๊ทธ๊ฐ ๋ฐ์ํ์ต๋๋ค.
์์ธ์ ๋ฐฑ์๋์ '์์ ๋๊ธฐ ์๊ฐ'์ ์์์ต๋๋ค. ๋ฒํฌ ์ ๋ก๋๋ฅผ ํ ๋ ๋จ์ํ DB์ ํ ์คํธ๋ง ๋ฃ๋ ๊ฒ์ด ์๋๋ผ, ์ธ๋ถ ๋ฒ์ญ API๋ฅผ ํธ์ถํ๊ณ ๋ก์ง์ ์ฒ๋ฆฌํ๋ ๋ฌด๊ฑฐ์ด ์์ ์ด ํฌํจ๋์ด ์์์ต๋๋ค. ์ด ์์ ์ด 100์ด๋ฅผ ๋์ด๊ฐ์, ์๋ฒ ์๋จ์ ์งํค๊ณ ์๋ ํด๋ผ์ฐ๋ํ๋ ์ด๊ฐ "์๋ฒ๊ฐ ์๋ต์ด ์์ผ๋ ์ฐ๊ฒฐ์ ๋๊ฒ ๋ค"๋ผ๋ฉฐ ๊ฐ์ ๋ก 100์ด ํ์์์(524 ์๋ฌ)์ ๋ฐ์์ํจ ๊ฒ์ ๋๋ค. ์๋ฒ๋ ๋ค์์ ๊ณ์ ๊ธ์ ์ฐ๊ณ ์๋๋ฐ ํ๋ก ํธ์๋ ์ฐ๊ฒฐ๋ง ๋๊ธฐ๋, ๋ด์ "์ ๋ก๋ ์คํจ์ธ๊ฐ?" ํ๊ณ ๋์ผํ ๊ธ์ ๋๋ค์ ์ ์กํ์ฌ ์ค๋ณต ํฌ์คํ ์ด ์ผ์ด๋ ๊ฒ์ด์์ฃ .
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ์ํคํ ์ฒ ์ต์ ํ๋ '๋ถํ ์ ๋ณต'์ด์์ต๋๋ค. ์๋ํ ์คํฌ๋ฆฝํธ๊ฐ ๋ฐฑ์๋๋ก ํ ๋ฒ์ ์ ์กํ๋ ์ ์ก ๋จ์(Chunk Size)๋ฅผ ๊ธฐ์กด 20๊ฐ์์ 5๊ฐ๋ก ๋ํญ ์ค์์ต๋๋ค. ํ ๋ฒ์ 5๊ฐ์ฉ๋ง ๋ฒ์ญ API๋ฅผ ํ์ฐ๊ณ DB์ ๋ฐ์ด ๋ฃ๋๋ก ์ชผ๊ฐ์ด ์ฒ๋ฆฌํ๋, ๋ฐฑ์๋ ์๋ต ์๊ฐ์ด 20์ด ์ด๋ด๋ก ๋จ์ถ๋์ด ํด๋ผ์ฐ๋ํ๋ ์ด์ 100์ด ํ์์์ ์ฅ๋ฒฝ์ ์๋ฒฝํ๊ฒ ํผํด ๊ฐ ์ ์์์ต๋๋ค.
๊ธธ๊ณ ํ๋ํ๋ ํธ๋ฌ๋ธ์ํ
์ ๋ง์น๊ณ ๋๋, ๊ฒฐ๊ณผ๋ ์์ ์ด์์ด์์ต๋๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์ธ๋ถ ํด๋ผ์ฐ๋ ๋คํธ์ํฌ๋ฅผ ํ์ง ์๊ณ localhost ๋ด๋ถ์์ ์ฆ๊ฐ์ ์ผ๋ก ํต์ ํ๊ฒ ๋๋ฉด์ DB ์๋ต ์๋๊ฐ ๋น์ฝ์ ์ผ๋ก ์์นํ์ต๋๋ค. ์์ญ ๊ฐ์ ๊ฒ์๊ธ๊ณผ ์ธ๋ค์ผ ๋ฏธ๋์ด๋ฅผ ๋ค๋ฃจ๊ณ 4~16๋ถ ๊ฐ๊ฒฉ์ผ๋ก ์์ฝ ๋ฐํํ๋ ๋ฌด๊ฑฐ์ด ์๋ํ ๋ด ๋ก์ง์ 3๊ฐ ์ด์ ๋์์ ๋๋ ค๋ ์๋ฒ ์์(CPU, RAM)์ด ๋๋ํ๊ฒ ์ ์ง๋์์ต๋๋ค.
ํด๋ผ์ฐ๋๊ฐ ๋ฌด์กฐ๊ฑด์ ์ธ ์ ๋ต์ ์๋๋๋ค. ํ์ฌ ์๋น์ค์ ํธ๋ํฝ ํจํด๊ณผ ์๋ํ ๋ก์ง์ ์ฑ๊ฒฉ์ ๋ฐ๋ผ, ๋๋ก๋ ์ด๋ ๊ฒ ์จํ๋ ๋ฏธ์ค(๋ก์ปฌ) ํ๊ฒฝ์ผ๋ก ๋ฌต์งํ๊ฒ ์์คํ ์ ์ฎ๊ธฐ๋ ๊ฒ์ด ์ต๊ณ ์ ์ฑ๋ฅ์ ๋ด๋ ์ํคํ ์ฒ๊ฐ ๋ ์ ์์์ ๋ผ์ ๋ฆฌ๊ฒ ๋ฐฐ์ด ์์คํ ๊ฒฝํ์ด์์ต๋๋ค.
โ ์์ฃผ ๋ฌป๋ ์ง๋ฌธ (FAQ)
Q1. ํด๋ผ์ฐ๋ DB(Supabase)์ ์๊ธ์ ๋ฅผ ์ฌ๋ ค์ ์ค์ผ์ผ์ (Scale-up)ํ๋ฉด ํด๊ฒฐ๋์ง ์๋์?
A. ๋ฌผ๋ฆฌ์ ์ธ ๋ฆฌ์์ค๋ฅผ ๋๋ฆฌ๋ฉด ์ผ์ ๋ถ๋ถ ๋ณ๋ชฉ์ด ํด์๋ ์ ์์ต๋๋ค. ํ์ง๋ง ํด๋ผ์ฐ๋ DB๋ ํ์์ ์ผ๋ก ์๋ฒ์ DB๊ฐ ์๋ก ๋ค๋ฅธ ๋ฌผ๋ฆฌ์ ์์น์ ์กด์ฌํ๋ฏ๋ก, ๋คํธ์ํฌ ์ง์ฐ(Network Latency) ์์ฒด๊ฐ ์ฌ๋ผ์ง์ง๋ ์์ต๋๋ค. ์ค์๊ฐ ๋๋ ์ฒ๋ฆฌ๊ฐ ์ฆ์ ๋ฐฑ์๋ ๊ตฌ์กฐ์์๋ ์๋ฒ์ DB๋ฅผ ๊ฐ์ ๋ก์ปฌ ํ๊ฒฝ์ ๋๋ ๊ฒ์ด ๋น์ฉ๊ณผ ์ฑ๋ฅ ๋ฉด์์ ํจ์ฌ ์๋์ ์ธ ํจ์จ์ ๋ณด์ฌ์ค๋๋ค.
Q2. Cloudflare์ 100์ด ํ์์์(524 ์๋ฌ) ์ค์ ๊ฐ์ ์์๋ก ๋๋ฆด ์๋ ์๋์?
A. ๋ฌด๋ฃ ํ๋(Free)์ด๋ ํ๋ก ํ๋ ์ฌ์ฉ์ ๊ธฐ์ค์ผ๋ก, ํด๋ผ์ฐ๋ํ๋ ์ด์ 100์ด ํ์์์์ ํ๋ ๋ฆฌ๋ฐ(Hard Limit)์ผ๋ก ๊ฐ์ ์ค์ ๋์ด ์์ด ์ฌ์ฉ์๊ฐ ์์๋ก ๋๋ฆด ์ ์์ต๋๋ค. ๊ณ ์ก์ ์ํฐํ๋ผ์ด์ฆ ์๊ธ์ ์์๋ง ์กฐ์ ์ด ๊ฐ๋ฅํ๋ฏ๋ก, ๋ฐฑ์๋ ๋ก์ง ์์ฒด์ ์๋ต ์๋๋ฅผ 100์ด ์ด๋ด๋ก ๋จ์ถ(Chunking)์ํค๋ ๊ฒ์ด ์ ์ผํ๊ณ ์ฌ๋ฐ๋ฅธ ์ํคํ ์ฒ ํด๊ฒฐ์ฑ ์ ๋๋ค.
Q3. ๋น๋๊ธฐ asyncpg ๋๋ผ์ด๋ฒ๋ฅผ ๋์
ํ ๋ ๊ฐ์ฅ ์ฃผ์ํด์ผ ํ ์ ์ ๋ฌด์์ธ๊ฐ์?
A. ๊ธฐ์กด์ psycopg2 ๊ฐ์ ๋๊ธฐ์ ๋๋ผ์ด๋ฒ ์ค์ ์ฝ๋๋ฅผ ๋จ์ํ ๋น๋๊ธฐ๋ก ์ด๋ฆ๋ง ๋ฐ๊พผ๋ค๊ณ ์๋ํ์ง ์์ต๋๋ค. sessionmaker๋ฅผ ์ฌ์ฉํ ๋ ๋ฐ๋์ AsyncSession ํด๋์ค๋ฅผ ์์๋ฐ์์ผ ํ๋ฉฐ, DB์ ์ฟผ๋ฆฌ๋ฅผ ๋์ง ๋๋ ๋ชจ๋ ๋ก์ง ์์ await ํค์๋๋ฅผ ๋ถ์ฌ ์ค๋ ๋ ์ฐจ๋จ์ ๋ง์์ผ ์๋ฒฝํ ๋น๋๊ธฐ ์ฑ๋ฅ์ ๋ผ ์ ์์ต๋๋ค.
๐ฌ ๋๊ธ 0๊ฐ