[iOS CS Study] RESTful API

Oxong·2021년 8월 25일
0

iOS CS Study

목록 보기
16/18
post-custom-banner

21.08.16

공부한 것을 정리하는 용도의 글이므로 100% 정확하지 않을 수 있습니다.
참고용으로만 봐주시고, 내용이 부족하다고 느끼신다면 다른 글도 보시는 것이 좋습니다.
+ 틀린 부분, 수정해야 할 부분은 언제든지 피드백 주세요. 😊

                                                 by. ryalya





REST


- Rest → Representational State Transfer의 약자.

  • 자원(Resource) : URI
  • 행위(Verb) : HTTP Method
  • 표현(Representations)

- HTTP URI(Uniform Resource Identifier)를 통해 자원(Resource)을 명시하고,

- HTTP Method(POST, GET, PUT, DELETE)를 통해 해당 자원에 대한 CRUD Operation을 적용하는 것을 의미.

즉, REST는 자원 기반의 구조(ROA, Resource Oriented Architecture) 설계의 중심에 Resource가 있고 HTTP Method를 통해 Resource를 처리하도록 설계된 아키텍쳐를 의미한다.

장점

  • HTTP 프로토콜의 인프라를 그대로 사용하므로 REST API 사용을 위한 별도의 인프라를 구출할 필요가 없다.

  • HTTP 표준 프로토콜에 따르는 모든 플랫폼에서 사용이 가능하다.

  • Hypermedia API의 기본을 충실히 지키면서 범용성을 보장한다.

  • REST API 메시지가 의도하는 바를 명확하게 나타내므로 의도하는 바를 쉽게 파악할 수 있다.

  • 여러가지 서비스 디자인에서 생길 수 있는 문제를 최소화한다.

  • 서버와 클라이언트의 역할을 명확하게 분리한다.


단점

  • 표준이 존재하지 않는다.

  • 사용할 수 있는 메소드가 4가지 밖에 없다.(HTTP Method 형태가 제한적)

  • 브라우저를 통해 테스트할 일이 많은 서비스라면 쉽게 고칠 수 있는 URL보다 Header 값이 왠지 더 어렵게 느껴진다.

  • 구형 브라우저가 아직 제대로 지원해주지 못하는 부분이 존재한다. (PUT, DELETE를 사용하지 못함, pushState를 지원하지 않음 등)



REST 구성 요소

1. 자원(Resource): URI

  • 모든 자원에 고유한 ID가 존재하고, 이 자원은 Server에 존재한다.
  • 자원을 구별하는 ID는 ‘/groups/:group_id’와 같은 HTTP URI 다.
  • Client는 URI를 이용해서 자원을 지정하고 해당 자원의 상태(정보)에 대한 조작을 Server에 요청한다.

2. 행위(Verb): HTTP Method

  • HTTP 프로토콜의 Method를 사용한다.
  • HTTP 프로토콜은 GET, POST, PUT, DELETE 와 같은 메서드를 제공한다.

3. 표현(Representation of Resource)

  • Client가 자원의 상태(정보)에 대한 조작을 요청하면 Server는 이에 적절한 응답(Representation)을 보낸다.
  • REST에서 하나의 자원은 JSON, XML, TEXT, RSS 등 여러 형태의 Representation으로 나타내어 질 수 있다.
  • JSON 혹은 XML를 통해 데이터를 주고 받는 것이 일반적이다.


REST 특징

1) Uniform Interface(인터페이스 일관성)

- URI로 지정한 Resource에 대한 조작을 통일되고 한정적인 인터페이스로 수행한다.
- HTTP 표준 프로토콜에 따르는 모든 플랫폼에서 사용이 가능하다.
- 특정 언어나 기술에 종속되지 않는다.

2) Stateless (무상태성)

- HTTP 프로토콜은 Stateless Protocol이므로 REST 역시 무상태성을 갖는다.
- Client의 context를 Server에 저장하지 않는다.
  즉, 세션과 쿠키와 같은 context 정보를 신경쓰지 않아도 되므로 구현이 단순해진다.
