์น์ฌ์ดํธ ๋ก๋ฉ ์๋ ์ต์ ํ: ํ์ด์ฌ(FastAPI) ์ด๋ฏธ์ง WebP ์๋ ๋ณํ ๋ฐ CDN ์ ์ฉ๊ธฐ
์น ์๋น์ค๋ฅผ ์ฒ์ ๋ฐ์นญํ๊ณ ๋๋ฉด, ํ ์คํธ๋ง ๋ฉ๊ทธ๋ฌ๋ ์๋ ํ๋ฉด์ด ๋ฐ๋ฐํด ๋ณด์ฌ ๊ณ ํ์ง ์ด๋ฏธ์ง๋ ๋ฐฐ๋๋ค์ ์๋ฉ ์ถ๊ฐํ๊ฒ ๋ฉ๋๋ค. ์ ์ญ์ ์ ์ ๋ค์ ๋์ ์ฆ๊ฒ๊ฒ ํด์ฃผ๊ธฐ ์ํด ๊ฒ์ํ๋ง๋ค ํผ์ง๋งํ ๊ณ ํ์ง JPG, PNG ์ด๋ฏธ์ง๋ค์ ํํ ๋ฃ์์ฃ . ๋ด PC์ ๋น ๋ฅธ ์์ดํ์ด ํ๊ฒฝ์์๋ ์ด๋ฏธ์ง๊ฐ ์์๊ฐ์ ๋จ๋๊น "์ค, ํ๋ฉด์ด ์์ฃผ ํ์ฌํ๊ณ ์์๋ฐ?"๋ผ๋ฉฐ ํผ์ ์ํ์์ฐฌ์ ๋น ์ก์ต๋๋ค.
ํ์ง๋ง ๋ฉฐ์น ๋ค, ์ง์ธ์ ์ค๋งํธํฐ์ผ๋ก ์ ์ฌ์ดํธ์ ์ ์ํด ๋ณด๊ณ ๋ ๊ฒฝ์ ์ ๊ธ์น ๋ชปํ์ต๋๋ค. ์งํ์ฒ ์ถํด๊ทผ ์๊ฐ๋์ ๋ถ์์ ํ ๋ชจ๋ฐ์ผ ๋ฐ์ดํฐ ํ๊ฒฝ์์๋ ํ๋ฉด์ด ํ์๊ฒ ๋ฉ์ถฐ ์๋ค๊ฐ, ์ด๋ฏธ์ง๊ฐ ์์์๋ถํฐ ์๋๋ก ๋... ๋... ๋๊ธฐ๋ฉฐ ๊ทธ๋ ค์ง๊ณ ์์๊ธฐ ๋๋ฌธ์ ๋๋ค.
๊ตฌ๊ธ์ ํ์ด์ง์คํผ๋ ์ธ์ฌ์ดํธ(PageSpeed Insights)์ ์ ์ฌ์ดํธ ์ฃผ์๋ฅผ ๋ฃ์ด๋ณด๋ ์ ์๋ ์ฒ์ฐธํ ๋นจ๊ฐ์(30์ ๋)์ด์๊ณ , "์ฐจ์ธ๋ ํ์์ ์ฌ์ฉํด ์ด๋ฏธ์ง๋ฅผ ์ ๊ณตํ์ธ์"๋ผ๋ ์ฌ๋ฉํ ๊ฒฝ๊ณ ๋ฌธ๊ตฌ๊ฐ ๋ ์์์ต๋๋ค. ๊ตฌ๊ธ SEO์์ '๋๋ฆฐ ๋ก๋ฉ ์๋'๋ ์น๋ช ์ ์ธ ๊ฐ์ ์์ธ์ ๋๋ค. ์ ์ ๋ค์ 3์ด ์ด์ ํ๋ฉด์ด ๋จ์ง ์์ผ๋ฉด ์๋น ์์ด '๋ค๋ก ๊ฐ๊ธฐ'๋ฅผ ๋๋ฌ๋ฒ๋ฆฌ๋๊น์.
์ค๋์ ์ด ๋ฌด๊ฑฐ์ด ์ด๋ฏธ์ง๋ค์ ํ์ด์ฌ(FastAPI) ๋ฐฑ์๋์์ ๊นํธ์ฒ๋ผ ๊ฐ๋ณ๊ฒ ์์ถํ๊ณ , Supabase Storage๋ฅผ ํตํด ์ด์์ฒ๋ผ ๋น ๋ฅด๊ฒ ์์์ฃผ์ด ๋ก๋ฉ ์๋๋ฅผ ๊ทน์ ์ผ๋ก ๋์ด์ฌ๋ฆฐ ์ ๋ง์ ์ต์ ํ ๊ฒฝํ์ ๊ณต์ ํด ๋ณผ๊น ํฉ๋๋ค.
1. ์ฒซ ๋ฒ์งธ ์๋: ํ์ด์ฌ(Python) Pillow๋ก ์ด๋ฏธ์ง WebP ์๋ ๋ณํํ๊ธฐ
๊ฐ์ฅ ๋จผ์ ํด์ผ ํ ์ผ์ ์ฉ๋์ด ๋ฌด์ํ๊ฒ ํฐ ์๋ณธ JPG, PNG ํ์ผ๋ค์ ๋ฉ์น๋ฅผ ์ค์ด๋ ๊ฒ์ด์์ต๋๋ค. ๊ตฌ๊ธ์ด ๊ถ์ฅํ๋ '์ฐจ์ธ๋ ์ด๋ฏธ์ง ํ์'์ธ WebP๋ ๊ธฐ์กด JPG ๋๋น ํ์ง ์์ค์ ๊ฑฐ์ ๋์ ๋์ง ์์ผ๋ฉด์ ์ฉ๋์ ๋ฌด๋ ค 50%~80%๊น์ง ํ๊ธฐ์ ์ผ๋ก ์ค์ฌ์ฃผ๋ ๋ง๋ฒ์ ํฌ๋งท์ ๋๋ค.
์ ์ ๊ฐ ์ฌ์ดํธ์ ์ด๋ฏธ์ง๋ฅผ ์
๋ก๋ํ ๋, ๋ฌด๊ฑฐ์ด ์๋ณธ์ ๊ทธ๋๋ก ์ ์ฅ์์ ๋ฃ๋ ๋ฉ์ฒญํ ์ง์ ๋ง์์ผ ํ์ต๋๋ค. ๊ทธ๋์ ์ ๋ FastAPI ์๋ฒ์ ์ด๋ฏธ์ง ์
๋ก๋ API ์ค๊ฐ์ ํ์ด์ฌ์ ๋ํ์ ์ธ ์ด๋ฏธ์ง ์ฒ๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ Pillow๋ฅผ ํฌ์
ํ์ต๋๋ค.
์ฝ๋๋ ์๊ฐ๋ณด๋ค ๊ฐ๋จํ์ต๋๋ค. ์ ์ ๊ฐ ์ด๋ฏธ์ง๋ฅผ ์ฌ๋ฆฌ๋ฉด, ๋ฐฑ์๋ ๋ฉ๋ชจ๋ฆฌ์์ ํ์ผ์ ๊ฐ๋ก์ฑ์ด ๊ฐ๋ก ํด์๋๋ฅผ ๋ชจ๋ฐ์ผ ํ๋ฉด์ ์ถฉ๋ถํ 1200px ์ ๋๋ก ์ค์ด๊ณ (Resize), ํฌ๋งท์ ๊ฐ์ ๋ก .webp๋ก ๋ณํํ์ฌ ํ์ง(Quality)์ 80 ์์ค์ผ๋ก ์์ถํด ๋ฒ๋ ธ์ต๋๋ค.
from PIL import Image
import io
# FastAPI๋ก ๋ค์ด์จ ์ด๋ฏธ์ง ํ์ผ์ WebP๋ก ์์ถํ๋ ํต์ฌ ๋ก์ง
async def optimize_image(file_bytes):
image = Image.open(io.BytesIO(file_bytes)).convert("RGB")
# ์ฌ์ด์ฆ ์กฐ์ (์ต๋ ๋๋น 1200px ๊ธฐ์ค ๋น์จ ์ถ์)
image.thumbnail((1200, 1200))
output = io.BytesIO()
# ๋๋ง์ WebP ๋ณํ ๋ฐ ์์ถ!
image.save(output, format="WEBP", quality=80)
return output.getvalue()
์ด ์งง์ ์ฝ๋ ๋ช ์ค์ด ๊ฐ์ ธ์จ ๊ฒฐ๊ณผ๋ ์์ฒญ๋ฌ์ต๋๋ค. ์ฅ๋น 5MB๊ฐ ๋์ด๊ฐ๋ ์ด๊ณ ํ์ง ์ฌ์ง๋ค์ด ํ์ง ์ ํ ์์ด ๋จ 150KB ์์ค์ผ๋ก ์ชผ๊ทธ๋ผ๋ค์์ต๋๋ค. ๋ฐ์ดํฐ ๋ค์ด์ดํธ์ ์๋ฒฝํ๊ฒ ์ฑ๊ณตํ ๊ฒ์ด์ฃ .

