주니봉
  • [Tech] Restful API란?
    2023년 12월 29일 09시 51분 48초에 업로드 된 글입니다.
    작성자: 봉주니

    한줄요약 : 5번, 6번 항목을 지키기 어렵기 때문에 Restful API는 정확히 구현하기 어렵다. HTTP API라고 해달라고, REST 를 만든 로이필딩이 말한다.

     

    • 한마디로 REST 의 특성을 가진 API
    • REST (Representational State Transfer)
      • 자원의 표현으로 구분하여 해당 자원의 상태를 주고 받는 것
      • 웹의 기존 기술과 HTTP 프로토콜을 그대로 사용함
      • HTTP URI를 통해 자원을 명시하고, Method (POST, GET, PUT, DELETE)를 통해 자원에 대한 CRUD 를 적용한다.
    • REST 의 구성
      • 자원(Resource) - URI
      • 행위(Verb) - Http Method
      • 표현(Representations) - JSON,XML,TEXT
    1. 자원 URI
      1. 모든 자원에 고유한 ID가 존재하고, 이 자원은 Server에 존재한다.
      2. 자원을 구분하는 ID는 /global/issue/1 와 같은 HTTP URI 이다.
    2. 행위 - Http Method
      1. HTTP 프로토콜의 Method를 사용한다.
      2. POST, GET, PUT, DELETE 를 제공한다.
    3. 표현
      1. 클라이언트가 자원의 상태에 대한 조작을 요청하면 Server는 이에 적절한 응답을 보낸다.
      2. REST에서 하나의 자원은 JSON, XML, TEXT 등 여러 형태로 나타낼 수 있다.

    REST 는 아키텍쳐 스타일 → 제약조건의 집합

    REST의 특징

    1. Client-server architecture
      1. 클라이언트와 서버가 서로 독립적이라 별도의 진화가 가능하다.
      2. client는 server 에서 어떤 일을 수행하더라도 내부 작업을 알지 않아도 된다.
    2. Statelessness(무상태성)
      1. 클라이언트에서 서버로 각 요청에는 그 요청에 필요한 모든 정보가 포함되어야 한다.
    3. Cacheability
      1. 요청에 대한 응답 내의 데이터에 해당 요청은 캐시가 가능한지 불가능 한지 명시해야 한다.
    4. Layered system
      1. REST Server는 다중 계층으로 구성 될 수 있고, 프록시나 게이트웨이 등 중간 매체도 사용 가능하다.
    5. Self-Descriptive Message (4번부터 만족)
      1. 글로벌로지스IS팀을 조회
      {"id":1,"name":"글로벌로지스IS팀"}
      
      1. HTTP Status 추가
      HTTP/1.1 200 OK
      {"id":1,"name":"글로벌로지스IS팀"}
      
      1. Content-type 추가
      HTTP/1.1 200 OK
      Content-Type: application/json
      {"id":1,"name":"글로벌로지스IS팀"}
      
      1. 해결방법
        1. MEDIA TYPE 정의 (IANA 등록)
        2. HTTP/1.1 200 OK Content-Type: application/ldcc.team+json {"id":1,"name":"글로벌로지스IS팀"}
        3. link header에 명세를 확인할 수 있는 링크 삽입
          HTTP/1.1 200 OK
          Content-Type: application/json
          Link: <https://ldcc.com/docs/team>; rel="profile"
          {"id":1,"name":"글로벌로지스IS팀"}
          
        4. {"id":1, "name":"글로벌로지스IS팀", "member":"<http://localhost:8080/api/ldcc/lglis/member>", "damdang":"<http://localhost:8080/api/ldcc/lglis/damdang>", "self":"<http://localhost:8080/api/ldcc/lglis>" }
    6. Uniform Interface
      1. Self-descriptive message
      2. Hypermedia As The Engine Of Application State (HATEOAS)
        1. Resource-Based
        2. Manipluation Of Resources Through Representations
        3. Hypermedia AThe Engine oApplication State (HATEOAS)
          1. Hypermedia (링크)를 통해서 애플리케이션의 상태 전이가 가능해야 한다.
            1. 링크 추가
        4. HAL 사용
          1. HAL(Hypertext Application Language)
          2. JSON, XML 코드 내에서 외부 리소스에 대한 링크를 정의하기 위한 규칙
          3. 타입
            1. application/hal+json
            2. application/hal+xml
          {
            "data": { // HAL JSON의 리소스 필드
              "id": 1,
              "name": "글로벌로지스IS팀",
              "content": "HAL JSON을 이용한 JSON처리"
            },
            "_links": { // HAL JSON의 링크 필드
              "self": {
                "href": "<http://localhost:8080/api/ldcc/lglis>" // 현재 api 주소
              },
              "team": {
                "href": "<http://localhost:8080/docs/team>" // 해당 api의 문서
              },
              "next": {
                "href": "<http://localhost:8080/api/ldcc/lglis/member>" // 멤버조회
              },
              "prev": {
                "href": "<http://localhost:8080/api/ldcc/lglis/damdang>" // 본부조회
              }
            }
          }
          
    7. Code on demand(optional)
    • 서버에서 코드를 클라이언트로 보내서 동작할수 있어야한다 → ex) 자바스크립트

    GraphQL - https://hahahoho5915.tistory.com/63

    반응형

    'TechStudy' 카테고리의 다른 글

    [Tech] VueJS  (2) 2023.12.30
    댓글