개발자의 오르막

[스프링 기반 REST API 개발 #01] REST API 소개 본문

SpringFrameWork/SpringBoot

[스프링 기반 REST API 개발 #01] REST API 소개

계단 2020. 3. 21. 16:54

https://www.youtube.com/watch?v=RP_f5dMoHFc

 

 

# REST 아키텍처 스타일 충족 요건

- Client-Server

- Stateless

- Cache

- Uniform Interface

- Layered System

- Code-On-Demand (optional)

 

 

# Uniform interface

- identification of resources

- manipulation of resources through represenations

- self-descrive messages

- hypermisa as the engine of application state (HATEOAS)

 

 

# Self-descriptive message

- 메시지 스스로 메시지에 대한 설명이 가능해야 한다.

- 서버가 변해서 메시지가 변해도 클라이언트는 그 메시지를 보고 해석이 가능하다.

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

 

# HATEOAS

- 하이퍼미디어(링크)를 통해 애플리케이션 상태 변화가 가능해야 한다.

- 링크 정보를 동적으로 바꿀 수 있다.

 

 

한국의 기존 REST API 라 불리는 서비스는 크게, Self-descriptive message, HATEOAS 를 만족하지

못한다고 한다.

 

즉, REST API 로 응답값을 받은 JSON 은 REST API 문서를 참조하지 않아도, 이 메시지가 어떤 설명을

갖고 있는지 클라이언트가 이해가능해야 한다.

아니면 이 응답을 해석할 수 있는 문서 링크를 각 메시지마다 담기만해도 Self-descriptive message 를 충족한다.

 

< HTTP/1.1 200 OK
< Server: nginx
< Date: Mon, 26 Sep 2016 01:39:37 GMT
< Content-Type: text/xml;charset=utf-8
< Transfer-Encoding: chunked
< Connection: keep-alive
< Keep-Alive: timeout=5
< Vary: Accept-Encoding
< X-Powered-By: Naver
< Cache-Control: no-cache, no-store, must-revalidate
< Pragma: no-cache
<
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>Naver Open API - blog ::'리뷰'</title>
        <link>http://search.naver.com</link>
        <description>Naver Search Result</description>
        <lastBuildDate>Mon, 26 Sep 2016 10:39:37 +0900</lastBuildDate>
        <total>8714891</total>
        <start>1</start><display>10</display>
        <item>
            <title>명예훼손 없이 <b>리뷰</b>쓰기</title>
            <link>http://openapi.naver.com/l?AAABWLyw6CMBREv+ayNJe2UrrogvJwg8aYKGvACiSUalNR/t6azGLO5Mzrrd0moVSQJZDl/6I4KIxGpx9y9P4JNANShXSzHXZLu2q3660Jw2bt0k1+aF1rgFYXfZ+c7j3QorYDkCT4JxuIEEyRUYGcxpGXMeMs3VPBOUEWGXntynUW03k7ohBYfG+mOdRqbPL6E84/apnqgaEAAAA=</link>
            <description>명예훼손 없이 <b>리뷰</b>쓰기 우리 블로그하시는 분들께는 꽤 중요한 내용일 수도 있습니다 그것도 주로 <b>리뷰</b> 위주로 블로그를 진행하신 분이라면 더욱 더 말이죠
                오늘 포스팅은, 어떻게 하면 객관적이고 좋은 <b>리뷰</b>를... </description>
            <bloggername>건짱의 Best Drawing World2</bloggername>
            <bloggerlink>http://blog.naver.com/yoonbitgaram</bloggerlink>
            <postdate>20161208</postdate>
        </item>
        ...
    </channel>
</rss>

- Content-Type 을 RSS 으로 바꾼다면 해당 API 는 Self-descriptive message 을 만족시킨다.

  응답을 받았을 때 응답 자체로 응답에 대한 정보를 알 수 있기 때문이다.

 

- 올바른 REST API 예시

https://developer.github.com/v3/issues/

 

Issues

Get started with one of our guides, or jump straight into the API documentation.

developer.github.com

 

# 해결방법

1) Self-descriptive message

- 미디어 타입을 정의하고, IANA에 등록하고, 그 미디어 타입을 리소스 리턴할 때 Content-Type 으로 사용한다.

- profile 링크 헤더를 추가한다.

2) HATEOAS 해결 방법

- 데이터에 링크를 제공 ( HAL )

- 링크 헤더나 Location 을 제공

 

Comments