REST API

개뉸·2022년 10월 11일
0
post-thumbnail

이 글은 REST API 와 이것을 잘 지킨 RESTful 을 좀더 공부하고자 남겨놓은 글 이다.

진정한 REST API 라 함은 아래 제약조건을 모두 지켜낸 것이다. 그리하면 RESTful 하다고 말할 수 있다.

  • Client 와 Server
  1. 클라이언트는 서버에서 일어나는 일에 대해 알 수 없고 알 필요도 없다.
  2. 따라서 클라이언트와 서버가 서로 독립적이다.
  • Stateless
    클라이언트가 서버로 요청을 보내면 필요한 모든 정보가 포함되어 있어야 한다.

  • Cache

  1. 요청에 대한 응답 내의 데이터에 요청에 필요한 모든 정보가 포함되어야 한다.
  2. 보통 Http Header의 cache-control 헤더를 이용한다.
  • Uniform interface
  1. 대부분의 REST API 라고 하는 것들에서 지켜지지 않는 요소
  2. HATEOAS 에 관한 내용이 여기 담겨있다.

Uniform interface

Uniform interface 의 4가지 제약조건이 있다.

  1. Resource-Based
  2. Manipulation Of Resources Through Representations
  3. Self-Descriptive Message
  4. Hypermedia As The Engine Of Application State

여기서 1번과 2번을 합쳐서 요약하자면
"URI 로 지정한 리소스를 Http Method 를 통해서 표현하고 구분한다" 이다.

Self-Descriptive Message

응답 메세지가 스스로의 대한 설명을 할 수 있어야 한다.
API 의 명세서에 적는 내용이 그대로 응답 바디에 존재해야 한다는 것이다.
API 명세서 전체를 응답에 넣을 수는 없으므로 적어도 API 문서가 존재하는 곳을
알려줘야 한다. 그러면 어떻게 이것을 알려줘야 할까?

Hypermedia As The Engine Of Application State

이 글을 쓴 핵심인 HATEOAS 이다.
Hypermedia (링크)를 통해서 애플리케이션의 상태 전이가 가능해야 한다.
또한 Hypermedia (링크)에 자기 자신에 대해한 정보가 담겨야 한다.
상태전이라는건 무엇을 뜻하는 것일까?

클라이언트가 https://picboy.co.kr/complete-detail/283 에서 게시물을
조회한다고 해보자. 클라이언트의 다음 행동은 무엇이 있을까?

  • 다음 게시물 조회
  • 댓글 달기
  • 좋아요 하기

이런 행동들이 바로 상태 전이가 가능한 것들인데 이런 것들을 하는 방법을 응답 바디에 넣어줘야 한다는 것이다. 어떻게 넣어줘야할까?
바로 Hypermedia (링크)를 통해서 넣는다.

{
    "success": true,
    "data": {
        "id": 271,
        "liked": false,
        "frameTotal": 12,
        "topic": "달리는 사람",
        "gifUrl": null,
        "createdAt": "2022-10-07T13:25:16.520117",
        "frameImgList": [
            {
                "imgUrl": "https://doker-bucket.s3.ap-northeast-2.amazonaws.com/picboy/images/post271/d5dc9473-d37a-4477-97ff-0228adca760b-post271",
                "frameNum": 1,
                "nickname": "✨Hyo😎-dd4a2ad5-74c0-4267-9a1b-d1d63e035b21",
                "profileimg": null
            }
        ],
        "likeCount": 0,
        "viewCount": 1,
        "reportCount": 0,
        "commentListResponseDtoList": []
    },
    "errorResponse": null,
    "next" : "https://picboy.net/post/gif/detail/272", // 다음 게시물 조회
    "comment" : "https://picboy.net/comment/271", // 댓글 달기
    "like" : "https://picboy.net/post/like/271", // 좋아요 하기
}

"next" : "https://picboy.net/post/gif/detail/272", // 다음 게시물 조회
"comment" : "https://picboy.net/comment/271", // 댓글 달기
"like" : "https://picboy.net/post/like/271", // 좋아요 하기

이렇게 말이다.

HAL JSON 방법을 이용하면 여기서 더 다듬어서 형식에 맞게 할 수 있다.
해당 내용은 자료를 참고한 출처에서 확인할 수 있다.
출처 : https://wonit.tistory.com/454

0개의 댓글