- Server는 각각의 요청을 완전히 별개의 것으로 인식하고 처리한다.
  각 API 서버는 Client의 요청만을 단순 처리한다.
  즉, 이전 요청이 다음 요청의 처리에 연관되어서는 안된다.
  물론 이전 요청이 DB를 수정하여 DB에 의해 바뀌는 것은 허용한다.
  Server의 처리 방식에 일관성을 부여하고 부담이 줄어들며, 서비스의 자유도가 높아진다.

3) Cacheable (캐시 처리 가능)

- 웹 표준 HTTP 프로토콜을 그대로 사용하므로 웹에서 사용하는 기존의 인프라를 그대로 활용할 수 있다.
  즉, HTTP가 가진 가장 강력한 특징 중 하나인 캐싱 기능을 적용할 수 있다.
  HTTP 프로토콜 표준에서 사용하는 Last-Modified 태그나 E-Tag를 이용하면 캐싱 구현이 가능하다.
- 대량의 요청을 효율적으로 처리하기 위해 캐시가 요구된다.
- 캐시 사용을 통해 응답시간이 빨라지고 REST Server 트랜잭션이 발생하지 않기 때문에 전체 응답시간, 성능, 서버의 자원 이용률을 향상시킬 수 있다.

4) Client - Server 구조

- 자원이 있는 쪽이 Server, 자원을 요청하는 쪽이 Client가 된다.
  (**역할 분리)
  REST Server: API를 제공하고 비즈니스 로직 처리 및 저장을 책임진다.
  Client: 사용자 인증이나 context(세션, 로그인 정보) 등을 직접 관리하고 책임진다.
- 서로 간 의존성이 줄어든다.

5) 계층형 구조

- Client는 REST API Server만 호출한다.
- REST Server는 다중 계층으로 구성될 수 있다.
  API Server는 순수 비즈니스 로직을 수행하고 그 앞단에 보안, 로드밸런싱, 암호화, 사용자 인증 등을 추가하여 구조상의 유연성을 줄 수 있다.
  또한 로드밸런싱, 공유 캐시 등을 통해 확장성과 보안성을 향상시킬 수 있다.
- PROXY, 게이트웨이 같은 네트워크 기반의 중간 매체를 사용할 수 있다.





REST API


  • 아키텍처의 제약 조건을 준수하는 애플리케이션 프로그래밍 인터페이스를 말함.

  • REST 기반으로 서비스 API를 구현한 것

  • 최근 OpenAPI(누구나 사용할 수 있도록 공개된 API: 구글 맵, 공공 데이터 등), 마이크로 서비스(하나의 큰 애플리케이션을 여러 개의 작은 애플리케이션으로 쪼개어 변경과 조합이 가능하도록 만든 아키텍처) 등을 제공하는 업체 대부분은 REST API를 제공한다.


REST(Restful)?

RESTful은 일반적으로 REST라는 아키텍처를 구현하는 웹 서비스를 나타내기 위해 사용되는 용어이다.
REST의 기본 원칙을 성실히 지킨 서비스 디자인을 “RESTful”이라고 표현한다.
‘REST API’를 제공하는 웹 서비스를 ‘RESTful’하다고 할 수 있다.


RESTful의 목적?

이해하기 쉽고 사용하기 쉬운 REST API를 만드는 것.
RESTful한 API를 구현하는 근본적인 목적이 성능 향상에 있는 것이 아니라 일관적인 컨벤션을 통한 API의 이해도 및 호환성을 높이는 것이 주 동기이니, 성능이 중요한 상황에서는 굳이 RESTful한 API를 구현할 필요는 없다.




HTTP Method


일반적으로 웹에서 REST API를 작성할 때, 5가지의 Method(GET, POST, PUT, PATCH, DELETE)를 사용하여 CRUD를 구현한다.


🔹 GET

요약 : URI(URL)가 가진 정보를 검색하기 위해 서버 측에 요청

GET은 리소스를 가져올 때 (읽거나 Read / 검색했을 때 Retruieve) 사용한다

GET을 사용했을 때는 서버에 어떠한 수정도 있으면 안된다.

서버에서 리소스에 대한 수정이 없기 때문에 GET Method는 safe methods라고 할 수 있다. (=데이터 변형의 위험 없이 사용할 수 있음)

또한, GET 요청은 idempotent(멱등법칙/멱등성)한데, 이는 리소스에 영향이 없는 API로 어디에서 요청을 해도, 같은 요청을 여러번 해도 동일한 결과를 반환(항상 같은 응답 받음)하는 것이다.

