ํ์ด์ฌ FastAPI๋ก ๋ค๊ตญ์ด ์น์ฌ์ดํธ ๊ตฌ์ถํ๊ธฐ: DeepL API ๋ฒ์ญ ์๋ํ ๋ฐ Supabase DB ์บ์ฑ ์ต์ ํ ๊ฒฝํ๊ธฐ
์น์ฌ์ดํธ๋ฅผ ํ๋ ๋ง๋ค์ด ์ด์ํ๋ค ๋ณด๋ฉด ํ์ฐ์ ์ผ๋ก 'ํธ๋ํฝ์ ํ๊ณ'๋ผ๋ ๋ฒฝ์ ๋ถ๋ชํ๊ฒ ๋ฉ๋๋ค. ํนํ ํ๊ตญ์ด๋ก๋ง ์๋น์ค๋ฅผ ์ ๊ณตํ ๊ฒฝ์ฐ, ์๋ฌด๋ฆฌ ์ฝํ ์ธ ๊ฐ ์ข์๋ ๊ฒฐ๊ตญ 5์ฒ๋ง ๋ช ์ด๋ผ๋ ๊ตญ๋ด ์ ์ฌ ํ๊น ์์ ๊ฐํ๊ฒ ๋์ฃ . ์ ์ฌ์ดํธ ์ญ์ ์ด๊ธฐ์๋ ๊ตญ๋ด ์ ์ ๋ค์ ๋ฐฉ๋ฌธ์ผ๋ก ์ ์ ํ ์ฌ๋ฏธ๋ฅผ ๋ณด์์ง๋ง, ์ ์ฐจ ์ฑ์ฅ์ธ๊ฐ ์ ์ฒด๋๋ ๊ฒ์ ๋๋ผ๊ณ ๊ณผ๊ฐํ ๊ฒฐ๋จ์ ๋ด๋ ธ์ต๋๋ค. ๋ฐ๋ก "์์ด, ์ผ๋ณธ์ด ๋ฑ ๋ค๊ตญ์ด๋ฅผ ์ง์ํด์ ํด์ธ ์ ์ ๋ค์ ์ ์ ์ํค์!"๋ ๊ฒ์ด์์ต๋๋ค.
๋จ์ํ ์ ์ ์ธ ๋ฉ๋ด ๊ธ์๋ง ๋ฐ๊พธ๋ i18n(๊ตญ์ ํ) ์์ ์ด ์๋๋ผ, ์ ์ ๋ค์ด ์ค์๊ฐ์ผ๋ก ์ฌ๋ฆฌ๋ ๋์ ์ธ ๊ฒ์๊ธ๊ณผ ๋๊ธ๋ค๊น์ง ๋ชจ๋ ๋ฒ์ญํด์ผ ํ๋ ๊ฝค๋ ๊น๋ค๋ก์ด ์์ ์ด์์ต๋๋ค. ์ค๋์ ์ ๊ฐ ํ์ด์ฌ(FastAPI) ๋ฐฑ์๋์ ์๋ ๋ฒ์ญ API๋ฅผ ๋ถ์ด๋ฉด์ ๊ฒช์๋ ๋น์ฉ ๋ฌธ์ ์, ์ด๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค(Supabase) ๊ตฌ์กฐ ๊ฐ์ ์ผ๋ก ํด๊ฒฐํ '์ฝ์ง๊ธฐ'๋ฅผ ์์ธํ ํ์ด๋ณด๋ ค ํฉ๋๋ค.
1. ๋ฒ์ญ ์์ง์ ์ ํ: ์ ๊ตฌ๊ธ ๋ฒ์ญ(Google Translate) ๋์ DeepL์ ์ ํํ๋?
๊ฐ์ฅ ๋จผ์ ํด์ผ ํ ์ผ์ ๋ฒ์ญ์ ๋ด๋นํ ๋๋(API)๋ฅผ ๊ณ ๋ฅด๋ ๊ฒ์ด์์ต๋๋ค. ๋ณดํต ๊ฐ์ฅ ๋จผ์ ๋ ์ฌ๋ฆฌ๋ ๊ฒ์ ์ฒํ๋ฌด์ ๊ตฌ๊ธ ๋ฒ์ญ(Google Cloud Translation API)์ ๋๋ค. ์ ์ญ์ ์ฒ์์๋ ์ต์ํ ๊ตฌ๊ธ ๋ฒ์ญ๊ธฐ๋ฅผ ์ฐ๋ํด ํ ์คํธ๋ฅผ ์งํํ์ต๋๋ค.
ํ์ง๋ง ์ปค๋ฎค๋ํฐ ๊ฒ์ํ ํน์ฑ์ ์ ์ ๋ค์ด ์์ฑํ๋ ๊ธ์๋ ์ ์กฐ์ด, ์ธํฐ๋ท ๋ฐ, ๊ทธ๋ฆฌ๊ณ ์๋ต๋ ์ฃผ์ด ๋ฑ ๋น๋ฌธ์ด ์์ฒญ๋๊ฒ ๋ง์ต๋๋ค. ๊ตฌ๊ธ ๋ฒ์ญ๊ธฐ๋ ์ด๋ฐ ๋ฌธ์ฅ๋ค์ ๋๋ฌด ๊ธฐ๊ณ์ ์ด๊ณ ๋ฑ๋ฑํ๊ฒ ๋ฒ์ญํ๋ค ๋ณด๋, ์ธ๊ตญ์ธ์ด ์ฝ์์ ๋ ๋ฌธ๋งฅ์ด ์ ํ ๋ง์ง ์๋ ๊ฒฝ์ฐ๊ฐ ํ๋คํ์ต๋๋ค.
๊ทธ๋์ ๋์์ผ๋ก ์ ํํ ๊ฒ์ด ๋ฐ๋ก DeepL(๋ฅ์) API์ ๋๋ค. DeepL์ ์ธ๊ณต์ ๊ฒฝ๋ง ๊ธฐ๋ฐ์ผ๋ก ๋ฌธ๋งฅ์ ํ์ ํ๋ ๋ฅ๋ ฅ์ด ํ์ํด์, ํ๊ตญ์ด ํน์ ์ ๋์์ค๋ ์๋ต๋ ๋งฅ๋ฝ์ ๊ธฐ๊ฐ ๋งํ๊ฒ ์บ์นํ์ฌ ์์ฐ์ค๋ฌ์ด ์์ด๋ก ๋ฒ์ญํด ์ค๋๋ค. ํ ์คํธ ์ฒ๋ฆฌ ์๋๋ ๋งค์ฐ ๋น ๋ฅด๊ณ , FastAPI์์ ํธํ์ฑ๋ ํ๋ฅญํ๊ธฐ์ ์ฃผ์ ์์ด DeepL์ ๋ฉ์ธ ๋ฒ์ญ ์์ง์ผ๋ก ์ฑํํ์ต๋๋ค. (๋ฌผ๋ก DeepL์ด ์ง์ํ์ง ์๋ ์์ ์ธ์ด์ ํํด์๋ง ๊ตฌ๊ธ ๋ฒ์ญ API๋ฅผ ๋ณด์กฐ๋ก ์ฌ์ฉํ๋๋ก ํด๋ฐฑ(Fallback) ๊ตฌ์กฐ๋ฅผ ์งฐ์ต๋๋ค.)
2. ํ์ด์ฌ(FastAPI) ๋ฐฑ์๋์ DeepL API ์ฐ๋ํ๊ธฐ
DeepL API๋ฅผ FastAPI ์๋ฒ์ ๋ถ์ด๋ ๊ณผ์ ์ ๊ณต์ ํ์ด์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(deepl-python) ๋๋ถ์ ์์ฃผ ์์ํ์ต๋๋ค. ์ ์ ๊ฐ ๊ฒ์๊ธ์ ํด๋ฆญํ์ฌ ์์ธ ํ์ด์ง๋ฅผ ์์ฒญํ ๋, ํด๋ผ์ด์ธํธ(๋ธ๋ผ์ฐ์ )์ ์ธ์ด ์ค์ (Accept-Language)์ ํ์ธํ์ฌ ํ๊ตญ์ด๊ฐ ์๋๋ผ๋ฉด ์ฆ์ ๋ฒ์ญ๋ณธ์ ์ ๊ณตํ๋๋ก API ๋ผ์ฐํฐ๋ฅผ ์ค๊ณํ์ต๋๋ค.

