FastAPI ์๋ฒ ์ฑ๋ฅ ํ๊ณ ๋ํ: Redis ์บ์ฑ(Caching)์ผ๋ก DB ๋ถํ ์ค์ด๊ณ ์๋ต ์๋ ๊ทน๋ํํ๊ธฐ
์น ์๋น์ค๋ฅผ ์ด์ํ๋ค ๋ณด๋ฉด ๋ฌํ ๋๋ ๋ง์ ๋น ์ง๋๋ค. ๋ด ์ฌ์ดํธ์ ๋ฐฉ๋ฌธ์๊ฐ ๋์ด๋๋ฉด ์ธ์์ ๋ค ๊ฐ์ง ๊ฒ์ฒ๋ผ ๊ธฐ์์ง๋ง, ๋์์ ์๋ฒ์ CPU์ ๋ฉ๋ชจ๋ฆฌ ์ ์ ์จ์ด ์น์๋ ๊ฒ์ ๋ณด๋ฉด ๋ฑ์ค๊ธฐ์ ์์๋์ด ํ๋ฅด๊ธฐ ์์ํ์ฃ . ์ง๋๋ฒ ํฌ์คํ ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค(DB)์ ์ธ๋ฑ์ค(Index)๋ฅผ ๊ฑธ์ด ์ฟผ๋ฆฌ ์๋๋ฅผ 20๋ฐฐ๋ ๋์ด์ฌ๋ ธ๋ ๊ฒฝํ์ ๊ณต์ ํด ๋๋ ธ๋๋ฐ์.
ํ์ง๋ง ํธ๋ํฝ์ด ๊ทธ๋ณด๋ค ํจ์ฌ ๋ ๋ง์์ง๋ค๋ฉด ์ด๋จ๊น์? ์๋ฌด๋ฆฌ ์ธ๋ฑ์ค๋ฅผ ์ ํ์ 0.04์ด ๋ง์ DB์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์จ๋ค ํ๋๋ผ๋, 1๋ง ๋ช ์ ์ ์ ๊ฐ ๋์์ ์ ์ํด์ ๋๊ฐ์ '๋ฉ์ธ ํ์ด์ง ์ต์ ๊ธ ๋ชฉ๋ก'์ ์์ฒญํ๋ค๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค(Supabase/PostgreSQL)๋ ์์๊ฐ์ ๋ป์ด๋ฒ๋ฆฌ๊ณ ๋ง ๊ฒ์ ๋๋ค.
์ค๋์ ๋งค๋ฒ ๋๊ฐ์ ์ง๋ฌธ์ ๋๋ตํ๋๋ผ ์ง์ณ๊ฐ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๊ตฌ์ถํ๊ธฐ ์ํด, ์ FastAPI ๋ฐฑ์๋ ์๋ฒ์ 'Redis(๋ ๋์ค)'๋ผ๋ ์ด๊ณ ์ ๋ฉ๋ชจ์ฅ์ ๋ฌ์์ค ์บ์ฑ(Caching) ๋์ ๊ธฐ๋ฅผ ์ ์ด๋ณด๋ ค ํฉ๋๋ค.
1. ์ DB ๋๋๊ณ ๊ตณ์ด ์บ์(Cache)๋ฅผ ์จ์ผ ํ ๊น?
์ํฉ์ ํ ๋ฒ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. ์ฌ๋ฌ๋ถ์ ์น์ฌ์ดํธ ๋ฉ์ธ ํ๋ฉด์ '์ค๋์ ์ธ๊ธฐ๊ธ TOP 10'์ด ๋ ์์ต๋๋ค. ์ด ์ธ๊ธฐ๊ธ ๋ชฉ๋ก์ ํ๋ฃจ์ ๋ฑ ํ ๋ฒ ์์ ์ ์ ๋ฐ์ดํธ๋ฉ๋๋ค.
๊ทธ๋ฐ๋ฐ ํ๋ฃจ ์ข ์ผ ์ฌ์ดํธ์ ๋ค์ด์ค๋ ์์ฒ ๋ช ์ ์ ์ ๋ค์๊ฒ ์ด ๋ชฉ๋ก์ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด, ๋ฐฑ์๋ ์๋ฒ๋ ๋งค๋ฒ DB์ ์ ์ํด์ "์กฐํ์ ์ ์ผ ๋์ ๊ธ 10๊ฐ ์ฐพ์์ค!"๋ผ๊ณ ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ฆฝ๋๋ค. ์ด์ฐจํผ ๊ฒฐ๊ณผ๋ ๋ฐค 12์๊น์ง 100% ๋๊ฐ์๋ฐ ๋ง์ด์ฃ . ์ด๊ฑด ๋ง์น ์์๋ฆฌ ๋๋ฃ๊ฐ "์ค๋ ์ ์ฌ ๋ฉ๋ด ๋ญ์ผ?"๋ผ๊ณ 100๋ฒ ๋ฌผ์ด๋ณผ ๋๋ง๋ค, ๋งค๋ฒ 1์ธต ์๋น๊น์ง ๋ฐ์ด ๋ด๋ ค๊ฐ์ ๋ฉ๋ดํ์ ๋ณด๊ณ ์ฌ๋ผ์ ๋๋ตํด ์ฃผ๋ ๊ฒ๊ณผ ๊ฐ์ ์์ฒญ๋ ๋ญ๋น์ ๋๋ค.
์ด๋ด ๋ ํ์ํ ๊ฒ์ด ๋ฐ๋ก ์บ์ฑ(Caching)์ ๋๋ค. ์๋น ๋ฉ๋ดํ์ ๋ด ์ฑ ์ ์ 'ํฌ์คํธ์(๋ฉ๋ชจ์ฅ)'์ ํ ๋ฒ๋ง ์ ์ด๋๊ณ , ๋๊ฐ ๋ฌผ์ด๋ณผ ๋๋ง๋ค ๊ทธ ํฌ์คํธ์๋ง ๋ณด๊ณ 0.1์ด ๋ง์ ๋๋ตํด ์ฃผ๋ ์๋ฆฌ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ํฌ์คํธ์ ์ญํ ์ ํด์ฃผ๋ ์ต๊ณ ์ ์คํ์์ค ์ํํธ์จ์ด๊ฐ ๋ฐ๋ก Redis์ ๋๋ค.
2. ์ธ๋ฉ๋ชจ๋ฆฌ(In-Memory)์ ๋ง๋ฒ, Redis ๋์ ํ๊ธฐ
Redis๋ ํ๋๋์คํฌ(SSD)์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ์ผ๋ฐ์ ์ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฌ๋ฆฌ, ์ปดํจํฐ์ ๋ฉ๋ชจ๋ฆฌ(RAM)์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํฉ๋๋ค. ์ ์์ด ๊บผ์ง๋ฉด ๋ ์๊ฐ ๋ฒ๋ฆฌ๋ ํ๋ฐ์ฑ ๊ณต๊ฐ์ด์ง๋ง, ๋์คํฌ๋ฅผ ๋ค์ง๋ ๊ฒ๊ณผ๋ ๋น๊ต๋ ํ ์ ์์ ๋งํผ ์๋์ ์ผ๋ก ์๋๊ฐ ๋น ๋ฆ ๋๋ค.
์ ๋ ๊ณง๋ฐ๋ก ์ฐ๋ถํฌ ์๋ฒ์ Redis๋ฅผ ์ค์นํ๊ณ , ํ์ด์ฌ FastAPI ์ฝ๋์ ์บ์ฑ ๋ก์ง์ ๋ผ์ ๋ฃ์์ต๋๋ค. ๋ก์ง์ ํ๋ฆ์ ์์ฃผ ๋จ์๋ช ๋ฃํฉ๋๋ค.
์ ์ ๊ฐ '์ธ๊ธฐ๊ธ ๋ชฉ๋ก' API๋ฅผ ํธ์ถํ๋ค.
๋ฐฑ์๋๋ DB์ ๊ฐ๊ธฐ ์ ์, ๋จผ์ Redis(ํฌ์คํธ์)์ ์ธ๊ธฐ๊ธ ๋ชฉ๋ก์ด ์ ํ ์๋์ง ํ์ธํ๋ค.
(Cache Hit) ๋ง์ฝ ์ ํ ์๋ค๋ฉด? DB๊น์ง ๊ฐ ํ์ ์์ด Redis์ ์๋ ๋ฐ์ดํฐ๋ฅผ 0.001์ด ๋ง์ ์ ์ ์๊ฒ ์ด์ค๋ค.
(Cache Miss) ๋ง์ฝ ์ ์ ํ ์๋ค๋ฉด? ์ด์ฉ ์ ์์ด DB์ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์จ ๋ค, ์ ์ ์๊ฒ ์ ๋ฌํจ๊ณผ ๋์์ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ Redis ํฌ์คํธ์์ ์ ์ด๋๋ค. (๋ค์ ์ ์ ๋ฅผ ์ํด์!)

