먼저 간단하게 REST API의 개념에 간단히 알아봅시다. REST API는 HTTP 통신에서 어떤 자원에 대한 CRUD 요청을 Resource와 Method로 표현하여 특정한 형태로 전달하는 방식으로, REST API는 아래와 같은 것들로 구성됩니다.
이 중에서 HTTP 메서드에는 여러가지 종류가 존재하는데, GET과 POST 방식이 무엇인지, 이 둘의 차이점이 무엇인지 중점적으로 알아보고, PUT, PATCH. DELETE 등 다른 메서드들에 대해서도 알아보는 시간을 가져보려고 합니다.
GET, HEAD 등과 같은 읽기 작업에 사용되는 메서드들은 호출해도 리소스를 변경하지 않으므로 안전합니다. 그러나 POST, PUT, DELETE 등과 같은 메서드들은 리소스를 수정하거나 삭제하므로 안전하지 않습니다.
마찬가지로 GET, HEAD 등과 같은 메서드들은 읽기 작업에 사용되므로 여러번 호출해도 같은 결과를 가져오므로 멱등합니다. 또한 PUT, DELETE 등과 같은 메서드들도 리소스를 덮어 쓰거나 삭제한 후 같은 결과를 반환하므로 멱등합니다. 그러나 POST 같은 경우, 호출할 때마다 새로운 리소스를 생성하므로 다른 결과를 반환합니다. 따라서 멱등하지 않습니다.
※ PATCH 같은 경우 멱등하지 않다고 표에 나와있는데, 이는 해당 링크를 참조하면 도움이 될 것 같습니다.
※ 멱등은 외부 요인으로 중간에 리소스가 변경되는 것 까지는 고려하지 않습니다.
328번 회원의 정보를 조회한다고 가정할 때, GET을 사용합니다. 328번이라는 리소스를 서버에 전달하기 위해서 url에 담고 요청을 보내면, 서버에서 요청을 받아 적절한 데이터를 찾아냅니다. 그리고 클라이언트로 응답을 보내는데, 이때 반환하는 데이터의 타입이 무엇인지, 길이가 얼마나 되는지 등의 정보와 함께 요청한 데이터를 사용자에게 반환하게 됩니다.
이름이 gildong이고 나이가 34인 신규 회원을 등록한다고 할 때, POST를 사용합니다 HTTP 메세지 바디에 리소스들을 담아서 서버로 요청을 보내면, 데이터베이스에 신규 회원 등록을 하고 신규 리소스 식별자를 생성합니다. 그리고 클라이언트로 응답을 보내는데, 이 때 Location을 통해 해당 자원이 생성된 경로를 보내주고 등록된 데이터도 함께 보내줍니다.
기존의 328번 회원이 존재한다고 가정하고, 이 회원의 이름과 나이를 변경할 때 PUT을 사용합니다. 리소스가 존재하므로 새로운 이름인 jason과 나이 20이 새롭게 대체됩니다. 만약 328번 회원이 존재하지 않는다면, POST처럼 신규 회원을 생성하게 됩니다.
그러나 PUT 메서드를 사용할 때는 위와 같은 경우를 주의해야합니다. 만약 name 필드 없이 age 필드의 값만 변경하면, 리소스가 대체 될 때 name 필드가 아예 삭제될 수 있습니다. 따라서 부분적인 변경이 필요할 때는 PATCH 메서드를 사용하는 것을 권장합니다.
Reference