Rest API란?

Minkyeong Kim·2021년 12월 6일
0

[boostcourse] Web-Backend

목록 보기
49/55

REST

  • Representational State Transfer의 약자
  • 자원을 이름으로 구분하여 해당 자원의 상태(또는 정보)를 주고 받는 모든 것을 의미
  • 웹의 기존 기술과 HTTP 프로토콜을 그대로 활용 -> 웹의 장점을 최대한 활용할 수 있는 아키텍처 스타일

REST 구성

  • 자원(Resource): Data, Meta Data, HATEOAS로 구성
  • 행위(Verb): HTTP Method로 표현
  • 표현(Representations)

REST 특징

1) Uniform Interface

  • 구성 요소 사이의 인터페이스는 uniform 해야 함
  • 인터페이스의 일반화
    • 전체 시스템 아키텍처의 단순화
    • 상호작용의 가시성 개선
    • 구현과 서비스 분리로 독립적 진화 가능

2) Stateless

  • 클라이언트와 서버의 통신에는 상태가 없어야 함
  • 모든 요청은 필요한 모든 정보를 담고 있어야 함
  • 요청 하나로만 인식 가능
    • 가시성 개선
    • task 실패 시 복원 용이하여 신뢰성 개선
    • 상태 저장할 필요가 없어 규모 확장성 개선

3) Cacheable

  • 모든 서버 응답은 캐시가 가능한지 알 수 있어야 함
  • 효율, 규모 확장성, 사용자 입장에서의 성능 개선

4) Self-descriptiveness (자체 표현 구조)

  • REST API 메시지만 보고도 이를 쉽게 이해 할 수 있는 자체 표현 구조로 되어 있음

5) Client - Server 구조

  • 사용자 인터페이스에 대한 관심(concern)을 데이터 저장에 대한 관심으로부터 분리 -> 클라이언트의 이식성과 서버의 규모확장성 개선

6) Layered System(계층형 구조)

  • 다중 계층으로 구성
    • 보안, 로드 밸런싱, 암호화 계층을 추가해 구조상의 유연성을 둘 수 있음
    • PROXY, 게이트웨이 같은 네트워크 기반의 중간매체 사용할 수 있게 함

REST API 설계 가이드

1) URI는 정보의 자원을 표현

  • resource는 동사보다는 명사를, 대문자보다는 소문자를 사용
  • resource의 도큐먼트 이름으로는 단수 명사를 사용
  • resource의 컬렉션 이름으로는 복수 명사를 사용
  • resource의 스토어 이름으로는 복수 명사를 사용
  • 예 : GET /members/1

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

6) 슬래시 구분자(/ )는 계층 관계를 나타내는데 사용

7) URI 마지막 문자로 슬래시(/ ) 포함 불가

8) URI에 포함되는 모든 글자는 리소스의 유일한 식별자로 사용되어야 하며 URI가 다르다는 것은 리소스가 다르다는 것이고, 역으로 리소스가 다르면 URI도 달라져야 합니다.

9) 하이픈(- )은 URI 가독성을 높이는데 사용 가능

10) 밑줄( _ ) 사용 안함

11) URI 경로에는 소문자가 적합함

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

12) 파일 확장자는 URI에 포함하지 않고 Accept header를 사용

13) 리소스 간에 연관 관계가 있는 경우 /리소스명/리소스 ID/관계가 있는 다른 리소스명 형태로 표현

  • 예) GET : /books/{bookid}/viewers (일반적으로 소유 ‘has’의 관계를 표현할 때)

14) 자원을 표현하는 컬렉션(Collection)과 도큐먼트(Document)

  • 컬렉션: 객체의 집합
  • 도큐먼트: 객체
  • 컬렉션과 도큐먼트 모두 리소스로 표현할 수 있으며 URI로 표현 가능
  • 예) http://edwith.org/courses/1
    courses는 컬렉션이고, 복수로 표현해야 함. courses/1 은 courses중에서 id가 1인 도큐먼트를 의미

HATEOAS

  • Hypermedia As The Engine Of Application State의 약자
  • 데이터와 함께 관련된 URL정보를 제공하는 것
  • "_links"가 HATEOAS부분에 해당
{
    "id" : 1,
    "title" : "hello spring",
    "author" : "carami"
    "price" : 5000,
    "_links":{
        "self":{
        "href":"http://localhost:8080/books/1"
        },
        "query-books":{
        "href":"http://localhost/books"
        },
        "write-books":{
        "href":"http://localhost/books"
        }
    }
}

0개의 댓글