반응형

HTTP 메서드 - GET, POST

HTTP 메서드에서 가장 많이 사용하는 GET, POST에 대해서 알아보도록 하자.

HTTP 메서드는 클라이언트가 서버에 요청을 할 때, 기대하는 행동들이다.

GET이라는 것은 뭔가 달라는 것이고,
POST라는 것은 내가 데이터를 줄테니 등록을 하거나, 어떤 처리를 해달라는 것이다.

 

주로 많이 사용하는 HTTP 메서드는 다음과 같다.

GET은 리소스 조회

POST는 요청 데이터 처리, 주로 등록에 사용

PUT은 리소스를 대체, 해당 리소스가 없으면 생성

PATCH는 리소스 부분 변경

DELETE는 리소스 삭제이다.

그런데 최근에는 리소스라는 표현이 Representation으로 바뀌었다.

또 다른 메서드도 있는데,

HEAD는 GET과 동일하지만 메시지 부분을 제외하고, 상태 줄(시작라인)과 헤더만 반환

OPTIONS는 대상 릿소ㅡ에 대한 통신 가능 옵션(메서드)을 설명한다. (주로 CORS에서 사용한다)

CONNECT는 대상 자원으로 식별되는 서버에 대한 터널을 설정한다.

TRACE는 대상 리소스에 대한 경로를 따라 메시지 루프백 테스트를 수행한다.

GET은 리소스를 조회한다.

서버에 전달하고 싶은 데이터는 query(쿼리 파라미터, 쿼리 스트링)를 통해서 전달한다.

메시지 바디를 사용해서 데이터를 전달할 수 있지만, 지원하지 않는 곳이 많아서 권장하지 않는다.

클라이언트가 /members/100 유저를 달라고 GET 메시지를 요청하면,

서버에 GET메시지가 도착하면, "아~ members/100 데이터를 달라는 거구나"라고 하고서
서버가 내부에 데이터베이스를 조회한다.

그런다음 JSON메시지와같은 메시지를 만들어서 (JSON일수도 있고 다른 것일 수도 있음)
응답 메시지를 만든다음 클라이언트에게 보낸다.

응답 데이터는 HTTP 응답메시지로,
HTTP버전, 200 OK, 
그리고 Content-Type은 application/json
Content-Length는 34야 라고 해서 클라이언트에게 HTTP 응답메시지가 전달된다.

GET은 요청할 때 데이터를 전달하지는 않는데,

POST는 클라이언트에서 서버로 요청을 보낼 때, "서버 너에게 데이터를 줄테니, 서버 너가 받아서 이 요청 데이터를 처리해줘!" 라는 것이다.

POST는 클라이언트에서 서버로 데이터를 전달한다!

메시지 바디를 통해 서보로 요청 데이터를 전달한다.

그러면 서버는 이 요청 데이터를 받아서 처리하는데,
보통 어떤 처리들을 하냐면, 이 메시지 바디를 통해서 들어온 데이터를 처리하는 모든 기능을 수행한다.

POST는 주로 전달된 데이터로 신규 리소스 등록, 프로세스 처리에 사용한다.

POST메시지로 /members 라고 데이터를 보내면  그 데이터는 서버인 내가 저장할거야, 내부적인 프로세스에 어떤식으로 사용할거야 등등 미리 서로 약속을 해놓는다.

예를 들어서 지금은 서버에 /members라고 오면 신규로 등록한다고 정했다고 가정하자.

그러면 POST로 /members가 오면,

서버에서 이 데이터를 받아서 열어본다음 신규 리소스 식별자를 생성해서  데이터베이스에 등록한다.

그런다음에 이렇게 응답한다.

신규로 자원이 생성되면 보통, HTTP/버전 201 Created라고 보낸다.

그리고 201로 보낼 때는 Location도 보낸다. 자원이 생성된 경로를 보내주는 것이다.

그리고 등록된 자원에 대한 데이터도 보내준다.

POST는 요청 데이터를 어떻게 처리한다는 뜻일까?

HTTP스펙에서 POST의 정의를 살펴보면 다음과 같다.

스펙 : POST 메서드는 대상 리소스가 리소스의 고유 한 의미 체계에 따라 요청에 포함 된 표현(리소스)을 처리하도록 요청한다.

  • 예를 들어 POST는 다음과 같은 기능에 사용된다.
    • HTML양식에 입력된 필드와 같은 데이터 블록을 데이터 처리 프로세스에 제공
      • 예) HTML FORM에 입력한 정보로 회원 가입, 주문 등에서 사용
    • 게시판, 뉴스 그룹, 메일링 리스트, 블로그 또는 유사한 기사 그룹에 메시지 게시
      • 예) 게시판 글쓰기, 메일링 리스트, 블로그 또는 유사한 기사 그룹에 메시지 게시
    • 서버가 아직 식별하지 않은 새 리소스 생성
      • 예) 신규 주문 생성
    • 기존 자원에 데이터 추가
      • 예) 한 문서 끝에 내용 추가하기
  • 정리 : 이 리소스 URI에 POST 요청이 오면 요청 데이터를 어떻게 처리할지 리소스마다 따로 정해야 한다. → 정해진 것이 없음

 

POST에 대해서 정리해보면,
POST는 여러가지 쓰임새가 있는데,

  • 1. 새 리소스 생성 (등록)
    • 주로 서버가 아직 식별하지 않은 새 리소스를 생성하고 등록하는데 사용한다.
  • 2. 요청 데이터 처리
    • 단순히 데이터를 생성하거나, 변경하는 것을 넘어서  프로세스를 처리해야 하는 경우
    • 예) 주문에서 결제완료 → 배달시작 → 배달완료 처럼 단순히 값 변경을 넘어 프로세스의 상태가 변경되는 경우
    • 그렇기 때문에 꼭 POST의 결과가 새로운 리소스가 생성되지는 않을 수도 있음(상태변경만 있을수도)
    • 예) POST/orders/{orderId}/start-delivery (실무에서는 이것처럼 리소스만가지고 URI를 설계하지 못하고 동사형 URI를 만들수밖에 없을 수도 있는데 이것을 컨트롤 URI 라고 한다.)
  • 3. 다른 메서드로 처리하기 애매한 경우
    • 예) JSON으로 조회 데이터를 넘겨야 하는데, GET 메서드를 사용하기 어려운 경우
    • 애매하면 POST

 

 

 

반응형