Content Negotiation으로 JSON, XML, CSV 등 다양한 포맷 응답하기
하나의 URI에서 클라이언트 요구에 맞춰 JSON, XML, CSV 등 다양한 포맷으로 응답하는 콘텐츠 협상 기능 구현
콘텐츠 협상 개념
하나의 URI에서 동일한 리소스를 각기 다른 포맷으로 서비스하는 메커니즘
HTTP Accept 헤더를 통해 클라이언트가 원하는 포맷을 서버에 전달
서버는 Content-Type 헤더로 응답 포맷을 명시
DRF 렌더러 시스템
Renderers: 서버 데이터를 특정 포맷의 바이트 스트림으로 변환하여 응답 생성
포맷 접미사(.json, .xml) 우선 확인 후 Accept 헤더 분석
지원 불가능한 포맷 요청 시 HTTP 406 Not Acceptable 응답
필요 라이브러리 설치
pip install djangorestframework-xml
pip install djangorestframework-csv렌더러 설정
전역 설정 (settings.py)
INSTALLED_APPS = [
'rest_framework',
'rest_framework_xml',
]
REST_FRAMEWORK = {
'DEFAULT_RENDERER_CLASSES': [
'rest_framework.renderers.JSONRenderer',
'rest_framework_xml.renderers.XMLRenderer',
'rest_framework_csv.renderers.CSVRenderer',
],
}뷰별 설정
class BookViewSet(viewsets.ReadOnlyModelViewSet):
queryset = Book.objects.all()
serializer_class = BookSerializer
renderer_classes = [JSONRenderer, XMLRenderer, CSVRenderer]API 테스트 방법
Accept 헤더 사용
JSON:
Accept: application/jsonXML:
Accept: application/xmlCSV:
Accept: text/csv
포맷 접미사 사용
http://127.0.0.1:8000/api/books.jsonhttp://127.0.0.1:8000/api/books.xmlhttp://127.0.0.1:8000/api/books.csv
실무 고려사항
데이터 구조 적합성: CSV는 중첩된 데이터 표현에 제한적
성능: JSON > XML > CSV 순으로 렌더링 속도 빠름
운영 환경: BrowsableAPIRenderer는 개발 환경에서만 사용 권장
커스텀 렌더러: BaseRenderer 상속으로 YAML, MessagePack 등 추가 포맷 지원 가능
Last updated
