[Django] 장고에서 제공하는 HTTP Response 의 종류와 활용용도

msung99·2023년 2월 26일
0
post-thumbnail

학습배경

지금까지 장고를 학습해오면서 항상 단순히 HttpResponse 응답 객체만으로 응답을 전송했었습니다. 그러던 중 우연히 인터넷을 찾아보다가 다른 응답 객체들도 있다는것을 알게 되었는데, 이번 기회에 각각이 무엇을 의미하고 어떤 용도로 활용하는 것인지 확실히 정리해보고자 합니다.


HttpResponse

HttpResponse(data, content_type)
HttpResponse("Hi")

전달된 컨텐츠를 포함한 HttpResponse객체를 만들어 내는 response를 반환하는 가장 기본 적인 함수입니다. 하나의 함수는 최소 하나의 HttpResponse을 반환해야하며, views 에서 검사하는게 아니라 middleware 에서 검사를 하게 됩니다.


JsonResponse

JsonResponse(data, encoder=DjangoJSONEncoder,
             safe=True, json_dumps_params=None, 
             **kwargs)
             
# Serializing non-dictionary objects
response = JsonResponse([1, 2, 3], safe=False)

JsonResponse는 response를 커스터마이징 하여 전달하고 싶을때, http status code에 더하여 메세지를 입력해서 전달할 수 있습니다.

이 메세지는 프론트엔드 개발자와 협의하여 약속된 메시지를 던집니다. 만약 딱히 전달할 메시지가 없고, status code만 전달한다면 HttpResponse를 사용하면 됩니다. 메세지를 입력할 때는 보안 이슈가 있기 때문에 너무 자세히 적지 않는 것이 좋다고 합니다.


Render

render(request(필수), template_name(필수), 
      context=None, content_type=None, 
      status=None, using=None)

Render 는 httpRespose 객체를 반환하는 함수로 template을 context와 엮어 httpResponse로 쉽게 반환해 주는 함수입니다.template_name 에는 불러오고 싶은 템플릿명을 적으면됩니다.

context 는 View에서 사용하던 변수(dictionary 자료형)를 html 템플릿에서 전달하는 역할을 하고, key 값이 템플릿에서 사용할 변수이름, value값이 파이썬 변수가 됩니다.


StreamingHttpResponse

대부분의 장고는 응답 객체로 HttpResponse 를 사용합니다. HttpResponse는 response body가 메모리에 저장 되어 하나의 응답 객체로 클라이언트에 전송된다는 것을 의미합니다.

반면 StreamingHttpResponse 는 response body를 여러 조각, 또는 덩어리로 클라이언트에 보내는 응답이다.

When?

그렇다면 이는 언제 사용할까요? StreamingHttpResponse의 가장 좋은 사용 사례중 하나는 CSV 파일과 같은 대용량 파일을 보내는 것이다.

일반적으로 HttpRespose를 사용하면 전체 파일을 메모리에 로드한 다음 클라이언트로 보냅니다. 따라서 대용량의 파일인 경우, 서버의 메모리와 클라이언트로 전송되는 시간이 많이 걸릴것이다.

반면 StreamingHttpResponse를 사용하면 파일 일부를 메모리에 로드하거나 파일의 일부를 생성하여 즉시 클라이언트에게로 보낼 수 있게됩니다. 즉, 클라이언트의 입장에서 볼때 파일의 전부를 볼 수 있는것은 아니지만, 파일의 일부를 보면서 클라이언트에게 해당 데이터를 볼 수 있는 시간 자체를 앞당길 수 있다라는 말입니다.


정리

위 응답들을 정리해보자면 다음과 같습니다.

profile
https://haon.blog

0개의 댓글