반응형
REST API가 무엇인지 알아보고, API 설계 시 고려해야 할 점들을 알아보겠습니다.
REST란?
HTTP 저자 중 한 명인 로이 필딩이 HTTP의 우수성을 잘 살리지 못하는 것 같아 장점을 잘 살릴 수 있는 아키텍처로
REST를 고안해냈습니다.
자원을 이름으로 구분하여 해당 자원의 상태를 주고받는 모든 것을 의미합니다.
REST API 구성
REST API는 크게 세 구성으로 나눌 수 있습니다.
- 자원(RESOURCE) - URI
- 행위(Verb) - HTTP METHOD
- 표현(Representations) - Http Message Payload
자원을 이름으로 구분(URI)하여 해당 자원의 상태를 조회(GET) 하거나,
자원의 상태를 생성(POST), 수정(PUT, PATCH), 삭제(DELETE) 할 수 있습니다.
수정의 경우 요청 일부분만 수정하는 경우 PATCH,
전체를 수정하는 경우 PUT을 사용한다.
REST의 특징
- Server-Client(서버-클라이언트 구조)
- 분리된 아키텍처입니다, 서버와 클라이언트 각각 개발할 내용이 명확해지고, 요청과 응답만 신경 쓰면 됩니다. - Stateless(무상태)
- 세션, 쿠키 인증 방식이 아닌, 각각 Http Request 당 처리를 하기 때문에 상태를 갖지 않습니다.
- 이로 인해 서버는 매 요청을 새로운 요청으로 봐도 무방하여 상태가 없습니다. - Cacheable(캐시 처리 가능)
- 기본 적으로 HTTP를 사용하기 때문에, HTTP에서 가능한 건 다 가능합니다.
- 따라서 HTTP Header의 Last-modifed 태그를 사용하면 캐싱 처리도 가능합니다. - Layered System(계층화)
- 다중 계층으로 구성될 수 있습니다. 로드밸런서, 프록시 서버, 게이트웨이 등 네트워크 기반 중간 매체를 사용할 수 있습니다. - Uniform Interface(인터페이스 일관성)
- HTTP Method를 통해 행위를 표현해 자원에 접근하는 일관된 인터페이스를 가질 수 있습니다.
* 대부분의 API들이 Uniform Interface의 HATEOAS와 Self-descritive를 지키지 못하고 있어 REST API가 아니라고 합니다.
- self-descriptive: HTTP 메시지는 자기 자신을 설명할 수 있어야 합니다. 하지만, 대부분의 REST API로 불리는 API들은
아래와 같이 응답합니다.
응답받는 클라이언트 입장에서는 id가 무엇인지, name이 무엇인지 파악하기 어렵습니다.
따라서, Media Type을 정의하고 Content-Type을 지정하는 방법으로 해결하거나, Link 헤더를 사용하는 방법이 있습니다.
HTTP/1.1 200 OK
Content-Type: application/json
{"id":1,"name":"이름1"}
- HATEOAS: HiperLink를 이용해서 상태를 전이할 수 있어야합니다.
쉽게 말해서 현재 위치에서 어디로 이동할 수 있는지도 클라이언트에게 전달하여야 합니다.
HTML 응답의 경우 a 태그를 통해 이를 해소할 수 있습니다.
JSON 응답을 하는 REST API의 경우 Link, Location 헤더를 사용하거나 Body Data에 표현할 수 있습니다.
아래는 해당 내용에 대해 잘 설명해주신 세미나 영상 입니다.
https://www.youtube.com/watch?v=RP_f5dMoHFc
REST API 설계 규칙
설계 시 항상 고려해야 할 가장 중요한 부분은 "행위는 HTTP Method로 URI에는 동사를 사용하지 않는다."
라는 점입니다.
그 외에도
대문자보다는 소문자를 사용한다.
www.infitry.com/Manage/NewPost (X)
www.infitry.com/manage/newpost (O)
"/"은 URI 마지막에 넣지 않는다.
www.infitry.com/manage/newpost/ (X)
www.infitry.com/manage/newpost (O)
행위(동사)는 URI에 표현하지 않는다.
www.infitry.com/edit/post (X) HTTPMethod.POST
www.infitry.com/post (O) HTTPMethod.PUT
파일 확장자는 포함하지 않는다.
www.infitry.com/manage/newpost.jpg (X)
www.infitry.com/manage/newpost (O)
언더바 대신 하이픈을 포함한다.
www.infitry.com/manage/cs_post (X)
www.infitry.com/manage/cs-post (O)
등이 있습니다.
반응형