※이글의 예시들은 Udemy의 Angela Yu의 "The-Complete-Web-Development-Bootcamp" 강의의 내용을 정리한 것입니다.
REST란 무엇인가?
REST란 REpresentational State Transfer의 줄임말이다. 이를 이해하기 위해서 우리는 인터넷의 구조를 봐야한다.
클라이언트는 서버에 요청을 한다. 여기서 클라이언트는 식당에서의 손님과 같고, 서버는 웨이터와 같다. 이러한 손님의 요청은 서버가 알아들을 수 있는 언어인 HTTP(Hypertext transfer protocol) request를 통하여 행해진다.
app.get(function(req,res));
그리고 이것은 위에서 req에 해당한다.
레스토랑이 가지고 있는 메뉴를 요청한다면, 웨이터가 가져다 주겠지만 그게 아니라면 404 Error를 만든다.
app.get(function(req,res));
이러한 결과값은 위에서 res에 해당한다.
레스토랑에 메뉴가 한정적이듯이 서버가 할 수 있는 일도 한정적이다. 서버는 다양한 API 들을 가지고 있고, 이는 클라이언트들이 사용할 수 있는 서비스들이다. API를 생성한다는 것은 고객의 요청에 서버가 대답할 수 있는 메뉴를 만드는 것과 비슷하다.
API를 RESTful하게 만든다는 것은?
REST는 건축 스타일이다. 바로크양식, 고딕양식 다양한 양식이 있듯 말이다. 이는 개발자들이 API를 만들 때 따라야 하는 규칙과 같다. RESTful API를 고안해낸 사람은 모든 web API가 비슷한 공통의 원칙을 사용한다면 많은 사람들이 사용하기 쉬워질 것이라 했다.
두가지 커다란 원칙
1. HTTP request verb를 사용하기
HTTP request verb란 get,post,put, patch, delete 같은 것들이다. 이것들은 데이터베이스의 CRUD(CREATE, READ, UPDATE, DELETE)와 비슷하다.
가장 먼저 get은 READ와 비슷하다. 우리는 서버가 어떤 리소스를 다룰 때 get을 사용한다. 우리는 app.get을 사용하여 요청을 하고 callback을 패스하여 응답하며 결과를 되돌려준다.
post는 CREATE와 비슷하다. 우리가 웹사이트를 개발하면서 form을 생성할 때마다 app.post를 사용하였고 req와 res가 딸린 callback을 가졌다. 서버에 데이터가 post 되면 우리는 데이터베이스에 입구를 만들고 데이터를 저장한다. 이 경우에 req는 데이터를 포함하고 있고 res는 성공 또는 에러와 같은 응답을 가진다.
put 과 patch는 모두 UPDATE와 유사하다. 그렇다면 둘의 차이는 무엇일까?
내가 쇼핑몰에서 전등을 배송시켰는데 그것의 손잡이가 망가진채로 왔다고 가정하자. 이런 경우에 쇼핑몰이 할 수 있는 첫번째 대처는 나에게 새로운 전등을 보내주는 것이다. 그리고 이는 put과 같다. update를 위해 이전의 것을 대체할 새로운 요소를 통째로 보내는 것을 의미한다.
또 다른 대처는 새로운 손잡이를 보내는 것이다. 그리고 이는 patch와 같다. update 될 필요가 있는 부분만 새로 update 하는 것이다.
delete는 이름과 같이 DELETE와 같다. 특정 데이터베이스나 데이터를 삭제하는 것이다.
2. 특정한 패턴의 라우트 또는 Endpoint URL을 사용하기
원하는 리소스에 접근하기 위해 사용하는 경로를 라우트라고 한다. 이런 라우트를 restful하게 만든다는 것은 아래와 같다.
HTTP Verbs | /articles | /articles/john-do |
GET | 모든 article을 read함 | 특정 article을 read |
POST | 하나의 새로운 article 생성 | |
PUT | 특정 article update | |
PATCH | 특정 article update | |
DELETE | 모든 article 삭제 | 특정 article 삭제 |
'강의노트' 카테고리의 다른 글
OAuth란? (0) | 2020.01.18 |
---|---|
salting 과 hashing (0) | 2020.01.15 |
[mongoDB] mongoDB에서 관계성 정립 (0) | 2020.01.03 |
[mongoDB] mongo db의 CRUD (0) | 2020.01.03 |
[SQL] 데이터베이스 조작 (0) | 2020.01.02 |