본문 바로가기
카테고리 없음

RESTful API 에 대해서..

by Node.js 주니어 개발자 귤 2023. 11. 16.

나는 RESTful API가 무엇이냐! 라고 질문한다면 RESTful API는 이것이다! 라고 명쾌하게 답을 할 수 있지 않다.

 

하지만 어떤것이 RESTful API에 부합하는지는 얼추 알고 있다고 생각했지만 그 생각이 잘못되었다는 사실을 깨달았다.

 

RESTful API 에 대해서 구글에 검색을 한다면 가장 먼저 반겨주는 것이 aws의 설명이다, 처음 개발에 대해서 공부할때는 이 글을 보아도 이해되지 않았지만 이젠 이해가되기 시작했다.

 

우연한 계기로 RESTful API에 대해서 돌아보고 한번 더 찾아보게 되었을때 REST에 대한 제약 조건을 상세히 들여다보게 되었고 눈여겨보지 않았던 제약조건을 찾아보게 되었다.

 

aws 홈페이지에서는 한국어를 지원해주기 때문에 한국어로만 보고 판단하였지만 무언가 설명이 와닿지 않아 영어로 되돌리게 되었고 나의 눈에 들어온것은 "Uniform interface" 다, 한국어로 균일한 인터페이스. 예전에 아무렇지 않게 읽고 지나갔던 단어이지만 Uniform interface란 무엇인지 찾아보게 되었고 Uniform interface또한 4가지의 제약조건을 가지고 있는것을 알게되었다.

Uniform interface 의 제약조건은 아래와 같다.

 

1. 자원 식별 (Resource Identification)

2. 표현의 일관성 (Consistency of Representations)

3. 자기 서술적 메시지 (Self-Descriptive Messages)

4. HATEOAS (Hypermedia as the Engine of Application State)

 

여기서 나의 시선을 빼앗은 것은 HATEOAS였다. 이게 어떤 의미인지 자세히 찾아 보았을때 아래와 같은 결론을 내릴 수 있었다.

 

서버는 클라이언트에게 필요한 조작을 위한 하이퍼미디어 링크를 포함해야 하며, 이는 클라이언트와 서버와의 상호 작용을 위한 다음 단계를 결정할 수 있다.

클라이언트가 서버와의 상호 작용을 위해 사전에 약속된 URL을 알 필요가 없다.

서버는 클라이언트에세 현재 자원에 대해 수행 가능한 작업을 나타내는 링크를 동적으로 제공한다.

클라이언트는 이 링크를 통해 서버와 상호작용 하고, 어떤 동작을 수행하는지 결정할 수 있다.

HATEOAS를 사용하는 RESTful API서비스에는 일반적으로 다음과 같은 특징이 있다.

 

1. 자기 기술적 메시지(Self-Descriptive Messages)

2. 동적 상호 작용(Dynamic Interaction)

 

Self-Descriptive Messages : 각각의 응답은 그 자체로 어떤 동작을 수행해야 하는지에 대한 정보를 포함하고 있어야 한다.

이 정보에는 현재 자원에 대한 다양한 조작(예: 생성, 수정, 삭제)을 수행할 수 있는 링크가 포함된다.

 

Dynamic Interaction : 클라이언트는 서버로부터 받은 링크를 통해 동적으로 자원간의 상호작용을 결정할 수 이싿.

따라서 클라이언트는 사전에 알지 못했던 조작을 수행할 수 있다.

 

간단히 예를 통해 설명하면, 클라이언트가 서버로부터 받은 응답에는 현재 자원에 대한 조작을 수행하기 위한 링크가 포함되어 있다. 클라이언트는 이 링크를 따라가면서 서버와의 상호작용을 계속할 수 있다. 이는 클라이언트와 서버간의 결합도를 낮추고 유연성을 제공하는데 도움이 된다.

 

ex) 평상시 나였다면 게시글에 대한 응답으로 아래와 같은 결과를 주었을 것이다

{
title : '제목',
content : '게시글',
}

 ex) 하지만 만약 게시글에 대한 api 호출 결과를 HATEOAS 응답으로 표현하면 아래와 같다

{
title : '제목',
content : '게시글",
link : {
  self : { href : '/post/1' }
  edit : { href : '/posts/1/edit' },
  delete : { href : '/posts/1/delete' }
  }
}

 

위의 상태와 같이 현재 자원의 정보, 현재 자원의 상태에서 추후 작동할 수 있는 리소스를 모두 전달하는 것이다.