"๋ด ์ฌ์ดํธ๊ฐ ์ ์ด๋ ๊ฒ ๋๋ ค์ก์ง?" ๋ฐ์ดํฐ์ ๋ฌด๊ฒ๋ฅผ ์ฒด๊ฐํ๋ค
์น ์๋น์ค๋ฅผ ์ฒ์ ๋ก ์นญํ์ ๋์ ๊ทธ ์ง๋ฆฟํจ์ ๊ธฐ์ตํ์ญ๋๊น? ๋ด ๋ก์ปฌ PC์์ ํ ์คํธํ๋ ํ์ด์ฌ(FastAPI) ๋ฐฑ์๋ ์ฝ๋๊ฐ ์ค๋ผํด ํด๋ผ์ฐ๋์ ๋ฌด์ฌํ ๋ฐฐํฌ๋๊ณ , ๋ธ๋ผ์ฐ์ ์์ 0.1์ด ๋ง์ ๋ฒ๊ฐ์ฒ๋ผ ์นํ์ด์ง๊ฐ ๋ฐ ๋์ ๊ทธ ์พ๊ฐ ๋ง์ ๋๋ค. ์ ์ญ์ ๊ทธ ์ง๋ฆฟํจ์ ์ทจํด ๋งค์ผ๋งค์ผ ๊ธฐ๋ฅ ์ ๋ฐ์ดํธ์๋ง ๋ชฐ๋ํ์ต๋๋ค.
๊ทธ๋ฐ๋ฐ ์๋น์ค ์คํ ๋ช ๋ฌ ํ, ์ ์ ๋ค์ด ๊ธ์ ์ฐ๊ณ ์ ๊ฐ ๋ง๋ ์๋ํ ๋ด์ด ์์ฒ ๊ฑด์ ์์ง์ ๋ฐ์ดํฐ๋ฅผ ์์งํด ์ค๋ฉด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํฌ๊ธฐ๊ฐ ๊ธฐํ๊ธ์์ ์ผ๋ก ์ปค์ง๊ธฐ ์์ํ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ ์๊ฐ๋ถํฐ ์น๋ช ์ ์ธ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค. ๊ฒ์ํ ์นดํ ๊ณ ๋ฆฌ๋ฅผ ๋๋ฅด๊ฑฐ๋ ํน์ ๊ธ์ ๊ฒ์ํ ๋, ํ๋ฉด์ ๋ก๋ฉ ์คํผ๋(๋น๊ธ๋น๊ธ ๋๋ ์์ด์ฝ)๊ฐ 2~3์ด์ฉ ๋๊ธฐ ์์ํ ๊ฒ์ ๋๋ค.
์ฒ์์๋ ํด๋ผ์ฐ๋ํ๋ ์ด ๋คํธ์ํฌ ๋ฌธ์ ๋ ํด๋ผ์ฐ๋ ์๋ฒ์ ์ฌ์(RAM 1GB)์ด ๋ถ์กฑํด์ ๊ทธ๋ฐ ์ค ์์์ต๋๋ค. ํ์ง๋ง ์๋ฒ ๋ชจ๋ํฐ๋ง ๋ก๊ทธ๋ฅผ ๋ฏ์ด๋ณธ ๊ฒฐ๊ณผ, ์์ธ์ ์ ํ ๋ค๋ฅธ ๊ณณ, ๋ฐ๋ก '๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฌด์ํ ๊ฒ์ ๋ฐฉ์'์ ์์์ต๋๋ค.
1. ๋ณ๋ชฉ์ ์์ธ: ๋ฌด์ํ๊ฒ ๋ค ๋ค์ง๋ 'ํ ํ ์ด๋ธ ์ค์บ(Full Table Scan)'
๋ฌธ์ ๋ฅผ ํ์ ํ๊ธฐ ์ํด ์ ๋ ์ FastAPI ์ฝ๋์์ DB๋ก ๋ ์๊ฐ๋ SQL ์ฟผ๋ฆฌ๋ฅผ ์ ๊ฒํ์ต๋๋ค. ํน์ ์นดํ ๊ณ ๋ฆฌ์ ์ต์ ๊ธ 20๊ฐ๋ฅผ ๊ฐ์ ธ์ค๋ ์์ฃผ ํ๋ฒํ ๋ก์ง์ด์์ต๋๋ค.

