Django의 뷰 함수 속 작은 호기심, 그리고 숨겨진 원리

개발자는 종종 습관적으로 코드를 작성합니다. 저 역시 Django에서 뷰 함수를 작성할 때, 아무런 의심 없이 request.GET.get('variable')이나 request.POST.get('variable')를 사용하곤 했죠. 그런데 어느 날 문득, 이런 질문이 떠올랐습니다.

"도대체 이건 어떻게 작동하는 걸까?"


Django의 요청 처리: request.GETrequest.POST의 비밀

이 질문에 답을 찾기 위해 Django의 작동 원리를 살펴보았습니다. 결론부터 말하자면, request.GETrequest.POST는 클라이언트가 보낸 요청 데이터를 다루기 쉽게 만든 HTTP 요청 객체의 속성입니다.

Django는 클라이언트가 서버로 보낸 데이터를 파싱(Parsing)하여 딕셔너리처럼 다룰 수 있는 형태로 변환합니다. 그래서 우리는 간단히 request.GET.get('variable')이나 request.POST.get('variable')로 원하는 데이터를 가져올 수 있죠.

하지만 여기서 중요한 사실은, 이 객체가 진짜 딕셔너리(Dictionary)가 아니라는 점입니다. 그렇다면 딕셔너리처럼이라는 표현은 무슨 의미일까요?


QueryDict: 딕셔너리처럼, 하지만 딕셔너리 이상의 객체

Django에서 request.GETrequest.POST는 실제로 QueryDict라는 클래스의 인스턴스입니다. 이 클래스는 일반적인 딕셔너리와 유사한 동작을 제공하지만, 몇 가지 중요한 차이점이 있습니다:

1. 동일한 키에 여러 값 저장 가능

일반 딕셔너리는 하나의 키에 하나의 값만 저장할 수 있지만, QueryDict는 동일한 키에 여러 값을 저장할 수 있습니다.

예를 들어, ?key=value1&key=value2와 같은 쿼리 문자열이 있을 때:

request.GET.get('key')       # 'value1' (첫 번째 값)
request.GET.getlist('key')   # ['value1', 'value2'] (모든 값)

2. 불변성(Immutable)

기본적으로 QueryDict는 불변입니다. 값을 수정하거나 추가하려면 먼저 복사본을 만들어야 합니다:

mutable_querydict = request.GET.copy()
mutable_querydict['new_key'] = 'new_value'

3. 딕셔너리 이상의 기능

getlist() 같은 메서드는 일반 딕셔너리에는 없지만, QueryDict에서 제공하는 강력한 기능 중 하나입니다.

Django QueryDict concept image

왜 이렇게 설계되었을까?

이렇게 설계된 이유는 간단합니다. 웹 애플리케이션에서는 종종 동일한 이름의 여러 데이터를 다룰 필요가 있고, 불변성을 유지하면 데이터 무결성을 보장할 수 있습니다. QueryDict는 이러한 요구사항을 충족하면서도 개발자가 익숙한 딕셔너리 스타일의 API를 제공합니다. 사용자는 복잡한 HTTP 요청 데이터를 단순히 딕셔너리를 다루는 것처럼 쉽게 처리할 수 있죠.


Django의 원리를 파헤치는 즐거움

작은 호기심에서 시작된 질문이었지만, 답을 찾는 과정에서 Django의 세심하고 효율적인 설계에 감탄하게 되었습니다.

QueryDict의 존재와 그 특별한 기능을 알게 된 것은 Django가 얼마나 개발자 친화적인 프레임워크인지 다시 한번 깨닫는 계기가 되었습니다.

여러분도 Django를 사용할 때 문득 떠오르는 작은 호기심을 탐구해 보세요. 그 안에는 분명 새로운 재미와 감동이 기다리고 있을 겁니다. 😊

Django의 작동 원리를 탐구하며 즐거운 코딩 되세요! 🎉