2. ๋ ๋ฒ์งธ ์๋: ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋์ ์ ์ฉ ์คํ ๋ฆฌ์ง(Supabase Storage)์ CDN์ ํ ๋น๋ฆฌ๊ธฐ
์ด๋ฏธ์ง ์ฉ๋์ ์ค์๋ค๊ณ ์ต์ ํ๊ฐ ๋๋ ๊ฒ์ ์๋๋๋ค. ์ด๋ ๊ฒ ๊ฐ๋ฒผ์์ง WebP ์ด๋ฏธ์ง๋ฅผ ์ ์ ์ ํ๋ฉด๊น์ง '์ผ๋ง๋ ๋นจ๋ฆฌ' ๋ฐฐ๋ฌํด ์ฃผ๋๋๊ฐ ๊ด๊ฑด์ด์์ต๋๋ค.
์ด๋ณด ์์ ์ ์ด๋ฏธ์ง ํ์ผ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค(DB)์ Base64 ํ ์คํธ ํํ๋ก ์ฐ๊ฒจ๋ฃ๊ฑฐ๋, ์๋ฒ ๋ณธ์ฒด ํด๋์ ๋๋ ์ ์ฅํ๊ธฐ๋ ํ์ต๋๋ค. ํ์ง๋ง ์ด๋ ๊ฒ ํ๋ฉด ์ด๋ฏธ์ง๋ฅผ ๋ถ๋ฌ์ฌ ๋๋ง๋ค DB์ ์๋ฒ CPU๊ฐ ๋๋๋๋ฉฐ ์ผํด์ผ ํด์ ์ ์ฒด ์ฌ์ดํธ๊ฐ ๋ฉ์นซ๊ฑฐ๋ฆฌ๋ ๋ณ๋ชฉ ํ์์ด ๋ฐ์ํฉ๋๋ค.
๊ทธ๋์ ์ ๋ ์ ์ ํ์ผ ์ฒ๋ฆฌ์ ํนํ๋ Supabase Storage๋ก ๋ชจ๋ ์ด๋ฏธ์ง๋ฅผ ์ด์ฌ์์ผฐ์ต๋๋ค. Supabase Storage๋ AWS S3์ ๋น์ทํ๊ฒ ์ด๋ฏธ์ง๋ ์์ ํ์ผ๋ง ์ ๋ฌธ์ ์ผ๋ก ๋ณด๊ดํด ์ฃผ๋ ๊ฑฐ๋ํ ์ฐฝ๊ณ ์ ๋๋ค. ๋ฐฑ์๋(FastAPI)๋ ์์ถ์ด ๋๋ WebP ์ด๋ฏธ์ง๋ฅผ ๊ณง๋ฐ๋ก Supabase Storage๋ก ๋์ ธ๋ฒ๋ฆฌ๊ณ , DB์๋ ์ด๋ฏธ์ง๊ฐ ์ ์ฅ๋ 'URL ์ฃผ์'๋ง ๋ฌ๋ ํ ์ค ๊ธฐ๋กํ๋๋ก ๊ตฌ์กฐ๋ฅผ ์น ๋ฏ์ด๊ณ ์ณค์ต๋๋ค.
์ฌ๊ธฐ์ ๋ํด, Supabase์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณตํ๋ CDN(์ฝํ ์ธ ์ ์ก ๋คํธ์ํฌ) ๊ธฐ๋ฅ์ด ๋ ๊ฐ๋ฅผ ๋ฌ์์ฃผ์์ต๋๋ค. ํ๊ตญ์ ์๋ ์ ์ ๊ฐ ์ ์ฌ์ดํธ์ ์ ์ํ๋ฉด ์์ธ์ ์๋ ์บ์ ์๋ฒ์์ ์ด๋ฏธ์ง๋ฅผ ์ด์ฃผ๊ณ , ๋ฏธ๊ตญ์ ์๋ ์ ์ ๊ฐ ์ ์ํ๋ฉด ๋ฏธ๊ตญ ์บ์ ์๋ฒ์์ ์ด๋ฏธ์ง๋ฅผ ์ด์ฃผ๋ ์์ ๋๋ค. ๋ฉ์ธ ์๋ฒ๋ ์ด๋ฏธ์ง ์ ์ก์ด๋ผ๋ ์ค๋ ธ๋์์ ์๋ฒฝํ๊ฒ ํด๋ฐฉ๋์์ต๋๋ค.

