TIL 37 | request.GET & POST, GET Method

임종성·2021년 8월 4일
2

Project

목록 보기
5/7
post-thumbnail

Request.get과 Request.GET, 그리고 RESTful API를 잠깐 알아보며 보게 된 GET과 POST Method의 차이를 간단하게 정리해보았다.

First Thought

Django를 시작하고 C.R.U.D와 Westagram Proejct, 그리고 현재 1차 프로젝트를 진행하면서 나는 Request Method 관련해서 몇가지 아는 점이 없었다. 주로 HTTP를 이용한 통신을 할 때 POST Method를 이용해 Request를 받을 경우, data = json.loads(request.body)와 같이 데이터를 받을 때 request.body를 이용한다는 정도였다.

그런데 1차 프로젝트를 진행하며 기능 구현을 위해 검색을 하다보니, request.GETrequest.get, request.GET.getlist 등 다양한 method를 사용하는 것을 볼 수 있었다.

그래서 왜 이런 method들을 사용할까? 나도 사용해야 하나? 라는 생각이 들어 찾아보고 어느정도 정리해봤다.

rquest.get 과 request.GET

request.get

request는 클라이언트의 요청을 dictionary 형태의 객체에 데이터를 담아 보낸 것이다. get()method는 key 값이 dictionary 안에 있으면 value를 리턴하고, 없다면 **default로None`을 리턴하거나 주어진 value를 리턴**한다.

request = {'key':10, 'animal':'cat'} 
request.get('key', 5)
> 'output : 10'
request.get('value', 10)
> 'output : 10'

get() method는 dictionary object에만 사용할 수 있는데 모든 request가 dictionary는 아니다.

request.GET

get() method가 python의 문법이라면, reqest.GET은 django의 문법이라고 할 수 있다. request는 HTTP Request가 보내졌을 때 django에서 만든 객체이고, request.GET을 실행함에 따라 Dictionary 형태의 Data를 얻을 수 있다.

따라서 request.GET.get() method를 이용해 주어진 request에서 원하는 data를 사용할 수 있게 된다!


그런데 곰곰히 생각해보니 request.GET이 정확히 어떤 데이터를 담아 우리에게 전달하는 지 이해하지 못했다. request.body는 HTTP request의 body에 담긴 데이터들을 의미하는데, request.GET은 어떻게 우리에게 전달되는걸까?

고민하다 마침 내일이 RESTful API Session이 있기도 하고, url mapping 관련하여 내일 세션을 듣고 수정하라는 리뷰가 있었기에 RESTful API에 대해 찾아봤고, Get Method와 Post Method의 차이를 알려주는 글을 보게 되었다.

Get Method & Post Method for API

두 방식 모두 Server에 Request를 보내는 Method이다. 하나의 큰 차이는 Post Method에는 Body가 있어 Data를 얹어 보낼 수 있다는 것이고, Get Method는 Body가 없다는 것이다. 그렇다면 GET Method는 Data없이 요청을 처리할까?

POST Method

POST Method는 Request의 Body에 데이터를 붙여 보내기 때문에, Header에 Body 타입을 설명하는 Content-Type이라는 필드가 들어가 Data가 어떤 타입인지 명시하게 된다.

Json으로 요청이 올 경우 request.body를 통해 dictionary나 list등 형태를 사용할 수 있다.

GET Method

GET Method는 POST Method와 달리 클라이언트의 데이터를 url에 붙여 보낸다. 지금까지의 Django를 배우며 CRUD, Westagram Proejct에서 GET Method에 데이터가 필요한 경우 url parameter, 즉 path parameter를 사용했다.

# users/urls.py

urlpatterns = [
    path('/<int:user_id>', UserView.as_view())
]

위와 같은 방식으로 View Class에서 self, request외에 user_id와 같이 다른 argument를 가지게 되어 endpoint를 지정해 데이터를 받게 된다.

지금까지는 이런 방식이 전부인줄 알았는데.. 다른 방법이 있다는걸 알게 되었다.

Request를 url뿐 아니라 Query String 형식으로 보내어 GET Method에서 요청에 데이터를 parameter로 넘길 수 있다.

쿼리 스트링을 이용한 RESTful한 API에 대해서는 내일 세션을 듣고 따로 정리하도록 하겠다.

중요한 것은 아까의 request.GETGET Method를 통해 받는 파라미터들을 다 포함하는 dictionary object라는 것이다!

GET Method를 사용할 때는 request.GET을 사용해 필요한 데이터를 가져오고, POST Method를 사용할 경우 request.body를 통해 데이터를 가져와 가공한다.

Today I Learned

어떤 method나 function이 있을 때 이것을 왜 사용하고, 어떤 경우 사용하는지 모를때가 많은데 어느정도 의문을 해소한 것 같다. 이번에 GET과 POST Method로 요청이 뜰어올 경우 어떤 방식으로 Data를 받아들이는 지 알아보았다.

의문을 풀며 느낀 것은 아무래도 프론트엔드와 소통하는 것이 중요하다 라는 점이었다. 벌써 3일차가 지나가는데, 다양한 기능을 구현하는 데도 특정 기능을 구현함에 있어 어떤 식으로 데이터를 제공받고 어떤 형태로 데이터를 response해야 하는지에 대한 소통이 부족하다는 것을 깨달았다. 아무래도 우리가 View Logic과 Database Modeling에 급급해서 소홀했던 것 같다.

물론 이번 프로젝트에서 성공적이고 우월한 기능을 구현하면 좋겠지만, 아무래도 개발자로서 협업과 커뮤니케이션 능력이 중요하다고 생각하기에 좀 더 신경써야겠다고 느꼈다.


8/4 Project Review

  • 메뉴 페이지 Concept Table의 설명란(Content) 추가
  • 상품과 장바구니의 Checkbox 고려 X
  • Item Table에 order_quantity 추가하여 item별 판매량 정렬 간소화
  • Order Table에 total_price 추가
  • Image Table에 main field 추가(메인 사진 )

참고자료

GET & POST Method
request.get & requst.GET

profile
어디를 가든 마음을 다해 가자

0개의 댓글