본문 바로가기

TIL

[TIL 2024. 04. 12] GET과 POST | 장고 모델 폼 사용하기

GET과 POST

http 통신에서는 method로 GET요청과 POST요청만이 허용된다. (DELETE 등은 허용 안됨)

지금까지 GET은 내용을 조회하는데 사용되고, POST는 input으로 받은 내용을 서버 등으로 보내는데 사용된다고 단순화 해서만 알고 있었다. django 프로젝트 중에 GET과 POST의 차이가 중요해서 이 두 가지를 정리해보려고 한다

 

GET요청

  • html에서의 a태그, 브라우저창에서 url로 직접 검색하는 경우
  • QueryString방식을 사용
    • QueryStirng방식에서 전달하는 데이터는 url에 포함된다. 따라서 header와 body중에 url이 포함되는 header에 전송대상인 데이터가 담기게 된다
    • 따라서, 전송대상 데이터가 body에 포함되는 POST방식에 비해서는 상대적으로 보안에 취약함
    • url에 포함될 수 있는 길이 제한이 있음 -> POST방식에 비해 전송할 수 있는 양이 제한적.
  • DB에 영향이 없는 요청
  • 개발에서는 CRUD 중에서 특히 Read에서만 GET방식을 사용하기로 약속함

 

POST요청

  • html에서의 form태그
    • form태그에서는 기본적으로 action, method, name 등이 가장 중요함
    • form태그의 method를 POST요청으로 했다면, 서버에서 받을 때도 POST로 받아야 함
    • 주로 클라이언트가 서버에 요청을 보낼 때 사용함. 그리고 서버는 이렇게 받은 데이터를 DB에 저장하거나 다시 지지고 볶아서 클라이언트에게 return할 response를 생성함
    • -> 이 점에서 착안해서 django에서는 model에 대한 정보를 가진 form을 활용할 생각을 함
  • DB를 변경하라는 요청
    • POST방식을 통한 Read도 동작하기는 하지만, 그다지 좋은 코드라고는 할 수 없다
    • POST방식은 CRUD 중에서 C,U,D에 적합함
  • django에서 form에서 method로 POST을 사용하는 경우에는 반드시 csrf token을 적용해줘야 함

 


 

 

django model form

CRUD 기능 중 C와 U는 기본적으로 views.py에 두 개의 view함수를 필요로 한다 (url, view, template)

(R과 D는 각각 하나의 로직으로 처리 가능)

 

C는 '새글 작성' 버튼을 누르면 작성form이 있는 template를 렌더할 로직 하나와 이 form에서 받은 데이터를 처리할 로직 하나를 필요로 한다.

 

U도 마찬가지로 '수정'버튼 클릭 시 수정내용을 받는 form이 있는 template을 렌더링하는 로직과 수정내용을 다시 db에 저장하고 처리할 로직이 필요하다

 

처음에는 두 view함수를 짜더라도 나중에는 하나의 view함수에서 분기를 나누는 방식으로 처리할 수 있다.

왜냐하면 template렌더링은 db의 변경을 요청하는 것이 아니므로 'GET'요청(a태그)이고, form으로 받은 내용의 처리는 db의 변경을 요청하는 것이므로 POST요청이기 때문이다.

 

이 때, django가 제공하는 model form을 사용하면 좀 더 깔끔하고 정리된 코드 작성이 가능하다

 

Create기능을 하나의 view함수 내에서 분기 처리하는 코드로 작성하는 방식을 참고해서 Update를 실습해보는데, 막혔던 부분들을 아래에 표시해뒀다.

(django에서 Update기능 구현시에는 instance를 사용하면 된다!)

 

Update기능을 GET요청이든 POST요청이든 기본적으로 한번은 db에서 orm으로 해당 데이터를 받아와야 한다.

왜냐하면 GET요청이라면 렌더링하는 수정form에 기존 생성시의 정보를 넣어줘야 하기 때문이고, POST요청이라면 db에서 조회해온 해당 내용을 담은 instance 객체를 통해 수정 사항을 다시 db에 저장해야 하기 때문이다.

 

아래처럼 instance를 사용하는 경우 save()는 해당 객체의 내용을 update하라는 의미이다

 

UPDATE를 하나의 View함수로 수정