GET 요청이 성공적으로 이루어진다면 응답 본문(XML/JSON 등)과 함께 200(OK)으로 HTTP 응답 코드를 리턴한다.

만약 리소스가 발견되지 못했다면 404(Not Found)로 응답하며, 요청이 적합한 형식이 아니라면 400(Bad Request)로 리턴한다.

** 멱등성(idempotent) : 연산을 여러 번 적용하더라도 결과가 달라지지 않는 성질
ex) 1 x 1 = 1


🔹 POST

요약 : Server에 Input Data를 보내기 위함 (HTML form에 많이 사용)

POST는 새로운 리소스를 생성(create)하거나 독립적인 명령(Controller)를 실행할 때 사용한다.

POST 요청은 idempotent하지 않으므로, 같은 POST 요청을 반복한다 해도 항상 같은 응답이 오지 않을 수 있다.

서버에 리소스가 정상적으로 생성 된 경우 201(Create)로 HTTP 응답 코드를 리턴하고 요청에 대한 상태를 기술한 메시지와 새로운 리소스에 대한 Location을 header에 담아 반환해야 한다.

또한, POST는 특정한 명령을 실행하는 용도로도 사용되는데 이럴 경우, 200(OK)또는 204(No Content)가 적절한 응답할 수 있다.


GET vs POST



🔹 PUT

요약 : Server에 문서를 쓸때 사용 (GET과 반대)

  • PUT 메소드는 서버가 Client 요청의 Body를 확인함.
  • 요청된 URL에 정의된 새로운 Resource를 생성하기 위함.
  • 요청된 URL이 존재할 경우 대체하여 사용

PUT은 현재 존재하는 리소스의 전체적인 업데이트 하는 경우에 사용한다.

put 메서드는 식별자의 자원을 http 메세지로 함께 넘어온 엔티티로 교체한다.

만약 식별자가 존재하지 않는다해도, Request-URI와 Resource-URI가 올바르다면 넘어온 식별자를 id로 하는 새 자원을 생성하고 201(create)로 응답할 수 있다.

정상적으로 Update 되었다면 200(OK), 식별자 id를 사용할 수 없는 경우에는 204(No content)를 통해 응답한다.

업데이트를 요청한 리소스가 있고 실제로 업데이트되었다면 기존의 Response는 캐시처리가 되면 안된다.


🔹 DELETE

요약 : 요청 Resource를 삭제하는데 사용.

성공적으로 Resource를 삭제했다면 응답 상태를 body에 담고 있다면 200(OK)으로, 그렇지 않을 경우 202(Accepted) 또는 204(No Content)로 응답한다. 만약, 해당 Resource가 없다면 404(Not Found)로 응답한다.

만약 delete가 들어온다면 cache의 상태는 지금과 다른 상태가 되기때문에 cache를 삭제 해야 한다.


🔹 PATCH

요약 : 부분 리소스의 업데이트의 경우 사용.

PUT과 PATCH 모두 업데이트인데, PUT의 경우 전체적인 Update! PATCH의 경우 부분적인 업데이트!

PATCH는 우리가 사용하는 대부분의 웹서버 및 브라우저에서 지원하지 않는다.

IE8, PHP, Tomcat, Django 등등 많은 곳에서 기본적으로 지원하지 않기 때문에 유의!!!


POST vs PATCH

  • POST
    : 전체 업데이트
    모든 자원을 필요로 한다.
    만약 일부만 전달할 경우, 전달되지 않은 모든 자원은 null(or 초기화)처리 된다.

  • PATCH
    : 부분 업데이트
    변경을 원하는 자원만 넘기면 된다.
    PATCH는 전달되지 않은 자원에 대해 기존 데이터를 유지하는 방식으로 대응한다.



이미지 출처 : POST, PUT, PATCH

+) https://www.youtube.com/watch?v=RP_f5dMoHFc&t=2527s



Reference

[Network] REST란? REST API란? RESTful이란?

[HTTP] HTTP Method 정리 / GET vs POST 차이점

HTTP 응답 코드 종류 && HTTP 메소드 종류

[HTTP METHOD] PUT vs PATCH 차이점



** 추후 공부하고 추가할 Ref
RESTful API 설계 가이드

post-custom-banner

0개의 댓글