RESTful 도대체 뭐냐고...
뭔가를 듣고 배운 것 같고 개념도 이해가 되는 것 같은데 뭐가 뭔지 모르겠는 것이 왔다.
그건 바로 RESTful 이다.
일단 이름부터가 마음에 안든다. 뭔지 모르겠다. 풀어보자면 Representational State Transfer 이라고 한다.
네이버 사전에 찾아보니 [확장성 생성 언어(XML) 파일로 된 웹 페이지를 읽어 원하는 정보를 수집하는 기능.] 라고 한다.
한글을 봐도 모르겠다. 공부를 해도 잘 모르겠어서 뭐라 딱 정의하기는 어렵고 그냥 일단 현재까지 공부한 내용을 정리해보겠다.
(글 마지막 쯤에는 조금 이해가 됬을지도..?)
REST 3가지 구성 요소
1. 자원(Resource) : HTTP URI (특정 자원의 위치 주소)
- 모든 자원에 고유한 ID가 존재하고, 이 자원은 Server에 존재한다.
- 자원을 구별하는 ID는 ‘/groups/:group_id’와 같은 HTTP URI 다.
- Client는 URI를 이용해서 자원을 지정하고 해당 자원의 상태(정보)에 대한 조작을 Server에 요청한다
위의 그림을 통해 URI와 URL의 차이에 대한 나의 이해를 정리해보자면
(예가 정확하지 않을 수는 있지만 차이에 대한 나의 이해이다.)
예를 들어 http://opentutorials.org:3000/main?id=HTML&page=12 라고 되어있는 주소가 있다.
여기서 http://opentutorials.org:3000/main 여기까지는 URL이고(URI이기도 한)
http://opentutorials.org:3000/main?id=HTML&page=12 이 것은 URI라고 할 수 있다. (URL은 아닌)
이유는 URL은 자원의 위치를 나타내 주는 것이고 URI는 자원의 식별자인데
?id=HTML&page=12 이 부분은 위치를 나타내는 것이 아니라 id값이 HTML이고 page가 12인 것을 나타내주는 식별하는 부분이기 때문이다.
통상적으로 URL이라고 얘기를 하지만 정확하게는 URI라고 하는 것이 맞다고 생각한다.
출처 : https://velog.io/@jch9537/URI-URL
Q) URI 과 URL의 차이점은?
URL은 Uniform Resource Locator로 인터넷 상 자원의 위치를 의미합니다. 자원의 위치라는 것은 결국 어떤 파일의 위치를 의미합니다. 반면에 URI는 Uniform Resource Identifier로 인터넷 상의 자원을 식별하기 위한 문자열의 구성으로, URI는 URL을 포함하게 됩니다. 그러므로 URI가 보다 포괄적인 범위라고 할 수 있습니다.
2. 자원에 대한 행위(Verb) : HTTP Method
- HTTP 프로토콜의 Method를 사용한다.
- HTTP 프로토콜은 GET, POST, PUT, DELETE 와 같은 메서드를 제공한다.
GET, POST, PUT, DELETE 등을 말함.
3. 자원에 대한 행위의 내용 (Representations) : HTTP Message Pay Load
- Client가 자원의 상태(정보)에 대한 조작을 요청하면 Server는 이에 적절한 응답(Representation)을 보낸다.
- REST에서 하나의 자원은 JSON, XML, TEXT, RSS 등 여러 형태의 Representation으로 나타내어 질 수 있다.
- JSON 혹은 XML를 통해 데이터를 주고 받는 것이 일반적이다.
payload가 뭔지는 모르겠고 일단, 키워드는 body다. header가 아닌 body에 무언가가 담겨 오겠구나 라는 것으로 이해했다.
RESTful API의 설계규칙에 따른 엔드포인트 작성 가이드
원칙은 두 가지라고 한다.
첫 번째, URI는 정보의 자원을 표현해야 한다.
두 번째, 자원에 대한 행위는 HTTP Method(GET, POST, PUT, DELETE)로 표현한다.
<규칙>
- URI는 명사를 사용한다.
- 슬래시로 계층 관계를 표현한다.
- URI의 마지막에는 슬래시를 붙이지 않는다.
- URI는 소문자로만 구성한다.
- 가독성이 떨어지는 경우 하이픈을 사용한다.
- 경로 부분 중 변하는 부분은 유일한 값으로 대체한다.(즉, :id는 하나의 특정 resource를 나타내는 고유값이다.)
- Ex) student를 생성하는 route: POST /students
Ex) id=12인 student를 삭제하는 route: DELETE /students/12
- Ex) student를 생성하는 route: POST /students
- resource의 도큐먼트 이름으로는 단수 명사를 사용해야 한다.
- resource의 컬렉션 이름으로는 복수 명사를 사용해야 한다.
- resource의 스토어 이름으로는 복수 명사를 사용해야 한다
예시)
회원정보를 가져오는 URI
GET /members/show/1 (x)
GET /members/1 (o)
회원을 추가할 때
GET /members/insert/2 (x) - GET 메서드는 리소스 생성에 맞지 않습니다.
POST /members/2 (o)
HTTP METHOD의 알맞은 역할
POST | POST를 통해 해당 URI를 요청하면 리소스를 생성합니다. |
GET | GET를 통해 해당 리소스를 조회합니다. 리소스를 조회하고 해당 도큐먼트에 대한 자세한 정보를 가져온다. |
PUT | PUT를 통해 해당 리소스를 수정합니다. |
DELETE | DELETE를 통해 리소스를 삭제합니다. |
TIP. 자원을 표현하는 Colllection과 Document
컬렉션은 문서들의 집합, 객체들의 집합
http:// restapi.example.com/sports/soccer/players/13
sports, players 컬렉션과 soccer, 13(13번인 선수)를 의미하는 도큐먼트.
컬렉션은 복수로 기재한다.
추가)
RESTful의 목적
- 이해하기 쉽고 사용하기 쉬운 REST API를 만드는 것
- RESTful한 API를 구현하는 근본적인 목적이 성능 향상에 있는 것이 아니라 일관적인 컨벤션을 통한 API의 이해도 및 호환성을 높이는 것이 주 동기이니, 성능이 중요한 상황에서는 굳이 RESTful한 API를 구현할 필요는 없다.
RESTful 하지 못한 경우
- CRUD 기능을 모두 POST로만 처리하는 API
- route에 resource, id 외의 정보가 들어가는 경우(/students/updateName)
REST 특징
이부분은 봐도 잘 모르겠어서 링크만 남긴다.
https://gmlwjd9405.github.io/2018/09/21/rest-and-restful.html
Self-Descriptiveness(자체 표현)
Rest API는 요청 메세지만 보고도 이를 쉽게 이해할 수 있는 자체 표현 구조로 되어있습니다. 아래와 같은 JSON 형태의 Rest 메세지는 http://localhost:8080/board 로 게시글의 제목, 내용을 전달하고 있음을 손쉽게 이해할 수 있습니다. 또한 board라는 데이터를 추가(POST)하는 요청임을 파악할 수 있습니다
HTTP POST , http://localhost:8080/board
{
"board":{
"title":"제목",
"content":"내용"
}
}
즉 REST란 ?
- HTTP URI(Uniform Resource Identifier)를 통해 자원(Resource)을 명시하고,
- HTTP Method(POST, GET, PUT, DELETE)를 통해
- 해당 자원(URI)에 대한 CRUD Operation을 적용하는 것을 의미합니다.
아직도 이해가 될랑말랑한다. 근데 이렇게 개념을 안다고 해도 실제 사용하는 것은 또다른 문제다.
django 에서는 url경로를 어떻게 지정해야할지, views는 어떻게 작성해야 할 지 또 공부를 해야한다.
이에 대해서는 다음 글에 작성해보도록 하겠다.
출처
https://meetup.toast.com/posts/92
https://gmlwjd9405.github.io/2018/09/21/rest-and-restful.html