์ฝ๋๋ฅผ ๋ฐฐํฌํ๊ณ ์ง์ ์์ด ํ๊ฒฝ์ผ๋ก ์ฌ์ดํธ์ ์ ์ํด ๋ณด์์ต๋๋ค. ๊ฒ์๊ธ์ด 1์ด๋ ์ ๋์ด ์๋ฒฝํ๊ณ ์์ฐ์ค๋ฌ์ด ์์ด๋ก ๋ฐ๋์ด ๋์ค๋ ๊ฒ์ ๋ณด๋ ์ง๋ฆฟํ ์พ๊ฐ์ด ๋ฐ๋ ค์์ต๋๋ค. ๋๋์ด ๋ด ์ฌ์ดํธ๊ฐ ๊ธ๋ก๋ฒ๋ก ๋๊ฐ๋ค๋ ์๊ฐ์ ๋ค๋ด์ฃ .
3. ์ฒญ๊ตฌ์์ ๊ณตํฌ: ๋ฒ์ญ API ํธ์ถ ๋น์ฉ์ ํจ์
ํ์ง๋ง ๊ธฐ์จ๋ ์ ์, ๋ฉฐ์น ๋ค DeepL ๋์๋ณด๋์ ๋ค์ด๊ฐ ๋ณธ ์ ๋ ๊ฒฝ์ ์ ๊ธ์น ๋ชปํ์ต๋๋ค. ๋ฌด๋ฃ๋ก ์ ๊ณต๋๋ ํ ๋ฌ 50๋ง ์์ ๋ฒ์ญ ์ ๊ณต๋์ด ๋จ 3์ผ ๋ง์ ๋ฐ๋ฅ๋๋ฒ๋ ธ๊ณ , ์ ๋ฃ ๊ณผ๊ธ์ด ์์๋๋ ค ํ๊ณ ์์๊ธฐ ๋๋ฌธ์ ๋๋ค.
์์ธ์ ๋ช ํํ์ต๋๋ค. ํด์ธ์์ ํฌ๋กค๋ง ๋ด์ด๋ ๊ฒ์ ์์ง ๋ก๋ด์ด ์ ์ฌ์ดํธ์ ์๋ง์ ๊ฒ์๊ธ์ ๊ธ์ด๊ฐ ๋๋ง๋ค, ํน์ ์ฌ๋ฌ ๋ช ์ ์ธ๊ตญ์ธ ์ ์ ๊ฐ '๊ฐ์ ๊ฒ์๊ธ'์ ์กฐํํ ๋๋ง๋ค ๋ฐฑ์๋ ์๋ฒ๊ฐ ๋ฉ์ฒญํ๊ฒ ๋งค๋ฒ ๋๊ฐ์ ๋ฌธ์ฅ์ DeepL API๋ก ์ ์กํ์ฌ ๋ฒ์ญ์ ์์ฒญํ๊ณ ์์๋ ๊ฒ์ ๋๋ค. ๋ฒ์ญ API๋ ๊ธ์ ์๋๋ก ๊ณผ๊ธ๋๊ธฐ ๋๋ฌธ์, ์ด๋๋ก ๋์๋ค๊ฐ๋ ์๋ฒ๋น๋ก ํ์ฐํ ๊ฒ์ด ๋ปํ์ต๋๋ค.
4. Supabase DB ์บ์ฑ์ผ๋ก ๋น์ฉ 90% ์ ๊ฐํ๊ธฐ
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ์ํคํ ์ฒ ์ฌ์ค๊ณ๊ฐ ์๊ธํ์ต๋๋ค. ํต์ฌ์ "ํ ๋ฒ ๋ฒ์ญํ ๋ฌธ์ฅ์ ์ฐ๋ฆฌ ์ง ์ฐฝ๊ณ (DB)์ ์ ์ฅํด ๋๊ณ , ๋ค์๋ฒ์๋ API๋ฅผ ํธ์ถํ์ง ๋ง๊ณ ์ฐฝ๊ณ ์์ ๊บผ๋ด ์ฐ์"๋ผ๋ '๋ฐ์ดํฐ๋ฒ ์ด์ค ์บ์ฑ(Caching)' ์ ๋ต์ด์์ต๋๋ค.
์ ๋ ์ฌ์ฉ ์ค์ธ Supabase(PostgreSQL) ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ฒ์๊ธ ํ
์ด๋ธ(posts) ๊ตฌ์กฐ๋ฅผ ์์ ํ์ต๋๋ค. ๊ธฐ์กด์ content ์ปฌ๋ผ๋ง ์๋ ๊ฒ์ ์ถ๊ฐ๋ก content_en (์์ด ๋ฒ์ญ๋ณธ), content_ja (์ผ๋ณธ์ด ๋ฒ์ญ๋ณธ) ๋ฑ์ ์ปฌ๋ผ์ ๋ง๋ค์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ FastAPI ๋ฐฑ์๋ ๋ก์ง์ ์๋์ ๊ฐ์ด ์ ๋ฉด ์์ ํ์ต๋๋ค.
์ธ๊ตญ์ธ ์ ์ ๊ฐ 100๋ฒ ๊ฒ์๊ธ์ ์กฐํํ๋ค.
DB์
postsํ ์ด๋ธ์ ํ์ธํ์ฌ,content_en์ปฌ๋ผ์ ์ด๋ฏธ ๋ฒ์ญ๋ ๋ฐ์ดํฐ๊ฐ ์๋์ง ๊ฒ์ฌํ๋ค.(์บ์ ํํธ) ๋ง์ฝ ๋ฒ์ญ๋ณธ์ด ์ ์ฅ๋์ด ์๋ค๋ฉด? DeepL API๋ฅผ ์ณ๋ค๋ณด์ง๋ ์๊ณ DB์ ์๋ ์์ด ํ ์คํธ๋ฅผ ๋ฐ๋ก ๊บผ๋ด์ ๋ณด์ฌ์ค๋ค. (๋น์ฉ 0์, ์๋ 0.01์ด)
(์บ์ ๋ฏธ์ค) ๋ง์ฝ ๋ฒ์ญ๋ณธ์ด ๋น์ด์๋ค๋ฉด(
NULL)? ๊ทธ๋๋ง ๋ฑ ํ ๋ฒ DeepL API๋ฅผ ํธ์ถํด ๋ฒ์ญ์ ๋ฐ์์จ ๋ค, ์ ์ ์๊ฒ ๋ณด์ฌ์ค๊ณผ ๋์์ DB์content_en์ปฌ๋ผ์ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์๊ตฌ์ ์ผ๋ก ์ ์ฅ(UPDATE) ํด๋๋ค.
์ด ๊ฐ๋จํ ๊ตฌ์กฐ ๋ณ๊ฒฝ์ ํจ๊ณผ๋ ๊ทธ์ผ๋ง๋ก ๋๋ผ๋งํฑํ์ต๋๋ค. ์ด๋ค ์ธ๊ธฐ ๊ฒ์๋ฌผ์ 1๋ง ๋ช ์ ์ธ๊ตญ์ธ์ด ์กฐํํ๋๋ผ๋, ๋ฒ์ญ API๋ ์ต์ด 1๋ช ์งธ์ ๋จ ํ ๋ฒ๋ง ํธ์ถ๋๊ณ ๋๋จธ์ง 9,999๋ช ์ ์ฐ๋ฆฌ DB์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ๋ณด๊ฒ ๋ฉ๋๋ค. ๋ฒ์ญ ํ์ง์ ๊ทธ๋๋ก ์ ์งํ๋ฉด์, API ์ฌ์ฉ๋๊ณผ ์ฒญ๊ตฌ ๋น์ฉ์ ๋ฌด๋ ค 90% ์ด์ ์ฐ์ด๋ฒ๋ฆฌ๋ ๋ฐ ์ฑ๊ณตํ ๊ฒ์ด์ฃ . DB ์กฐํ ์๋๊ฐ API ๋คํธ์ํฌ ํธ์ถ ์๋๋ณด๋ค ํจ์ฌ ๋น ๋ฅด๊ธฐ ๋๋ฌธ์, ์ธ๊ตญ์ธ ์ ์ ๋ค์ด ๋๋ผ๋ ํ์ด์ง ๋ก๋ฉ ์๋๋ ๋์ ๋๊ฒ ๊ฐ์ ๋์์ต๋๋ค.
๋งบ์ผ๋ฉฐ: ๊ธ๋ก๋ฒ ์๋น์ค ํ์ฅ์ ๊ฟ๊พธ๋ 1์ธ ๊ฐ๋ฐ์๋ค์๊ฒ
์ฒ์์๋ ๋ง์ฐํ๊ฒ "๋ฒ์ญ API๋ง ์ฐ๋ํ๋ฉด ๋ค๊ตญ์ด ์ง์ ๋๋๋ ๊ฑฐ ์๋์ผ?"๋ผ๊ณ ๊ฐ๋ณ๊ฒ ์๊ฐํ๋ค๊ฐ, ํธ๋ํฝ๊ณผ ๋น์ฉ์ด๋ผ๋ ํ์ค์ ์ธ ๋ฒฝ์ ๋ถ๋ชํ๋ฉฐ ์์คํ ์ํคํ ์ฒ์ ์ค์์ฑ์ ๋ผ์ ๋ฆฌ๊ฒ ๋ฐฐ์ ์ต๋๋ค.
๋ค๊ตญ์ด ์ฒ๋ฆฌ๋ฅผ ์ํด DeepL๊ณผ ๊ตฌ๊ธ ๋ฒ์ญ์ ์ ์ธ์งํ๊ณ , ์ด๋ฅผ ํ์ด์ฌ ์๋ฒ์ ์ด๋ป๊ฒ ๋ถํ ์์ด ๋ น์ฌ๋ผ์ง ๊ณ ๋ฏผํ๋ ๊ณผ์ ์ ๋ถ๋ช ๊ณ ํต์ค๋ฌ์ ์ต๋๋ค. ํ์ง๋ง ํ ๋ฒ ํํํ๊ฒ ์บ์ฑ ์์คํ ์ ๊ตฌ์ถํด ๋๊ณ ๋๋, ์ด์ ๋ ๊ตฌ๊ธ ์์น ์ฝ์์ ๋ฏธ๊ตญ, ์ผ๋ณธ ๋ฑ ํด์ธ ๊ตญ๊ฐ์์ ์ ์ ๋๋ ํธ๋ํฝ์ด ์ฐํ๋ ๊ฒ์ ๋ณด๋ฉฐ ๋งค์ผ๋งค์ผ ํฐ ์ฑ์ทจ๊ฐ์ ๋๋ผ๊ณ ์์ต๋๋ค.
์ธ์ด์ ์ฅ๋ฒฝ ๋๋ฌธ์ ๋ด๊ฐ ๋ง๋ ์ข์ ์๋น์ค๊ฐ ๊ตญ๋ด์๋ง ๋จธ๋ฌด๋ ๊ฒ์ด ์์ฌ์ฐ์๋ค๋ฉด, ํ์ด์ฌ๊ณผ ๋ฒ์ญ API์ ์กฐํฉ์ ํตํด ๊ณผ๊ฐํ๊ฒ ์ธ๊ณ ๋ฌด๋๋ก ๋๊ฐ๋ณด์๋ ๊ฒ์ ์ด๋จ๊น์? ๋ฌผ๋ก , ์ค๋ ์ ๊ฐ ๋ง์๋๋ฆฐ 'DB ๋ฒ์ญ ์บ์ฑ ๊ตฌ์กฐ'๋ฅผ ์์ง ์๊ณ ๊ผญ ์ฑ๊ธฐ์ ์ ์๊น์ด API ๋น์ฉ์ด ์ค์ค ์๋ ์ผ์ ์์ผ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.

๐ฌ ๋๊ธ 0๊ฐ