2020-8-3 스프링 Rest(1) RestAPI

Rest API

RestAPI를 충족시키기 위해서는 Self-Descriptive Message와 HATEOAS(Hyptermedia as the engine of application state)를 만족해야한다.

  • API : Application Programming Interface

  • REST

    • REpresentational State Transfer
    • 시스템 제각각의 독립적인 진화를 보장하기 위한 방법
    • REST API : Rest아키텍처 스타일을 따르는 API
    • 아키텍처스타일
      • 클라이언트-서버구조
      • stateless
      • cache
      • uniform interface
      • layered system
      • code-on-demand(optional)
    • Uniform Interface
      • Self-descrive message
      • Identification of resource
      • HATEOAS
      • manipulation of resources through representations
  • Self-descriptive message

    • 메세지 스스로 메세지에 대한 설명이 가능해야한다. => 응답만 가지고 메세지 자체를 해석할 수 있어야된다. 해석을 위한 profile link를 주는게 좋다. Github API가 REST의 모범사례

      • // Case1
        {"langcode":"ko"} // Bad Case
        
        // Case2
        // 닮은 유명인을 찾은 경우
        {
         "info": {
           "size": {
             "width": 900,
             "height": 675
           },
           "faceCount": 2
         },
         "faces": [{
           "celebrity": {
             "value": "안도하루카",
             "confidence": 0.266675
           }
         }, {
           "celebrity": {
             "value": "서효림",
             "confidence": 0.304959
           }
         }]
        }
        
        // 닮은 유명인을 찾지 못한 경우
        {
        	"info": {
        		"size": {
        			"width": 768,
        			"height": 1280
        		},
        		"faceCount": 0
        	},
        	"faces": []
        }
        
      • 위의 Case2도 데이터의 나열만 되어있지 응답을 보고서 어떤 역할을 하는지 모르기 때문에 문서를 봐야된다. 따라서 Self-descriptive라고 할 수 없다. 이를 해결하기 위해 profile이라도 추가해서 응답에 대한 해석을 도와줘야한다. 그래도 HATEOAS를 만족하지 않는다.

      • Case3도 Content-Type을 text/xml로 했다. 하지만 밑에 rss태그들을 브라우저가 해석을 못할 수 있다. 이 부분만 해결되면 Self Descriptive라고 할 수 있다. HATEOAS는 만족한다. link 태그에 url이 있다.
    • 서버가 변해서 메세지가 변해도 클라이언트는 그 메세지를 보고 해석 가능해야한다.

    • 확장 가능한 커뮤니케이션

  • HATEOAS

    • 하이퍼미디어(링크)를 통해 애플리케이션 상태 변화가 가능해야한다. => HTTP 메서드를 이용해서 CRUD를 주로 활용, Response 내에 있는 URL을 통해 다음 상태를 갈 수 있어야한다.
    • 링크 정보를 동적으로 바꿀 수 있다.(versioning없이)
  • Self-Descriptive Message 해결방법

    • 방법1 : 미디어타입을 정의하고 IANA에 등록하고 그 미디어 타입을 리소스 리턴할 때 Content-Type으로 사용
    • 방법2 : profile 링크 헤더를 추가한다. 브라우저들이 아직 스펙을 잘 지원안하기 때문… 응답 본문에 HAL스펙에 따른 profile링크추가
  • HATEOAS해결방법

    • 방법1 : 데이터에 링크 제공. 링크를 어떻게 정의할 것인가? HAL스펙에 따른다.

    느낀점

    • 많이들 RestAPI에 대해서 이야기를 한다. 데뷰에서 발표한 RestAPI에 관한 강의를 들으면서 그동안 잘못알고 있다고 느꼈다. 서버-클라이언트 구조로 나뉘고, HTTP 메서드와 URI를 통해 데이터에 대해 CRUD를 하고 그 결과를 JSON형태로 응답해주면 그게 RestAPI인줄 알았다. 데뷰에서 느꼈던것은 API자체가 self-descriptive message형태로 메세지 스스로가 설명가능해야하고, HATEOAS를 통해 상태전이가 가능해야된다고 설명이 있었다. 어떻게 만들까에 대해서 잘 몰랐지만, 강의를 통해 어느정도 익힐 수 있었다. Hateoas와 spring rest-doc 등을 잘 활용해서 최대한 rest-api에 맞는 형태로 설계를 해봐야겠다.
Written on August 3, 2020