REST API란, HTTP Method

ellyheetov·2021년 5월 15일
5
post-thumbnail

REST란?

"representational State Transfer"의 약자

웹에 존재하는 모든 자원(이미지, 동영상, DB)에 고유한 URL을 부여하여 활용하는 것을 의미한다.

자원을 정의하고 자원에 대한 주소를 지정하는 방법론이다. 자원의 이름(자원의 표현)으로 구분하여 해당 자원의 상태(정보)를 주고 받는 모든 것을 의미한다.

REST 구성 요소

1. 자원(Resource), URL
모든 자원은 고유한 ID를 가지며 ID는 서버에 존재하고 클라이언트는 각 자원의 상태를 조작하기 위해 요청을 보낸다. HTTP에서 이러한 자원을 구별하는 ID는 student/1 과 같은 HTTP URL이다.

2. 행위(Verb), Method
클라이언트는 URL을 이용해 자원을 지정하고 자원을 조작하기 위해 Method를 사용한다. HTTP 프로토콜에서는 GET, POST, DELETE 같은 Method를 제공한다.

3. 표현(Representation)
클라이언트가 서버로 요청을 보냈을 때 응답 자원의 상태를 Representation이라고 한다. REST에서 하나의 자원은 JSON, XML, RSS등 여러 형태의 Representaion으로 나타낼 수 있다.

REST가 왜 필요한가?

REST API의 목적은 이해하기 쉽고 사용하기 쉬운 API를 제작하는데에 있다.

  1. GET /deleteUserInfo/id?=3

  2. DELETE /users/3

두 요청은 모두 특정 user의 정보를 삭제하는 API이다. 하지만 1번 API는 restful하지 못하다. 컨벤션 조차도 일관적이지 않을 수 있다. 이후 API의 이해도를 떨어트릴 수 있으며, 확장성도 없다.

REST API를 사용한다고 해서 성능이 향상되지는 않는다. 일관적인 컨벤션과 API의 이해도 및 호환성을 높이는 것이 REST API의 목적이다.

REST 특징

  1. Uniform (유니폼 인터페이스)
    Uniform Interface는 URI로 지정한 리소스에 대한 조작을 통일되고 한정적인 인터페이스로 수행하는 아키텍처 스타일을 말한다.

  2. Stateless (무상태성)
    REST는 무상태성 성격을 갖는다. 다시 말해 작업을 위한 상태정보를 따로 저장하고 관리하지 않습니다. 세션 정보나 쿠키정보를 별도로 저장하고 관리하지 않기 때문에 API 서버는 들어오는 요청만을 단순히 처리하면 됩니다. 때문에 서비스의 자유도가 높아지고 서버에서 불필요한 정보를 관리하지 않음으로써 구현이 단순해진다.

  3. Cacheable (캐시 가능)
    REST의 가장 큰 특징 중 하나는 HTTP라는 기존 웹표준을 그대로 사용하기 때문에, 웹에서 사용하는 기존 인프라를 그대로 활용이 가능하다. 따라서 HTTP가 가진 캐싱 기능이 적용 가능하다. HTTP 프로토콜 표준에서 사용하는 Last-Modified태그나 E-Tag를 이용하면 캐싱 구현이 가능하다.

  4. Self-descriptiveness (자체 표현 구조)
    REST의 또 다른 큰 특징 중 하나는 REST API 메시지만 보고도 이를 쉽게 이해 할 수 있는 자체 표현 구조로 되어 있다는 것이다.

  5. Client - Server 구조
    REST 서버는 API 제공, 클라이언트는 사용자 인증이나 컨텍스트(세션, 로그인 정보)등을 직접 관리하는 구조로 각각의 역할이 확실히 구분되기 때문에 클라이언트와 서버에서 개발해야 할 내용이 명확해지고 서로간 의존성이 줄어들게 된다.

  6. 계층형 구조
    REST 서버는 다중 계층으로 구성될 수 있으며 보안, 로드 밸런싱, 암호화 계층을 추가해 구조상의 유연성을 둘 수 있고 PROXY, 게이트웨이 같은 네트워크 기반의 중간매체를 사용할 수 있게 한다.

RESTful 이란

REST 아키텍처를 구현하는 웹 서비스를 나타내기 위해서 사용되는 용어이다.
REST원리를 따르는 시스템을 RESTful이라는 용어로 지칭한다.

RESTful API 특징

  • 확장성과 재사용성을 높여 유지보수 및 운용을 편리하게 한다.
  • HTTP 표준을 기반으로 구현하므로, HTTP를 지원하는 프로그램 언어로 클라이언트, 서버를 구축할 수 있다.