๊ธ์ด 100๊ฐ์ผ ๋๋ ์ด ์ฟผ๋ฆฌ๊ฐ 0.01์ด ๋ง์ ์คํ๋์์ต๋๋ค. ํ์ง๋ง ๊ธ์ด 10,000๊ฐ๊ฐ ๋์ด๊ฐ์ DB๋ ๋ค์๊ณผ ๊ฐ์ด ํ๋ํ๊ณ ์์์ต๋๋ค. "์ฃผ์ธ๋์ด ์นดํ ๊ณ ๋ฆฌ 5๋ฒ ๊ธ์ ์ฐพ์๋ฌ๋ผ๊ณ ํ๋ค? ์... ์ด๋์ง ๋ชจ๋ฅด๋๊น 1๋ฒ ๊ธ๋ถํฐ 10,000๋ฒ ๊ธ๊น์ง ํ๋ํ๋ ๋ค ์ฝ์ด๋ณด๋ฉด์ ์นดํ ๊ณ ๋ฆฌ 5๋ฒ์ธ ๊ฑธ ๊ณจ๋ผ๋ด์ผ๊ฒ ๋ค!"
์ด๊ฒ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฉ์ด๋ก 'ํ ํ ์ด๋ธ ์ค์บ(Full Table Scan)'์ด๋ผ๊ณ ๋ถ๋ฆ ๋๋ค. ์ฑ ์์ ํน์ ๋จ์ด๋ฅผ ์ฐพ์ ๋ ์์ธ(๋ชฉ์ฐจ)์ ๋ณด์ง ์๊ณ ์ฒซ ํ์ด์ง๋ถํฐ ๋ ํ์ด์ง๊น์ง ๋ชจ๋ ์ฝ์ผ๋ฉด์ ์ฐพ๋ ๊ฒ๊ณผ ๋๊ฐ์ ๋นํจ์จ์ ์ธ ํ๋์ ํ๊ณ ์์๋ ๊ฒ์ ๋๋ค. ์๋ฒ์ CPU๊ฐ ๋น๋ช ์ ์ง๋ฅด๋ ๊ฒ์ ๋น์ฐํ์ต๋๋ค.
2. ๊ตฌ์ํฌ์ ๋ฑ์ฅ: ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ธ๋ฑ์ค(Index)์ ๋ง๋ฒ
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฐ์ฅ ํ์คํ๊ณ ์ฐ์ํ ๋ฐฉ๋ฒ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ '์ธ๋ฑ์ค(Index, ์์ธ)'๋ฅผ ๋ง๋ค์ด ์ฃผ๋ ๊ฒ์ ๋๋ค.
์ธ๋ฑ์ค๋ ์ฑ ๋งจ ๋ท์ฅ์ ์๋ '์ฐพ์๋ณด๊ธฐ(์์ธ)'์ ๊ฐ์ต๋๋ค. "์นดํ ๊ณ ๋ฆฌ 5๋ฒ ๊ธ์ 100ํ์ด์ง, 250ํ์ด์ง, 800ํ์ด์ง์ ์์ด!"๋ผ๊ณ ๋ฏธ๋ฆฌ ์ ๋ ฌ๋ ์ง๋๋ฅผ DB ์๋ฒ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ ค๋๋ ๊ฒ์ ๋๋ค. ์ ๋ ์ฆ์ DB ์ ์ ํด(DBeaver)์ ์ด๊ณ , ์ ๊ฐ ์์ฃผ ๊ฒ์ ์กฐ๊ฑด(WHERE)์ผ๋ก ์ฌ์ฉํ๋ ์ปฌ๋ผ๋ค์ ์ธ๋ฑ์ค๋ฅผ ๊ฑธ์ด์ฃผ๋ SQL ๋ช ๋ น์ด๋ฅผ ์คํํ์ต๋๋ค.