3. TTL(Time To Live): ์ค๋๋ ์ฐ๋ด ๋๋ ๋ฐ์ดํฐ ๋ฐฉ์งํ๊ธฐ
์บ์ฑ์ ํ ๋ ๊ฐ์ฅ ์กฐ์ฌํด์ผ ํ ์ ์ '์ ๋ฐ์ดํธ'์ ๋๋ค. ์ธ๊ธฐ๊ธ ์์๊ฐ ๋ฐ๋์๋๋ฐ, ํฌ์คํธ์์ ์ ์ด๋ ์๋ ์์๋ฅผ ๊ณ์ ๋ณด์ฌ์ฃผ๋ฉด ์ ๋๋๊น์.
๊ทธ๋์ Redis์๋ TTL(Time To Live)์ด๋ผ๋ ์์ฃผ ๊ธฐ๊ฐ ๋งํ ๊ธฐ๋ฅ์ด ์์ต๋๋ค. "์ด ํฌ์คํธ์์ ๋ฑ 10๋ถ(600์ด) ๋ค์ ์ค์ค๋ก ๋ถํ ์์ด์ง๊ฒ ํด ์ค"๋ผ๊ณ ์ ํต๊ธฐํ์ ์ค์ ํ๋ ๊ฒ์
๋๋ค.
์ ํ์ด์ฌ ์ฝ๋์์ setex ํจ์๋ฅผ ์ฌ์ฉํด 600์ด๋ฅผ ์ค์ ํด ๋๋ฉด, 10๋ถ ๋์์ ์๋ง ๋ช
์ด ์ ์ํด๋ DB ๋ถํ ์์ด Redis๊ฐ ๋ชจ๋ ํธ๋ํฝ์ ๊ฐ๋ณ๊ฒ ๋ฐฉ์ดํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ 10๋ถ์ด ์ง๋๋ฉด ์บ์๊ฐ ๋ ์๊ฐ๊ณ , ๋ฑ ํ ๋ช
์ ์ ์ ์์ฒญ๋ง์ด ๋ค์ DB๋ฅผ ๊นจ์ ์ต์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ฒ ๋ง๋ค์ฃ .

