현제의 현재이야기

[OSOD] DRF URL 파라미터 추출과 쿼리 파라미터 추출에 대한 고찰 본문

DRF/OSOD

[OSOD] DRF URL 파라미터 추출과 쿼리 파라미터 추출에 대한 고찰

현재의 현제 2023. 2. 19. 13:26

이 둘의 차이점을 알아보자.

self.kwargs.get("")
request.query_params.get("")

self.kwargs는 Django URLconf에서 설정한 URL 패턴에서 추출한 파라미터를 담고 있는 딕셔너리다. URL 패턴에서 pk, slug, username 등과 같은 변수를 선언하면, 해당 변수의 값을 URL에서 추출하여 self.kwargs 딕셔너리에 저장할 수 있다.

request.query_params는 HTTP GET 요청에 전달된 쿼리 파라미터를 포함한 딕셔너리다. 쿼리 파라미터는 URL의 끝에 ? 다음에 key=value 형태로 전달된다.

따라서, self.kwargs.get()는 URL 패턴에서 추출한 파라미터 값을 가져오는 것이며, request.query_params.get()는 HTTP GET 요청에 전달된 쿼리 파라미터 값을 가져오는 것이다.

예를 들어, 다음과 같은 URL 패턴이 있다고 가정해보자.

path('post/<int:pk>/', views.PostDetailView.as_view(), name='post_detail')

이 경우, pk는 URL에서 추출한 파라미터이므로, self.kwargs.get("pk")를 통해 값을 가져올 수 있다.

반면에, 다음과 같은 GET 요청이 있다고 가정해보자.

http://example.com/api/posts/?category=django&sort=created_at

이 경우, category와 sort는 쿼리 파라미터이므로, request.query_params.get("category")와 request.query_params.get("sort")를 통해 값을 가져올 수 있다.

여기서 'category와 sort는 URL 패턴에서 정의하는 것이 아니라, HTTP 요청의 쿼리 파라미터로 전달된다. 따라서, URL 패턴에서는 category와 sort와 같은 파라미터를 선언하지 않는다.

쿼리 파라미터는 ? 이후에 key=value 형태로 전달되며, 여러 개의 쿼리 파라미터를 전달할 경우에는 & 기호를 사용하여 구분한다. 예를 들어, category와 sort를 전달하는 GET 요청은 다음과 같이 작성할 수 있다.

http://example.com/api/posts/?category=django&sort=created_at

이때, category와 sort는 각각 request.query_params.get("category")와 request.query_params.get("sort")를 사용하여 값을 가져올 수 있다.

 

그러니깐 결론은 self.kwargs.get()은 클래스 인스턴스인 self에서 URLconf에서 설정한 URL 패턴에서 추출한 파라미터를 담고 있는 딕셔너리에서 키로 값을 가져오는 것이고, request.query_params.get는 요청 URL의 쿼리 파라미터(query parameter)에서 지정된 이름의 값을 가져오는 것이다. 여기서 request 앞에 self가 붙어도 무방하다. 왜냐? 해당 인스턴스에 대한 request니깐.

 

또 궁금점.  request.META.get('HTTP_~~')와 request.query_params.get()의 차이점은 무엇인가?

 

전자는 헤더에서 키 값을 받아오는 것이고 후자는 URL에 ? 기호 이후에 전달되는 이름-값 쌍으로, HTTP GET 요청에서 받아 사용 되는 것이다.

 

그렇다면 query_params을 어떻게 정하는 걸까?

 

쿼리 파라미터(query parameter)를 지정하는 것은 프론트엔드에서 요청할 때 URL 끝에 ?와 함께 파라미터 이름과 값을 추가하면 된다. 이때 파라미터가 여러 개인 경우에는 &로 구분하여 추가한다.

예를 들어, https://example.com/api/text-to-speech?text=hello&language_code=en-US와 같이 요청할 수 있다. 이 경우, text와 language_code는 쿼리 파라미터의 이름이고, hello와 en-US는 해당 파라미터의 값이다.

프론트엔드에서는 fetch()를 사용하여 요청할 수 있다. 아래는 fetch()를 사용하여 위의 URL로 GET 요청을 보내는 예시 코드이다.

fetch('https://example.com/api/text-to-speech?text=hello&language_code=en-US')
  .then(response => {
    if (!response.ok) {
      throw new Error('Network response was not ok');
    }
    return response.blob();
  })
  .then(blob => {
    // 받은 blob 데이터를 처리하는 코드
  })
  .catch(error => {
    console.error('There was a problem with the fetch operation:', error);
  });

위 코드에서 fetch() 함수의 첫 번째 인자로 요청할 URL을 지정하고, 두 번째 인자로 요청 옵션을 객체 형태로 전달할 수 있다. GET 요청에서는 두 번째 인자를 생략해도 된다. fetch() 함수가 반환하는 Promise 객체의 then() 메서드로 응답(response) 객체를 처리할 수 있다. 여기서 response.blob() 메서드는 Blob 형태의 데이터를 반환한다.

 

마지막으로, HTTP GET 요청에 전달된 쿼리 파라미터를 쓰는 방식이 좋을까 아니면 URL 패턴에서 파라미터를 추출하는 방식이 좋을까?

 

HTTP GET 요청에 전달된 쿼리 파라미터와 URL 패턴에서 파라미터를 추출하는 방식은 각각의 상황에 따라 적절한 방식을 선택해야 한다.

HTTP GET 요청에 전달된 쿼리 파라미터를 사용하는 방식은 URL에 파라미터를 포함시키지 않기 때문에, URL이 간결하다. 또한, 쿼리 파라미터를 사용하면 필요한 파라미터만 선택적으로 전달할 수 있어서, 불필요한 정보를 전달하지 않아도 되는 장점이 있다. 그러나, 쿼리 파라미터를 사용하면 URL을 이용한 캐싱이 제한될 수 있고, URL이 너무 길어지면 가독성이 떨어질 수 있다.

URL 패턴에서 파라미터를 추출하는 방식은 URL 자체에 파라미터가 포함되어 있기 때문에, URL 자체가 정보를 담고 있어서 가독성이 높아진다. 또한, URL 패턴을 이용한 캐싱이 가능하고, URL을 복사해서 다른 사람에게 공유하는 것이 가능하다. 그러나, URL이 복잡해지면 URL 패턴을 구성하는 것이 어려워질 수 있다.

따라서, 상황에 따라 HTTP GET 요청에 전달된 쿼리 파라미터와 URL 패턴에서 파라미터를 추출하는 방식을 선택하는 것이 좋다. 일반적으로 URL이 간결한 경우에는 쿼리 파라미터를 사용하는 것이 좋고, URL 자체가 정보를 담아야 할 필요가 있는 경우에는 URL 패턴을 이용하는 것이 좋다. 상황따라, 편의따라 사용하자.

'DRF > OSOD' 카테고리의 다른 글

[OSOD] Django Rest Framework + React Google social login  (1) 2023.03.05
[OSOD] Non-serializer  (0) 2023.02.20
[OSOD] Timezone과 연속 학습  (0) 2023.02.19
[OSOD] 구독 이메일 관련  (0) 2023.02.19
[OSOD] 비밀번호 변경 및 리셋 관련  (0) 2023.02.16
Comments