REST API Design Guide

  1. URI는 정보의 자원를 표현해야 한다.

    GET /members/1
    • resource는 동사보다는 명사를, 대문자보다는 소문자를 사용한다.
    • resource의 도큐먼트 이름으로는 단수 명사를 사용해야 한다.
    • resource의 컬렉션 이름으로는 복수 명사를 사용해야 한다.
    • resource의 스토어 이름으로는 복수 명사를 사용해야 한다.
  2. 자원에 대한 행위는 HTTP Method (GET, POST, PUT, DELETE)로 표현한다.

  3. URI에 HTTP Method가 들어가면 안된다.

    GET /books/delete/1 -> DELETE /books/1
  4. URI에 행위에 대한 동사 표현이 들어가면 안된다. (즉, CRUD 기능을 나타내는 것은 URI에 사용하지 않는다.)

    GET /books/show/1 -> GET /books/1  
    GET /books/insert/2 -> POST /books/2
  5. 경로 부분 중 변하는 부분은 유일한 값으로 대체한다. (즉, id는 하나의 특정 resource를 나타내는 고유값을 의미한다.)

    book을 생성하는 URI: POST /students
    id=10 인 book을 삭제하는 URI: DELETE /students/10
  1. 슬래시 구분자(/ )는 계층 관계를 나타내는데 사용한다.

    http://edwith.org/courses/java
  1. URI 마지막 문자로 슬래시(/ )를 포함하지 않는다.

    http://edwith.org/courses/ (X)
  2. URI에 포함되는 모든 글자는 리소스의 유일한 식별자로 사용되어야 하며 URI가 다르다는 것은 리소스가 다르다는 것이고, 역으로 리소스가 다르면 URI도 달라져야 한다.

  3. 하이픈(- )은 URI 가독성을 높이는데 사용할 수 있다.

  4. 밑줄( _ )은 URI에 사용하지 않는다.

  5. URI 경로에는 소문자가 적합하다.

    URI 경로에 대문자 사용은 피하도록 한다. RFC 3986(URI 문법 형식)은 URI 스키마와 호스트를 제외하고는 대소문자를 구별하도록 규정하기 때문이다.

  6. 파일 확장자는 URI에 포함하지 않는다. Accept header를 사용하도록 한다.

    http://edwith.org/files/java.jpg (X)
    
    GET /files/jdk18.exe HTTP/1.1 Host: edwith.org Accept: image/jpg (O)
  7. 리소스 간에 연관 관계가 있는 경우 다음과 같은 방법으로 표현한다.

    /리소스명/리소스 ID/관계가 있는 다른 리소스명

    GET : /books/{bookid}/viewers (일반적으로 소유 ‘has’의 관계를 표현할 때)
  8. 자원을 표현하는 컬렉션(Collection)과 도큐먼트(Document)

    컬렉션은 객체의 집합, 도큐먼트는 객체라고 생각하면 된다. 컬렉션과 도큐먼트 모두 리소스로 표현할 수 있으며 URI로 표현할 수 있다.

    http://edwith.org/courses/1 

    courses는 컬렉션을 나타내므로 복수로 표현해야 한다. courses/1 은 courses중에서 id가 1인 도큐먼트를 의미한다.

RESTful API를 위한 HTTP Methods

1. GET

자원을 받아오기만 할때 사용한다.

어떠한 방식으로도 자원의 상태를 변경시키지 않으므로, safe method라고 불리기도 한다.
GET API는 멱등성의 띈다. 멱등성이란, 동일한 API를 여러번 호출시에도 동일한 결과를 얻을 수 있음을 의미한다.(POST, PUT을 통해 데이터가 변경되지 않는다면)

2. POST

새로운 자원을 추가할 때 사용한다.

이는 서버의 상태를 변경시키며, 때문에 비멱등성 성질을 가진다. 응답 코드로 201(Created)를 받아야 정상적으로 서버에 추가 되었음을 확인할 수 있다.

3. PUT

존재하는 자원을 변경 할 때 사용한다.

만약 자원이 존재하지 않는 경우, API는 새로운 자원을 생성하도록 할 수 있다. 이 경우 응답코드는 201(Created)를 받게 된다.
존재하는 자원을 변경시킨 경우 200(OK) 또는 204(No Content) 응답코드를 받게 된다.

POST VS PUT

POST는 여러개의 자원에 수행되는 반면, PUT은 단일 자원에만 수행된다.

4. DELETE

자원을 삭제할 때 사용한다.

DELETE 메소드는 멱등성 성질을 띈다. DELETE 메소드를 요청하면 자원을 삭제하게 되는데, 반복적으로 DELETE를 호출한 경우 결과는 바뀌지 않는다. 하지만 이미 제거되었으므로404(NOT FOUND)를 반환받는다.

5. PATCH

한 자원의 데이터를 부분적으로 변경할 때 사용한다.

PUT도 마찬가지로 자원을 변경할 수 있다. 하지만 조금더 명확하게는 존재하는 자원에 대해 부분적으로 업데이트를 위해서는 PATCH를 사용한다. PUT은 자원을 완전히 대체하는 경우 사용한다.

** PATCH의 경우 모든 브라우저, 서버, 앱 어플리케이션 프레임워크에서 사용할 수 있는 것은 아니다.

참고

https://restfulapi.net/http-methods/
https://gmlwjd9405.github.io/2018/09/21/rest-and-restful.html

profile
 iOS Developer 좋아하는 것만 해도 부족한 시간

2개의 댓글

comment-user-thumbnail
2023년 8월 7일

안녕하세요. 해당 부분에서 공부하고 있었는데 글이 잘정리 하셔서 혹시 글을 발췌는 아니고 링크를 제 블로그에 남겨도 될까요? 시간 나실때 연락주세요. 블로그는 네이버라서 ㅜㅜ

1개의 답글