3. ๊ทน์ ์ธ ๋ณํ: 2์ด์์ 0.05์ด๋ก์ ํํ ์ ํ
์ธ๋ฑ์ค ์์ฑ์ ์๋ฃํ๋ ๋ฐ๋ ๋ถ๊ณผ 5์ด๋ ๊ฑธ๋ฆฌ์ง ์์์ต๋๋ค. ๋จ๋ฆฌ๋ ๋ง์์ผ๋ก ๋ค์ ์น์ฌ์ดํธ์ ์ ์ํด ๊ฒ์ํ ์นดํ ๊ณ ๋ฆฌ๋ฅผ ํด๋ฆญํด ๋ณด์์ต๋๋ค.
๊ฒฐ๊ณผ๋ ๊ทธ์ผ๋ง๋ก ์ถฉ๊ฒฉ์ ์ด์์ต๋๋ค. ๋ฐฉ๊ธ ์ ๊น์ง 2์ด ๋๊ฒ ๋๋ ์ด ๋๋ฉฐ ๋ต๋ตํ๊ฒ ์ด๋ฆฌ๋ ๊ฒ์ํ ๋ชฉ๋ก์ด, ํด๋ฆญ๊ณผ ๋์์ ๋ ๊น์งํ ์(์ฝ 50ms) ํ๋ฉด์ ๋ฟ๋ ค์ก์ต๋๋ค. ๋ค์ ์ฟผ๋ฆฌ ์คํ ๊ณํ์ ์ดํด๋ณด๋, DB๋ ๋ ์ด์ 10,000๊ฐ์ ๊ธ์ ๋ค ๋ค์ง์ง ์์์ต๋๋ค. ์ธ๋ฑ์ค(์ง๋)๋ฅผ ์ฑ ๋ณด๊ณ ์ ํํ ์นดํ ๊ณ ๋ฆฌ 5๋ฒ์ ํด๋นํ๋ ๊ธ 20๊ฐ๋ง '์ฝ' ์ง์ด์ ๊ฐ์ ธ์ค๋ '์ธ๋ฑ์ค ์ค์บ(Index Scan)'์ผ๋ก ์๋ฒฝํ๊ฒ ๋์ ๋ฐฉ์์ด ๋ฐ๋์ด ์์์ต๋๋ค.
๋ฐฑ์๋ ๋ก์ง(ํ์ด์ฌ ์ฝ๋)์ด๋ ์๋ฒ ์ฌ์์ ๋จ ํ๋๋ ๊ฑด๋๋ฆฌ์ง ์๊ณ , ์ค์ง DB ์ธ๋ฑ์ฑ ๋ช ๋ น์ด ๋ ์ค๋ง์ผ๋ก ์ฌ์ดํธ์ ์ฒด๊ฐ ์๋๋ฅผ 10๋ฐฐ ์ด์ ๋์ด์ฌ๋ฆฐ ๊ฒ์ ๋๋ค.
๋งบ์ผ๋ฉฐ: 1์ธ ๊ฐ๋ฐ์์ผ์๋ก ๊ธฐ๋ณธ๊ธฐ(DB)์ ์ถฉ์คํด์ผ ํ๋ค
์น ๊ฐ๋ฐ์ ์ฒ์ ์์ํ ๋๋ ํ๋ คํ ํ๋ก ํธ์๋ UI๋ ํธ๋ ๋ํ ์ต์ ํ๋ ์์ํฌ์ ๋๊ธธ์ด ๊ฐ๊ธฐ ๋ง๋ จ์ ๋๋ค. ์ ์ญ์ ๊ทธ๋ฌ์ต๋๋ค. ํ์ง๋ง ์๋น์ค๊ฐ ์ปค์ง๊ณ ์ค์ ํธ๋ํฝ๊ณผ ๋ฐ์ดํฐ๊ฐ ์์ด๊ธฐ ์์ํ๋ฉด, ๊ฒฐ๊ตญ ์๋น์ค์ ์์ฌ๋ฅผ ๊ฐ๋ฅด๋ ๊ฒ์ ๊ฐ์ฅ ๋ฐ๋จ์ ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฑ๋ฅ์ด๋ผ๋ ๊ฒ์ ๋ผ์ ๋ฆฌ๊ฒ ๊นจ๋ฌ์์ต๋๋ค.
์๋ฌด๋ฆฌ ์๋ฒ๋ฅผ ์คํ ์ค์ผ์ผ๋ง(Scale-out)์ผ๋ก ์ฌ๋ฌ ๋ ๋๋ ค๋ดค์, ์ ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ DB๊ฐ ๋ณ๋ชฉ์ ์ผ์ผํค๋ฉด ์๋ฌด ์์ฉ์ด ์์ต๋๋ค.
ํน์ ์ง๊ธ ์ด์ ์ค์ธ ์น์ฌ์ดํธ๋ ์ฑ์ด ์ด์ ์์ด ๋๋ ค์ง๊ณ ์๋์? ๊ทธ๋ ๋ค๋ฉด ๋ฐฑ์๋ ์ฝ๋๋ฅผ ์๊ธฐ ์ ์ ๊ฐ์ฅ ๋จผ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฟผ๋ฆฌ๋ฅผ ์ ๊ฒํ๊ณ , ์์ฃผ ์ฐพ๋ ์ปฌ๋ผ์ ์ธ๋ฑ์ค(Index)๊ฐ ์ ๋๋ก ๊ฑธ๋ ค ์๋์ง ํ์ธํด ๋ณด์๊ธฐ ๋ฐ๋๋๋ค. ์ด ์์ '์์ธ' ํ๋๊ฐ ์ฌ๋ฌ๋ถ์ ์๋น์ค์ ์๋ฒ๋ฅผ ๊ตฌ์ํด ์ค ๊ฒ์ ๋๋ค!
โ ์์ฃผ ๋ฌป๋ ์ง๋ฌธ (FAQ)
Q1. ์ธ๋ฑ์ค(Index)๊ฐ ๊ทธ๋ ๊ฒ ์ข๋ค๋ฉด, ๋ชจ๋ ์ปฌ๋ผ์ ๋ค ๊ฑธ์ด๋๋ฉด ์ ๋๋์?
A. ์ ๋ ์ ๋ฉ๋๋ค! ์ธ๋ฑ์ค๋ ๋ง๋ฒ์ ์ฝ์ด ์๋๋๋ค. ์ธ๋ฑ์ค๋ฅผ ๋ง๋ค๋ฉด ์กฐํ๊ฐ ์์ฒญ๋๊ฒ ๋นจ๋ผ์ง๋ ๋์ , ์๋ก์ด ๊ธ์ ์ฐ๊ฑฐ๋(INSERT) ์์ /์ญ์ (UPDATE/DELETE)ํ ๋๋ง๋ค '์ง๋(์ธ๋ฑ์ค)'๋ ๊ฐ์ด ์
๋ฐ์ดํธํด์ผ ํ๋ฏ๋ก ์ฐ๊ธฐ ์๋๊ฐ ๋๋ ค์ง๋๋ค. ๋ฐ๋ผ์ ํ์ ID, ์นดํ
๊ณ ๋ฆฌ, ๋ ์ง ๋ฑ ์กฐํ ์ ์์ฃผ ์กฐ๊ฑด์ผ๋ก ์ฐ์ด๋ ํต์ฌ ์ปฌ๋ผ 2~3๊ฐ์๋ง ์ ๋ต์ ์ผ๋ก ๊ฑฐ๋ ๊ฒ์ด ์ค๋ฌด์ ํต์ฌ์
๋๋ค.
Q2. ์ DB์๋ ์ด๋ค ์ฟผ๋ฆฌ๊ฐ ๋๋ฆฐ์ง ์ด๋ป๊ฒ ์ฐพ์ ์ ์๋์?
A. ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ง๋ค ๋๋ฆฐ ์ฟผ๋ฆฌ๋ฅผ ์ฐพ์๋ด๋ ๊ธฐ๋ฅ์ด ์์ต๋๋ค. PostgreSQL์ด๋ MySQL์ ๊ฒฝ์ฐ Slow Query Log๋ฅผ ์ค์ ํด ๋๋ฉด ํน์ ์๊ฐ(์: 1์ด) ์ด์ ๊ฑธ๋ฆฌ๋ ์
์ฑ ์ฟผ๋ฆฌ๋ค์ ๋ก๊ทธ๋ก ๋จ๊ฒจ์ค๋๋ค. ๋ฐฑ์๋ ๊ฐ๋ฐ์๋ผ๋ฉด ์ฃผ๊ธฐ์ ์ผ๋ก ์ด ๋ก๊ทธ๋ฅผ ๋ชจ๋ํฐ๋งํ์ฌ ๋ณ๋ชฉ์ ์ฐพ์ ์ธ๋ฑ์ค๋ฅผ ์ถ๊ฐํด์ผ ํฉ๋๋ค.
Q3. ๋ฐ์ดํฐ๊ฐ ๋ช ๊ฐ ์์ ๋๋ ์ธ๋ฑ์ค๋ฅผ ๋ง๋ค์ด์ผ ํ๋์?
A. ๋ฐ์ดํฐ๊ฐ ์๋ฐฑ~์์ฒ ๊ฑด ์ดํ์ผ ๋๋ DB ์์ง์ด ์ธ๋ฑ์ค๋ฅผ ์ฝ๋ ๊ฒ๋ณด๋ค ๊ทธ๋ฅ ์ ์ฒด ํ ์ด๋ธ์ ํ์ด๋ฒ๋ฆฌ๋ ๊ฒ ๋ ๋น ๋ฅด๋ค๊ณ ํ๋จํ๊ธฐ๋ ํฉ๋๋ค. ๋ฐ๋ผ์ ์๋น์ค ์ด๊ธฐ๋ณด๋ค๋, ๋ฐ์ดํฐ๊ฐ ์ ์๋ฏธํ๊ฒ ์์ด๊ธฐ ์์ํ์ฌ ์๋ ์ ํ๊ฐ ์ฒด๊ฐ๋ ๋ ๋์ ํ๋ ๊ฒ์ ์ถ์ฒํฉ๋๋ค.
๐ฌ ๋๊ธ 0๊ฐ