3. ๊ฒฐ๊ณผ: ๋ก๋ฉ ์๊ฐ 3์ด โก๏ธ 0.5์ด, ์ฝ์ด ์น ๋ฐ์ดํ(LCP) ์งํ ๋ฌ์ฑ
์ด ๋ ๊ฐ์ง ์์ ์ ๋ง์น ๋ค, ๋ค์ ์ง์ธ์ ์ค๋งํธํฐ์ ๋น๋ ค ์ฌ์ดํธ์ ์ ์ํด ๋ณด์์ต๋๋ค. ํ๋ฉด์ ์คํฌ๋กคํ ๋๋ง๋ค ์์ญ ์ฅ์ ์ด๋ฏธ์ง๋ค์ด ์ง์ฐ์๊ฐ 0.1์ด๋ ์์ด ํ๋ฉด์ 'ํํํ' ๋ฐํ๋ฏ ์ฆ๊ฐ์ ์ผ๋ก ๋ก๋ฉ๋๋ ๊ฒ์ ๋ณผ ์ ์์์ต๋๋ค. ์ฒด๊ฐ ์๋๊ฐ ๋ฌธ์ ๊ทธ๋๋ก '๋น'์ด ๋์์ต๋๋ค.
๊ฐ์ฅ ๋ฟ๋ฏํ๋ ์๊ฐ์ ๋ฉฐ์น ๋ค ๊ตฌ๊ธ ์์น ์ฝ์(Search Console)์ ๋ค์ด๊ฐ์ ๋์ ๋๋ค. ๊ฒฝ๊ณ ๋ฑ์ด ๋ฒ์ฉ์ด๋ '์ฝ์ด ์น ๋ฐ์ดํ(Core Web Vitals)' ๋ฉ๋ด์ LCP(์ต๋ ์ฝํ ์ธ ๋ ๋๋ง ์๊ฐ) ์งํ๊ฐ '๊ฐ์ ํ์'์์ ์๋กฑํ ์ด๋ก์ '์ข์' ์ํ๋ก ๋ฐ๋์ด ์์์ต๋๋ค. ๊ตฌ๊ธ์๊ฒ "๋ด ์ฌ์ดํธ ์์ฒญ ๋น ๋ฅด๊ณ ์พ์ ํ๋๊น ๊ฒ์ ์์ ํํ ์ฌ๋ ค์ค!"๋ผ๊ณ ๋ณ๋ณํ๊ฒ ์ดํํ ์ ์๋ ์๋ฒฝํ ์คํ์ ๊ฐ์ถ ์ ์ ๋๋ค.
๋งบ์ผ๋ฉฐ: SEO์ ์จ์ ๊ถ๋ ฅ์, '์๋'๋ฅผ ์ก์๋ผ
๊ตฌ๊ธ ์ ๋์ผ์ค ์น์ธ์ด๋ ๊ฒ์ ์์ง ์ต์ ํ(SEO)๋ฅผ ์ด์ผ๊ธฐํ ๋, ๋ณดํต ๊ธ์ ์๋ ํค์๋ ๋ฐฐ์น ๊ฐ์ 'ํ ์คํธ'์๋ง ์ง์คํ๋ ๊ฒฝํฅ์ด ์์ต๋๋ค.
ํ์ง๋ง ์๋ฌด๋ฆฌ ์ข์ ๊ธ์ ์จ๋์ด๋, ์ ์ ๊ฐ ๊ทธ ๊ธ์ ๋ณด๊ธฐ ์ํด ํ๋ฉด์ด ๋ฐ ๋๊น์ง 3์ด ์ด์์ ๊ธฐ๋ค๋ ค์ผ ํ๋ค๋ฉด ๊ทธ ์ฌ์ดํธ๋ ๊ตฌ๊ธ์๊ฒ ๋ฒ๋ฆผ๋ฐ๊ฒ ๋ฉ๋๋ค. ๊ธฐ์ ์ ์ธ ์ต์ ํ๋ฅผ ํตํด ์ฌ์ดํธ์ ๊ธฐ์ด ์ฒด๋ ฅ์ ํผํผํ๊ฒ ๋ค์ ธ๋๋ ๊ฒ์ด ์ง์ง ์ฅ๊ธฐ์ ์ธ SEO์ ์น๋ถ์ฒ๋ผ๋ ๊ฒ์ ์ด๋ฒ ๊ธฐํ์ ๊น์ด ๊นจ๋ฌ์์ต๋๋ค.
์๋ฒ ๋น์ฉ์ ํ ํผ์ด๋ผ๋ ์๋ผ๊ณ ์ฌ์ดํธ ์ฑ๋ฅ์ ๊ทนํ์ผ๋ก ๋์ด์ฌ๋ ค์ผ ํ๋ 1์ธ ๊ฐ๋ฐ์๋ถ๋ค! ์ง๊ธ ๋น์ฅ ๋ด ์ฌ์ดํธ์ ์ฌ๋ผ๊ฐ๋ ์ด๋ฏธ์ง๋ค์ด JPG์ธ์ง, WebP์ธ์ง ๊ผญ ํ์ธํด ๋ณด์๊ธฐ ๋ฐ๋๋๋ค. ํ์ด์ฌ ์ฝ๋ ๋จ 10์ค๋ง ์ถ๊ฐํ๋ฉด ์ฌ๋ฌ๋ถ์ ๋ฌด๊ฑฐ์ ๋ ์ฌ์ดํธ๋ ๊นํธ์ฒ๋ผ ๋ ์์ค๋ฅผ ์ ์์ต๋๋ค.
๐ฌ ๋๊ธ 0๊ฐ