์ด๋ฏธ์ง๋ฅผ Base64 ๋ฐ์ดํฐ URL๋ก ๋ณํํ๋ ๋ฐฉ๋ฒ
Base64 ์ด๋ฏธ์ง ๋ฐ์ดํฐ URL์ด๋?
Base64 ์ด๋ฏธ์ง ๋ฐ์ดํฐ URL์ ์ ์ฒด ์ด๋ฏธ์ง ํ์ผ์ ํ ์คํธ ๋ฌธ์์ด๋ก ์น ๋ฌธ์์ ์ง์ ์๋ฒ ๋ฉํ์ฌ, ์ด๋ฏธ์ง๋ฅผ ๋ก๋ํ๊ธฐ ์ํ ๋ณ๋์ HTTP ์์ฒญ์ด ํ์ ์๊ฒ ๋ง๋ญ๋๋ค. ๋ธ๋ผ์ฐ์ ๊ฐ ์ธ๋ถ ํ์ผ์ ๊ฐ์ ธ์ค๋ ๋์ , ์ด๋ฏธ์ง ๋ฐ์ดํฐ๊ฐ HTML ๋๋ CSS์ ์ด๋ฏธ ํฌํจ๋์ด ์์ต๋๋ค.
ํ์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg==
๊ตฌ๋ถํด ๋ณด๋ฉด:
data:โ ๋ฐ์ดํฐ URI ์คํด ์ ๋์ฌimage/pngโ ์๋ฒ ๋ฉ๋ ์ด๋ฏธ์ง์ MIME ์ ํ;base64โ Base64 ์ธ์ฝ๋ฉ์์ ๋ํ๋ ๋๋ค,iVBORw0...โ ์ค์ Base64๋ก ์ธ์ฝ๋ฉ๋ ์ด๋ฏธ์ง ๋ฐ์ดํฐ
์ ์ด๋ฏธ์ง๋ฅผ Base64๋ก ๋ณํํด์ผ ํ ๊น์?
์ด๋ฏธ์ง๋ฅผ Base64๋ก ์๋ฒ ๋ฉํ๋ ๊ฒ์ ์ฌ๋ฌ ์๋๋ฆฌ์ค์์ ์ ์ฉํฉ๋๋ค:
HTTP ์์ฒญ ๊ฐ์
๊ฐ ์ธ๋ถ ์ด๋ฏธ์ง ํ์ผ์ ๋ณ๋์ HTTP ์์ฒญ์ด ํ์ํฉ๋๋ค. Base64 ๋ฐ์ดํฐ URL์ ์ด๋ฌํ ์์ฒญ์ ์ ๊ฑฐํ์ฌ, ํนํ ์ง์ฐ์ด ๋์ ์ฐ๊ฒฐ์ด๋ ์์ ์ ์ ์ด ๋ง์ ํ์ด์ง์ ๊ฒฝ์ฐ ํ์ด์ง ๋ก๋ ์๊ฐ์ ๊ฐ์ ํ ์ ์์ต๋๋ค.
์์ฒด ํฌํจ๋ ๋ฌธ์
Base64 ์ด๋ฏธ์ง๋ HTML ํ์ผ์ ์์ ํ ์ด์ ๊ฐ๋ฅํ๊ฒ ๋ง๋ญ๋๋ค. Base64 ์ด๋ฏธ์ง๊ฐ ํฌํจ๋ ์ด๋ฉ์ผ ํ ํ๋ฆฟ์ ์์ ์์ ์ด๋ฉ์ผ ํด๋ผ์ด์ธํธ๊ฐ ์ธ๋ถ ๋ฆฌ์์ค๋ฅผ ์ฐจ๋จํด๋ ์๋ํฉ๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก, ์๋ฒ ๋ฉ๋ ์ด๋ฏธ์ง๊ฐ ์๋ HTML ๋ฌธ์๋ ๊นจ์ง ์ด๋ฏธ์ง ๊ฒฝ๋ก๋ฅผ ๊ฑฑ์ ํ์ง ์๊ณ ๋จ์ผ ํ์ผ๋ก ๊ณต์ ํ ์ ์์ต๋๋ค.
์ฑ๋ฅ์ด ์ค์ํ ํ์ด์ง
์ต์๋จ ํ์ด๋ก ์ด๋ฏธ์ง์ ์ค์ํ UI ์์์ ๊ฒฝ์ฐ, ์ถ๊ฐ ์๋ณต์ ์ ๊ฑฐํ๋ฉด LCP(Largest Contentful Paint)์ ๊ฐ์ ์งํ๋ฅผ ๊ฐ์ ํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ ์์ ์ด๋ฏธ์ง์๋ง ์ ์ฉํ๋ฉฐ, ํฐ ์ด๋ฏธ์ง์ ๊ฒฝ์ฐ ์ธ๋ผ์ธํ๊ฐ ์คํ๋ ค ์ญํจ๊ณผ๋ฅผ ๋ ๋๋ค.
์คํ๋ผ์ธ์์ ์๋
์ด๋ฏธ์ง๊ฐ ๋ฐ์ดํฐ URL๋ก ์๋ฒ ๋ฉ๋๋ฉด ๋คํธ์ํฌ ์ ๊ทผ ์์ด๋ ์๋ํฉ๋๋ค. ์ด๋ ์คํ๋ผ์ธ ์น ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ PWA(Progressive Web App)์ ์ ์ฉํฉ๋๋ค.
์ด๋ฏธ์ง๋ฅผ Base64๋ก ๋ณํํ๋ ๋ฐฉ๋ฒ
๋ฐฉ๋ฒ 1: ์จ๋ผ์ธ ๋๊ตฌ ์ฌ์ฉํ๊ธฐ (๊ฐ์ฅ ์ฌ์)
์ด๋ฏธ์ง๋ฅผ Base64๋ก ๋ณํํ๋ ๊ฐ์ฅ ๋น ๋ฅธ ๋ฐฉ๋ฒ์ ์ ์ฉ ์จ๋ผ์ธ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค. ๋ฌด๋ฃ ์จ๋ผ์ธ Base64 ์ธ์ฝ๋์ ์ด๋ฏธ์ง๋ฅผ ์ ๋ก๋ํ๊ฑฐ๋ ๋๋๊ทธ ์ค ๋๋กญํ๋ฉด, ์ฝ๋์ ๋ถ์ฌ๋ฃ์ ์ ์๋ ์์ ํ ๋ฐ์ดํฐ URL์ ์ป์ ์ ์์ต๋๋ค.
๋ฐฉ๋ฒ 2: ๋ธ๋ผ์ฐ์ ์์ JavaScript ์ฌ์ฉํ๊ธฐ
FileReader API๋ ์ฌ์ฉ์๊ฐ ์ ํํ ์ด๋ฏธ์ง๋ฅผ Base64๋ก ๋ณํํ๋ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค:
function imageToBase64(file) {
return new Promise((resolve, reject) => {
const reader = new FileReader();
reader.onload = () => resolve(reader.result);
reader.onerror = () => reject(new Error('Failed to read file'));
reader.readAsDataURL(file);
});
}
// Usage with a file input
document.getElementById('imageInput').addEventListener('change', async (event) => {
const file = event.target.files[0];
if (!file) return;
const dataUrl = await imageToBase64(file);
console.log(dataUrl);
// Output: data:image/jpeg;base64,/9j/4AAQ...
});
๋ฐฉ๋ฒ 3: Canvas API ์ฌ์ฉํ๊ธฐ
Base64๋ก ๋ณํํ๊ธฐ ์ ์ ์ด๋ฏธ์ง๋ฅผ ํฌ๊ธฐ ์กฐ์ , ์๋ฅด๊ธฐ ๋๋ ์์ถํด์ผ ํ๋ ๊ฒฝ์ฐ Canvas API๋ฅผ ์ฌ์ฉํ์ธ์:
function canvasToBase64(canvas, format = 'image/webp', quality = 0.8) {
return canvas.toDataURL(format, quality);
}
// Example: Resize an image before converting
async function resizeImageToBase64(file, maxWidth = 800) {
const bitmap = await createImageBitmap(file);
const canvas = document.createElement('canvas');
const ratio = Math.min(maxWidth / bitmap.width, 1);
canvas.width = bitmap.width * ratio;
canvas.height = bitmap.height * ratio;
const ctx = canvas.getContext('2d');
ctx.drawImage(bitmap, 0, 0, canvas.width, canvas.height);
return canvas.toBase64('image/jpeg', 0.85);
}
๋ฐฉ๋ฒ 4: Node.js ์ฌ์ฉํ๊ธฐ
์๋ฒ ์ธก์์๋ fs ๋ชจ๋๊ณผ Buffer๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฏธ์ง ํ์ผ์ Base64๋ก ๋ณํํฉ๋๋ค:
const fs = require('fs');
const path = require('path');
function encodeImageToBase64(filePath) {
const buffer = fs.readFileSync(filePath);
const base64 = buffer.toString('base64');
// Detect MIME type from extension
const ext = path.extname(filePath).toLowerCase();
const mimeTypes = {
'.png': 'image/png',
'.jpg': 'image/jpeg',
'.jpeg': 'image/jpeg',
'.gif': 'image/gif',
'.webp': 'image/webp',
'.svg': 'image/svg+xml',
'.ico': 'image/x-icon',
};
const mimeType = mimeTypes[ext] || 'image/png';
return `data:${mimeType};base64,${base64}`;
}
const dataUrl = encodeImageToBase64('logo.png');
console.log(dataUrl);
๋ฐฉ๋ฒ 5: ๋ช ๋ น์ค ์ฌ์ฉํ๊ธฐ
Linux์ macOS์์๋ ๋ด์ฅ base64 ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค:
# Encode to Base64 and wrap as a data URL
echo "data:image/png;base64,$(base64 -w 0 image.png)"
HTML์์ Base64 ์ด๋ฏธ์ง ์ฌ์ฉํ๊ธฐ
<img> ํ๊ทธ์ ์ง์ ์ฌ์ฉ:
<img
src="data:image/webp;base64,UklGRpYCAABXRUJQVlA4WAoAAAA..."
alt="Inline Logo"
width="200"
height="100"
/>
CSS์์ Base64 ์ด๋ฏธ์ง ์ฌ์ฉํ๊ธฐ
๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง๋ก ์ฌ์ฉ:
.icon-warning {
background-image: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxjaXJjbGUgY3g9IjEyIiBjeT0iMTIiIHI9IjEwIi8+PGxpbmUgeDE9IjEyIiB5MT0iMTYiIHgyPSIxMiIgeTI9IjEyIi8+PGxpbmUgeDE9IjEyIiB5MT0iOCIgeDI9IjEyLjAxIiB5Mj0iOCIvPjwvc3ZnPg==');
width: 24px;
height: 24px;
}
์ฑ๋ฅ ๊ณ ๋ ค ์ฌํญ ๋ฐ ๋ชจ๋ฒ ์ฌ๋ก
Base64 ์ด๋ฏธ์ง๊ฐ ๋์์ด ๋๋ ๊ฒฝ์ฐ
- 10KB ๋ฏธ๋ง์ ์์ ์์ด์ฝ ๋ฐ UI ์์
- ๋ ๋๋ง์ ์ฐจ๋จํ๋ ์ค์ํ ์ต์๋จ ์ด๋ฏธ์ง
- ํ์ด์ง ์ ์ฒด์์ ์ฌ์ฉ๋๋ ์คํ๋ผ์ดํธ ๋ฐ SVG ์์ด์ฝ
- ์ธ๋ถ ์ด๋ฏธ์ง๊ฐ ์์ฃผ ์ฐจ๋จ๋๋ ์ด๋ฉ์ผ ํ ํ๋ฆฟ
- ์คํ๋ผ์ธ ์ฐ์ ์น ์ฑ ๋ฐ ์์ฒด ํฌํจ ๋ฌธ์
Base64 ์ด๋ฏธ์ง๊ฐ ํด๊ฐ ๋๋ ๊ฒฝ์ฐ
- ๋์ฉ๋ ์ฌ์ง ๋๋ ๊ณ ํด์๋ ์ด๋ฏธ์ง (100KB ์ด์) โ Base64 ์ค๋ฒํค๋์ ๊ตฌ๋ฌธ ๋ถ์ ์ง์ฐ์ด ์ฑ๋ฅ์ ์ ํ์ํต๋๋ค
- ์์ฃผ ๋ณ๊ฒฝ๋๋ ์ด๋ฏธ์ง โ ๋์ฉ๋ HTML ํ์ด๋ก๋์ ๋ํ ๋ธ๋ผ์ฐ์ ์บ์ ๋ฌดํจํ๋ ๋ญ๋น์ ๋๋ค
- ์ฌ๋ฌ ํ์ด์ง์์ ๊ณต์ ๋๋ ์ด๋ฏธ์ง โ ์ธ๋ถ ํ์ผ์ ๊ณต์ ๋ธ๋ผ์ฐ์ ์บ์ฑ์ ์ด์ ์ ๋๋ฆฝ๋๋ค
- CDN ์ ๊ณต ์ด๋ฏธ์ง โ CDN์ด ์ธ๋ผ์ธ ๋ฐ์ดํฐ๋ณด๋ค ํ์ผ ์ ์ก์ ๋ ์ ์ต์ ํํฉ๋๋ค
10KB ๊ฒฝํ ๋ฒ์น
๋๋ฆฌ ์ธ์ฉ๋๋ ์ง์นจ: ์ด๋ฏธ์ง๊ฐ 10KB ๋ฏธ๋ง์ด๋ฉด Base64๋ก ์ธ๋ผ์ธํํ๋ ๊ฒ์ ๊ณ ๋ คํ์ธ์. ๋ ํฌ๋ฉด ๋ณ๋ ํ์ผ๋ก ์ ๊ณตํ์ธ์. ์ด๋ HTTP ์์ฒญ์ ์ค๋ฒํค๋์ HTML์ Base64 ์ธ์ฝ๋ฉ ๋ฐ์ดํฐ ์ค๋ฒํค๋ ๊ฐ์ ๊ท ํ์ ๋ง์ถฅ๋๋ค.
๊ทธ๋ฌ๋ ์ต์ ์ ์๊ณ๊ฐ์ ํน์ ์ํฉ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค:
- HTTP/2 ๋ฉํฐํ๋ ์ฑ์ ์ฌ๋ฌ ์์ฒญ์ ํจ๋ํฐ๋ฅผ ์ค์ฌ ์ธ๋ถ ํ์ผ์ ๋ ๋งค๋ ฅ์ ์ผ๋ก ๋ง๋ญ๋๋ค
- ๋๋ฆฐ ์ฐ๊ฒฐ์์๋ ๋ ํฐ ์ด๋ฏธ์ง๋ผ๋ ์์ฒญ์ ์ ๊ฑฐํ๋ ๊ฒ์ด ๊ฐ์น ์์ ์ ์์ต๋๋ค
- ์ค์ ๋ ๋๋ง ๊ฒฝ๋ก ๋ฆฌ์์ค์ ๊ฒฝ์ฐ, ์๋ณต์ ํ ๋ฒ ์ค์ผ ์ ์๋ค๋ฉด ๋ ํฐ ์ด๋ฏธ์ง๋ ์ธ๋ผ์ธํํ์ธ์
์์ถ ๊ณ ๋ ค ์ฌํญ
JPEG ๋๋ PNG ์ด๋ฏธ์ง๋ฅผ Base64๋ก ๋ณํํ๋ ๊ฒฝ์ฐ, ๋์ WebP ์ฌ์ฉ์ ๊ณ ๋ คํ์ธ์. WebP๋ ๋์ผํ ํ์ง ์์ค์์ ๋ ์ฐ์ํ ์์ถ์ ์ ๊ณตํ์ฌ ๋ ์์ Base64 ๋ฌธ์์ด์ ์์ฑํฉ๋๋ค. ๋ง์ ์จ๋ผ์ธ ๋๊ตฌ์์ Base64๋ก ๋ณํํ๊ธฐ ์ ์ ์ด๋ฏธ์ง๋ฅผ ๋ค์ ์ธ์ฝ๋ฉํ ์ ์์ต๋๋ค.
์ด๋ฏธ์ง๋ฅผ Base64๋ก ๋ณํํ๊ธฐ
์ฝ๋์ ์ด๋ฏธ์ง๋ฅผ ์ง์ ์๋ฒ ๋ฉํ ์ค๋น๊ฐ ๋์ จ๋์? ๋ฌด๋ฃ ์จ๋ผ์ธ Base64 ์ธ์ฝ๋ ๋ฐ ๋์ฝ๋๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฏธ์ง๋ฅผ ์ ๋ก๋ํ๊ณ HTML, CSS, JavaScript์ฉ ์์ ํ ๋ฐ์ดํฐ URL์ ์ป์ผ์ธ์ โ ์ค์น๊ฐ ํ์ํ์ง ์์ต๋๋ค.