프론트엔드와 백엔드의 통신에서 가장 중요한 부분 중 하나는 Content-Type입니다. 이 글에서는 **application/json**과 **multipart/form-data**의 차이, 실제 구현 방식, 그리고 프로젝트에서 Content-Type을 동적으로 처리하는 방법을 친절하게 설명합니다. 프론트엔드와 백엔드 통신에 처음 입문하신 분들도 이해할 수 있도록 쉽게 풀어보겠습니다.

1. Content-Type이란?
Content-Type은 서버와 클라이언트가 통신할 때 데이터의 형식을 정의하는 HTTP 헤더입니다. 이를 통해 서버는 클라이언트가 보내는 데이터가 어떤 형식인지 알고 올바르게 처리할 수 있습니다.
Content-Type의 역할
- 클라이언트에서 서버로 데이터 전송: 클라이언트는 서버에 데이터를 전송할 때, 데이터의 형식을 명시해야 합니다.
- 서버에서 클라이언트로 응답: 서버는 클라이언트가 데이터를 올바르게 이해하도록 데이터의 형식을 알려줍니다.
가장 많이 사용하는 Content-Type
- application/json: JSON 형식의 데이터를 전송할 때 사용.
- multipart/form-data: 파일 업로드와 같이 텍스트 데이터와 파일 데이터를 함께 전송할 때 사용.
2. Content-Type의 종류와 차이점
2.1 application/json
- 사용 목적: 구조화된 데이터를 전송할 때 사용합니다.
- 형식: JSON 문자열.
- 특징:
- 서버와 클라이언트가 데이터를 이해하기 쉽습니다.
- 구조화된 텍스트 데이터만 전송 가능합니다.
- 파일 업로드는 지원하지 않습니다.
예제: JSON 데이터 전송
{
"name": "John",
"age": 30,
"isMember": true
}
실제 사용 코드 (React + Axios)
import axios from 'axios';
const sendJsonData = async () => {
const data = { name: 'John', age: 30 };
const response = await axios.post('/api/example', data, {
headers: {
'Content-Type': 'application/json',
},
});
console.log('응답:', response.data);
};
2.2 multipart/form-data
- 사용 목적: 파일 업로드 또는 파일과 텍스트 데이터를 함께 전송할 때 사용합니다.
- 형식: 데이터를 여러 부분(Part)으로 나눠 전송하며, 각각은 이름과 값으로 구성됩니다.
- 특징:
- 파일 데이터를 바이너리 형식으로 전송할 수 있습니다.
- 텍스트 데이터와 파일 데이터를 함께 전송할 수 있습니다.
- 서버에서 데이터를 파싱하려면 추가적인 처리(예: 미들웨어)가 필요합니다.
실제 사용 코드 (React + Axios)
import axios from 'axios';
const uploadFile = async (file) => {
const formData = new FormData();
formData.append('file', file);
formData.append('description', 'Example file upload');
const response = await axios.post('/api/upload', formData, {
headers: {
'Content-Type': 'multipart/form-data',
},
});
console.log('업로드 결과:', response.data);
};
3. Content-Type을 동적으로 처리하기
제가 진행중인 가계부 (wallet-Gurdianss) 프로젝트에서는 다양한 요청 유형이 존재합니다
- JSON 데이터 요청: 일반적인 API 요청. (Login, Signup)
- 파일 업로드 요청: 사용자 이미지, 영수증 등.
이 모든 것을 처리하려면 요청을 동적으로 처리하는 방법이 필요합니다. 아래는 이를 구현하는 일반적인 방식입니다.
Axios 인터셉터로 동적 Content-Type 처리
Axios의 인터셉터를 활용하여 FormData와 JSON 요청을 동적으로 처리할 수 있습니다.
import axios from 'axios';
const apiClient = axios.create({
baseURL: '/api',
headers: {
'Content-Type': 'application/json', // 기본값은 JSON
},
});
// 요청 인터셉터
apiClient.interceptors.request.use((config) => {
// FormData 객체 감지
if (config.data instanceof FormData) {
config.headers['Content-Type'] = 'multipart/form-data';
}
// 토큰 추가 (예: 인증)
const token = localStorage.getItem('token');
if (token) {
config.headers['Authorization'] = `Bearer ${token}`;
}
return config;
});
export default apiClient;
4. 서버와의 통신에서 주의할 점
- Content-Type과 데이터 형식의 일치:
- 서버에서 Content-Type에 따라 데이터를 파싱하므로, 올바른 형식을 사용하는 것이 중요합니다.
- 보안:
- 파일 업로드 요청에서는 악성 파일 업로드를 방지하기 위한 백엔드 검증이 필요합니다.
- 멀티파트와 JSON 혼용:
- 파일과 메타데이터를 함께 전송하려면, JSON 데이터를 FormData에 문자열로 추가하면 됩니다.
예제: 멀티파트와 JSON 혼용
const formData = new FormData();
formData.append('file', file);
formData.append('metadata', JSON.stringify({ description: 'Example' }));
await apiClient.post('/api/upload', formData);
5. 결론
- **application/json**은 현대 웹에서 기본 데이터 전송 방식으로 사용됩니다.
- **multipart/form-data**는 파일 업로드에 특화된 방식으로, 필요에 따라 동적으로 처리해야 합니다.
- Axios의 인터셉터를 활용하면 JSON과 멀티파트 요청을 효율적으로 관리할 수 있습니다.
함께 보면 좋은 자료
'FrontEnd Develop' 카테고리의 다른 글
📊 Timer 활용한 그래프 상승 애니메이션 아이디어 개발 (0) | 2025.01.31 |
---|---|
Emotion을 활용한 스타일 재활용에 대한 생각 (0) | 2025.01.27 |
⏿ 실제 백엔드와 프론트엔드 통신 #4. Axios Instance에서 셋의 비동기적 공존 (0) | 2025.01.24 |
⏿ 실제 백엔드와 프론트엔드 통신 #3. Axios Instance와 Refresh, Access 토큰 함수 (0) | 2025.01.24 |
⏿ 실제 백엔드와 프론트엔드 통신 #2. Axios Instance와 요청, 응답 Intercepter (0) | 2025.01.24 |