4. ๊ฒฐ๊ณผ: API ์๋ต ์๋ 40ms์์ 2ms๋ก, ์พ๊ฐ์ ์๊ฐ
์ค์ ์ ๋ง์น ํ ๋ถํ ํ ์คํธ(Load Testing) ๋๊ตฌ๋ฅผ ์ด์ฉํด ์งง์ ์๊ฐ์ ์์ฒญ๋ ์ ์ ์์ฒญ์ ์์๋ถ์ด ๋ณด์์ต๋๋ค.
์ด์ ์๋ 1์ด๋น 100๋ฒ์ ์์ฒญ๋ง ๋ค์ด์๋ Supabase DB์ CPU ๊ทธ๋ํ๊ฐ ๋๋ฐ๊ธฐ๋ฅผ ํ๊ณ ์๋ต ์๋๊ฐ ๋ฆ์ด์ก์ง๋ง, Redis๋ฅผ ์๋จ์ ์ธ์ด ์ดํ๋ก๋ DB ๊ทธ๋ํ๊ฐ ๋ฐ๋ฅ์ ํ์จํ๊ฒ ๋์ ์์์ต๋๋ค. ๋ชจ๋ ํธ๋ํฝ์ ๋ฉ๋ชจ๋ฆฌ ๋จ์์ ์ณ๋ด๊ณ ์์๊ธฐ ๋๋ฌธ์ด์ฃ . API ์๋ต ์๋๋ 40ms ์์ค์์ ๋จ 2ms(0.002์ด)๋ก, ์ธก์ ํ๋ ์๋ฏธ๊ฐ ์์ ์ ๋๋ก ๊ทนํ์ ์๋๋ฅผ ๋ฟ์ด๋์ต๋๋ค.
๋งบ์ผ๋ฉฐ: 1์ธ ๊ฐ๋ฐ์์๊ฒ ์บ์ฑ์ '์ ํ์ด ์๋ ์์กด'
๊ฐ์ธ ์๊ธ์ผ๋ก ์๋ฒ๋ฅผ ์ด์ํ๋ 1์ธ ๊ฐ๋ฐ์์๊ฒ ํธ๋ํฝ ํญ์ฃผ๋ก ์ธํ DB ์๋ฒ ์ ๊ทธ๋ ์ด๋๋ ๊ต์ฅํ ๊ธ์ ์ ๋ถ๋ด์ ๋๋ค. ํ์ง๋ง Redis๋ผ๋ ํ๋ฅญํ ์คํ์์ค๋ฅผ ํ์ฉํ๋ฉด, ๊ฐ์ฅ ์ ๋ ดํ ๊นกํต ์๋ฒ ํ๋๋ก๋ ์์ฒ, ์๋ง ๋ช ์ ๋์ ์ ์์๋ฅผ ์ฌ์ ๋กญ๊ฒ ๋ฐ์๋ผ ์ ์๋ ๊ฒฌ๊ณ ํ ์ํคํ ์ฒ๋ฅผ ์ค๊ณํ ์ ์์ต๋๋ค.
"๋ฌด์กฐ๊ฑด DB ์ฌ์์ ์ฌ๋ฆฌ๊ธฐ ์ ์, ์ฝ๋๋ก ํด๊ฒฐํ ์ ์๋ ์ต์ ํ ๋ฐฉ์์ ๋จผ์ ์ฐพ์."
์ด๊ฒ์ด ์ ๊ฐ ์ด๋ฒ ์บ์ฑ ๋์ ์์ ์ ํตํด ์ป์ ๊ฐ์ฅ ๊ฐ์ง ๊ตํ์ ๋๋ค. ์ฌ๋ฌ๋ถ์ ์๋ฒ์๋ ์ง๊ธ ๋น์ฅ ๋งค๋ฒ ๋๊ฐ์ ์ฟผ๋ฆฌ๋ฅผ ๋ฐ๋ณตํ๋ฉฐ ๋ ํ๋ฆฌ๊ณ ์๋ ๋ถ์ํ API๊ฐ ์๋ค๋ฉด, ์ค๋ ๋ฐ๋ก Redis๋ผ๋ ๋ฌ์ฝคํ ํด์์ ์ ๋ฌผํด ๋ณด์๋ ๊ฒ์ ์ด๋จ๊น์?
๐ฌ ๋๊ธ 0๊ฐ