CS/네트워크

REST API

infitry 2022. 8. 15. 14:11
반응형

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의 특징

  1. Server-Client(서버-클라이언트 구조)
    - 분리된 아키텍처입니다, 서버와 클라이언트 각각 개발할 내용이 명확해지고, 요청과 응답만 신경 쓰면 됩니다.

  2. Stateless(무상태)
    - 세션, 쿠키 인증 방식이 아닌, 각각 Http Request 당 처리를 하기 때문에 상태를 갖지 않습니다.
    - 이로 인해 서버는 매 요청을 새로운 요청으로 봐도 무방하여 상태가 없습니다.

  3. Cacheable(캐시 처리 가능)
    - 기본 적으로 HTTP를 사용하기 때문에, HTTP에서 가능한 건 다 가능합니다.
    - 따라서 HTTP Header의 Last-modifed 태그를 사용하면 캐싱 처리도 가능합니다.

  4. Layered System(계층화)
    - 다중 계층으로 구성될 수 있습니다. 로드밸런서, 프록시 서버, 게이트웨이 등 네트워크 기반 중간 매체를 사용할 수 있습니다.

  5. 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)

등이 있습니다.

반응형