[Spring]GET,POST,PUT,DELE란?

2020년 02월 10일 by Xion

    [Spring]GET,POST,PUT,DELE란? 목차

대략적으로 말하자면

GET - 조회 (select)

POST - 등록(insert)

PUT - 수정(update)

DELETE - 삭제(delete)

와 같다.

 

먼저, 전체적인 메소드를 설명하면 다음과 같다.

HTTP 메소드 정리

HTTP Method

 전송형태

 설명

GET

 GET [request-uri]?query_string HTTP/1.1

 Host:[Hostname] 혹은 [IP]

 요청받은 URI의 정보를 검색하여 응답한다.

HEAD

 HEAD [request-uri] HTTP/1.1

 Host:[Hostname] 혹은 [IP]

 GET방식과 동일하지만, 응답에 BODY가 없고 응답코드와 HEAD만 응답한다.

웹서버 정보확인, 헬스체크, 버젼확인, 최종 수정일자 확인등의 용도로 사용된다.

POST

 POST [request-uri] HTTP/1.1

 Host:[Hostname] 혹은 [IP]

 Content-Lenght:[Length in Bytes]

 Content-Type:[Content Type]

 [데이터] 

 요청된 자원을 생성(CREATE)한다. 새로 작성된 리소스인 경우 HTTP헤더 항목 Location : URI주소를 포함하여 응답.

PUT

 PUT [request-uri] HTTP/1.1

 Host:[Hostname] 혹은 [IP]

 Content-Lenght:[Length in Bytes]

 Content-Type:[Content Type]

 [데이터] 

 요청된 자원을 수정(UPDATE)한다. 내용 갱신을 위주로 Location : URI를 보내지 않아도 된다. 클라이언트측은 요청된 URI를 그대로 사용하는 것으로 간주함.

PATCH

 PATCH [request-uri] HTTP/1.1

 Host:[Hostname] 혹은 [IP]

 Content-Lenght:[Length in Bytes]

 Content-Type:[Content Type]

 [데이터] 

  PUT과 유사하게 요청된 자원을 수정(UPDATE)할 때 사용한다. PUT의 경우 자원 전체를 갱신하는 의미지만, PATCH는 해당자원의 일부를 교체하는 의미로 사용.

DELETE

 DELETE [request-uri] HTTP/1.1

 Host:[Hostname] 혹은 [IP]

 요청된 자원을 삭제할 것을 요청함.  (안전성 문제로 대부분의 서버에서 비활성)

CONNECT

 CONNECT [request-uri] HTTP/1.1

 Host:[Hostname] 혹은 [IP]

 동적으로 터널 모드를 교환, 프락시 기능을 요청시 사용.

TRACE

 TRACE [request-uri] HTTP/ 1.1

 Host: [Hostname] 혹은 [IP]

 원격지 서버에 루프백 메시지 호출하기 위해 테스트용으로 사용.

OPTIONS

 OPTIONS [request-uri] HTTP/ 1.1

 Host: [Hostname] 혹은 [IP]

 웹서버에서 지원되는 메소드의 종류를 확인할 경우 사용.

| POST

-http 메세지로 넘어온 엔티티를 새로운 자원으로 등록한다.

-새로운 자원으로 등록하지않을 수도있는데 이런 경우엔 200(ok)이나 204(no content) response code로 응답한다.

-새로운 자원으로 만들어진 경우에는 201(created) response code로 응답하며 신규 생성된 자원의 위치를 헤더에 포함해야한다.

ex) 게시판에 새로 게시물을 등록하면 이를 따라갈수있는 위치를 응답 헤더에 넣어야한다는 의미

post request 예제(요청할때 식별자를 보내지않음)

POST /board

{  
//...  
}

 

| PUT

- post와의 차이는 put 메서드는 자원의 식별자를 이미 알고있는 상태여야한다는 점이다.

- put 메서드는 식별자의 자원을 http 메세지로 함께 넘어온 엔티티로 교체한다.

- response code는 200(ok), 204(no content)를 사용한다. 다만 put 메서드로 넘어온 식별자가 꼭 존재하고있는 식별자일 필요는 없다.

 존재하지않는 식별자를 넘길수도있는데 이런 경우엔 넘어온 식별자를 id로 하는 새 자원을 생성하고 201(created) 응답을 한다.

-식별자를 id로 사용할수없는 경우엔 에러코드로 응답한다.

 

put request 예제(요청할때 식별자를 보내야함, 그게 실제로 재하는것인지는 중요치 않음)

PUT /board/2

{  
//...  
}  

| 차이

 

똑같은 요청이 POST로 2번 날아오면 POST는 2개의 자원을 생성한다. 게시판에 글쓰기 요청을 2번 날리면 2개의 게시물이 등록되는것이다. PUT으로 동일한 요청을 2번 날린다고 생각해보자. 이때 PUT은 식별자를 포함해야한다. 다만 꼭 존재하는 식별자를 포함할 필요는 없으므로 존재하지않는 식별자로 요청을 하게되면 이때는 POST와 동일하게 자원을 생성한다. 하지만 두번째 요청에선 이미 첫번째 요청에서 생성된 자원이 있으므로 자원을 생성하지않고 교체하게된다. 이 부분이 POST와 PUT이 달라지게된다.

| 정리

가장 큰 차이점은 바로 "idempotent(멱등성)" 이라는 것인데, 우리말로하면 멱등성이라는건데 1번을 실행하든 100번을 실행하든 결과가 같은 성질을 의미한다.

존재하지 않는 자원으로 요청을 하면 신규 등록을 하는건 동일하나 동일한 요청을 2번 이상 하였을 때 결과는 달라지게 된다.

즉,

POST는 멱등성을 만족하지 못하며,

PUT은  아무리 많이 수행되더라도 리소스의 위치가 지정되어 새로운 자원이 생성되지 않으며 동일한 리소스를 수정하기 때문에 여러번 요청하더라도 멱등하다.