Input 이미지 처리 방식
Base64 방식과 FormData 방식의 장단점을 정리합니다.
1. Base64 방식
장점:
- 즉각적인 미리보기 가능 (별도의 URL 생성 불필요)
- 단일 HTTP 요청으로 처리 가능
- JSON 페이로드에 직접 포함 가능
- 바이너리 데이터를 텍스트로 안전하게 전송
- 클라이언트에서 이미지 처리/조작이 용이
- AJAX 요청과 함께 보내기 쉬움
단점:
- 파일 크기가 약 33% 증가 (인코딩 오버헤드)
- 브라우저 메모리 사용량 증가
- 대용량 파일 처리에 부적합
- 인코딩/디코딩 과정에서 CPU 리소스 사용
- 서버 부하 증가 가능성
적합한 사용 사례:
typescript
// Base64 적합 사례
const handleSmallImage = async (file: File) => {
// 1MB 이하의 작은 이미지
if (file.size <= 1 * 1024 * 1024) {
const reader = new FileReader();
reader.readAsDataURL(file);
reader.onload = () => {
// 즉시 미리보기 가능
setPreviewImage(reader.result as string);
// 바로 JSON으로 전송 가능
uploadImage({ image: reader.result });
};
}
};
2. FormData 방식
장점:
- 원본 파일 유지 (데이터 손실 없음)
- 메모리 효율적
- 대용량 파일 전송에 적합
- 멀티파트 요청으로 파일 전송 최적화
- 프로그레스 모니터링 용이
- 여러 파일 동시 전송 가능
단점:
- 추가적인 HTTP 요청 필요할 수 있음
- 미리보기를 위한 별도 처리 필요
- 브라우저 호환성 고려 필요
- 전송 과정이 상대적으로 복잡
적합한 사용 사례:
typescript
// FormData 적합 사례
const handleLargeFile = async (file: File) => {
const formData = new FormData();
formData.append('file', file);
try {
const response = await axios.post('/upload', formData, {
headers: {
'Content-Type': 'multipart/form-data'
},
onUploadProgress: (progressEvent) => {
const progress = (progressEvent.loaded / (progressEvent.total || 0)) * 100;
setUploadProgress(progress);
}
});
// 업로드 후 URL을 받아서 처리
setImageUrl(response.data.url);
} catch (error) {
console.error('Upload failed:', error);
}
};
선택 가이드
Base64 선택:
- 파일 크기가 작은 경우 (1MB 이하)
- 즉각적인 미리보기가 필요한 경우
- 이미지 처리가 클라이언트에서 필요한 경우
- 단순한 구현이 필요한 경우
- 썸네일이나 프로필 이미지와 같은 작은 이미지
typescript
// Base64 사용 예시
if (file.size <= 1 * 1024 * 1024) {
const base64 = await convertToBase64(file);
// 즉시 미리보기 가능
setPreview(base64);
// 바로 API 전송
await uploadImage({ image: base64 });
}
FormData 선택:
- 대용량 파일 전송 (1MB 초과)
- 원본 품질 유지가 중요한 경우
- 다중 파일 업로드가 필요한 경우
- 업로드 진행률 표시가 필요한 경우
- 서버 리소스 최적화가 중요한 경우
typescript
// FormData 사용 예시
const formData = new FormData();
formData.append('file', file);
formData.append('type', 'original');
// 프로그레스 모니터링 가능
await axios.post('/upload', formData, {
onUploadProgress: (e) => {
const progress = (e.loaded / (e.total || 0)) * 100;
setProgress(progress);
}
});
Subscribe to Liboo.blog
Get the latest posts delivered right to your inbox