웹에서 특정 데이터를 전송하고 받기 위해서는 어떤 경로(End-Point)에 요청할 것인가는 중요한 문제이다. 우리는 데이터를 받고, 때로는 전송을 하기 위해서 다양한 방식을 쓰는데 이 때 효율적으로 경로(End-point)를 설정하는 방식에 대해 알아보고자 한다.
만약 소셜 서비스를 만들다고 생각할 경우 사용자를 위한 페이지를 만들기 위해선 식별된 파라미터 경로가 필요하다.
/users?id=23
위와 같이 id란 변수에 값을 담아서 id가 23번인 사용자를 가져올 수 있으며 key, value 쌍으로 이루어진다.
/users?id=6&id=7
&를 사용하여 여러개의 데이터를 주고받을 수도 있다. 서버에서는 id를 받고 그 유저에 대한 정보를 보내준다. 이것이 Query String이 동작하는 방식이다.
Class UserView(View):
def get(self, request):
user = request.Get.get('user_id')
서버에서는 위와 같이 HTTP request 안에 request.GET 또는 request.POST 객체로 쿼리 딕셔너리를 가져올 수 있다.
request.GET에서는 <QueryDict: {'user_id': 23}
형태로 저장된다.
정렬이나 필터링이 필요할 경우에는 Query String이 적합하다.
Query String은 해당하는 데이터가 없을 경우 빈 리스트를 환한다.
/users/123
Path Variable은 이름처럼 123을 변수로써 서버에 전달한다. 서버에서는 123 자체를 변수로 받아서 편하게 사용할 수 있다.
#views.py
Class UserView(View):
def get(self, request, user_id):
user = user.objects.filter(id=user_id).values()
#urls.py
urlpatterns=[
path('user/<int:user_id>', UserView.as_view())
]
Django에서 Path variable는 뷰클래스 함수에서 self, request 외에 별도의 인자를 가지게 되고, 그 인자값이 엔드포인트가 된다. 따라서 urls파일에 반드시 위와 같이 입력해줘야한다.
어떤 특별한 resource를 식별하고 싶을 경우에는 Path Variable이 적합하다. 특정한 데이터의 위치를 특정해서 보여준다고 생각하면 쉽게 사용할 수 있다.
Path Variable은 해당하는 데이터가 없을 경우 404 에러를 발생하여 에러처리가 필요하다.
Api를 설계하는 데에는 정답이 없지만 위와 같이 best practice를 지키는 것은 다른 개발자와의 협업, 유지 보수 측면에서 더 효과적이다.