HTTP 웹 기본 지식 step-4 HTTP 메소드

배인성·2022년 5월 10일
0

HTTP

목록 보기
4/7

HTTP 메소드

웹의 요청과 응답에 대한 흐름을 파악했다면, 개발에 있어서 가장 중요한 상식중 첫 번째라고 개인적으로 생각한다.

근데 웹 개발을 한 번이라도 해봤다면? GET, POST에 대한 것은 들어보지 못했을리가 없다고 생각한다.

그리고 상식이라고 표현한만큼 개념적으로 크게 어려운건 없다 ㅋㅋㅋ

Django로 홈페이지를 제작할 당시, 개발 방식이 views.py에서 함수마다

if(request.method == 'GET')
	return [template name]
else //POST 요청시
	//business logic~~
    return [template name] + model

이런식으로 GET과 POST일때를 나눠서 코딩해줬었던 기억이 난다.

Spring에서는 컨트롤러에서 @GetMapping @PostMapping 으로 url을 분리해줬던 것으로 기억한다.

어쨌든 오늘은 HTTP의 주요 메소드 GET,POST와 DELETE, PATCH, PUT에 대해서 글을 써보도록 하겠다!

GET

GET은 "얻다"라는 단어 뜻으로, 클라이언트에서 GET 요청이 오면 어떤 리소스를 달라는 뜻이다.

그 리소스는 주로 HTML일 것으로 생각한다.

그래서 GET 요청은 그냥 홈페이지 렌더링을 서버에 부탁하는 것이다.

추가적으로 GET 요청도 메세지 바디에 데이터를 담아서 전달할 수 있다고 하는데 지원하는 곳이 많지가 않다고 한다.

POST

POST는 "우편물을 발송하다"라는 뜻이다.

그렇다면 POST 요청에는 어떤 우편물이 필요하다는 것인데, 그것이 아마 메세지 바디에 담겨져있는 데이터라고 생각한다.

클라이언트에서 HTTP 요청으로 메세지 바디에 데이터(우편물)을 담아서 서버에 보내면, 서버는 받은 데이터를 가지고 데이터베이스에 접근할 것이다.

그래서 수정하고, 등록하고, 삭제하고 등등의 처리를 할 것이다.

물론 삭제나 수정만을 위한 HTTP 메소드가 따로 있다!

그러나 대부분(약 99%)는 POST로도 처리할 수 있다고 한다.

POST 정리

  1. 새 리소스 생성(등록)
  2. 요청 데이터 처리
  3. 다른 메서드로 처리하기 애매할때
    3-1. 애매하면 POST 쓰래 ㅋㅋㅋ

그냥 페이지 렌더링할때 말고는 POST 쓰면 되는 것 같다 ㅋㅋ

PUT

PUT은 "두다"라는 뜻으로, 이미 존재하는 리소스를 클라이언트가 콕 집어서 바꿔버린다.

PUT에 대해서 들을수록 HashMap의 put 메소드와 똑같이 느껴진다.

HashMap의 put은 key에 해당하는 Value가 없으면 Value를 생성하고, Key에 해당하는 Value가 있다면 아예 새로운 Value로 대체해버린다.

그냥 똑같다 ㅋㅋ

그리고 POST와 차이점이 하나 더 있는데, POST는 리소스를 서버에서 식별하는데 PUT은 리소스를 클라이언트에서 식별한다.

그냥 HashMap.put을 클라이언트에서 날린다고 생각하면 될듯!

PATCH

PATCH는 찾아보니까 "수선하다"라는 뜻이 있다. 실제로도 기능이 그러한데 PUT과 비교해보자면!

PUT은 리소스를 아예 바꿔버린다. 즉, 객체의 부분 변경이 불가능하다.

이를 대체하기 위해, PATCH가 나왔는데 PATCH는 객체를 아예 바꾸는 것이 아닌 PATCH 요청속에 있는 메세지 바디속에 적혀져있는 객체의 필드값만을 수정한다.

그러나 PATCH를 지원하지 않는 서버가 좀 많다고 한다!

DELETE

DELETE는 "삭제하다"라는 뜻이다.

클라이언트에서 리소스를 특정해주면 해당 리소스를 삭제하는 요청이다.

HTTP 메소드 속성

  • 안전 (Safe)
  • 멱등 (Idempotent)
  • 캐시가능 (Cacheable)

메소드별로 예를 들어가면서 어떤 느낌인지만 파악해두겠다!

안전

호출해도 리소스가 변하지 않는다.

GET 요청을 한다고해서 리소스가 변하지 않는다. 고로 GET은 안전하다.
POST,DELETE,PUT,PATCH 요청은 리소스가 변하는 메소드다. 고로 POST는 안전하지 않다.

그런데 메소드별로 안전성을 굳이 따지는 이유가 궁금하다.

그래서 질문을 남겨놨다.. 답변이 오면 링크를 첨부하겠다!

멱등

f(f(x)) = f(x) 즉, 같은 요청을 여러번 호출해도 그 결과는 똑같다.

고등학교 수학시간에 배웠던 개념인데 여기서도 쓰이게 될 줄은 몰랐다 ㅋㅋ 반가웠다

GET 요청은 암만 호출한다해도 결국에 리소스를 조회하는 것이기 때문에 변화가 없다.
그러므로 GET은 멱등하다고 볼 수 있다.

POST 요청은 멱등하지 못하다.
POST 요청을 통해 바뀔수도있는 데이터베이스에 또 같은 요청을 하게되면 그때마다 같은 응답이 올지는 미지수다.

PUT은 아예 리소스를 대체한다. 그래서 같은 객체 정보를 계에에에에에에속 PUT을 한다해도 그 결과는 바뀌지 않는다.
그러므로 PUT은 멱등하다.

DELETE 또한 멱등하다!

PATCH는 상황에따라서 멱등할 수 있고 아닐 수도 있다. 그러므로 PATCH는 멱등하지 못하다.

캐시가능

이 부분은 아직 내가 캐시에 대한 강의를 듣지않아서 완전히 와닿진 않았다.

HTTP 스펙상 GET, POST, PATCH가 가능하다고 한다.

캐시를 할려면 리소스끼리 Key라는 것이 맞아야하는데, POST나 PATCH는 메세지 바디가 안에 더 있어서, 그걸 구현하는게 쉽지가 않다고 한다!

나중에 더 자세히 알아보도록 하겠다.

profile
부지런히 살자!!

0개의 댓글