///////
Search
👩🏻

구현된 HTTP API는 어떠한 요소들을 만족해야 RESTful한 API 라고 부를 수 있나요?

핵심
RESTful한 API를 만들기 위해서
균일한 인터페이스, Client - Server 구조, 무상태성, 캐시가능성 , 계층형 구조 의 원칙을 지켜야 한다.

구성

자원
URI
행위
HTTP METHOD
표현
아키텍처에는 원칙과 제약조건이 있다.
질문은 어떤 요소를 만족해야 하는지므로 원칙에 대해 자세히 알아보고, 제약조건은 세밀하게 살펴보긔.

원칙

1.
Uniform Interface 균일한 인터페이스
Rest는 HTTP 표준에만 따른다면, 어떠한 기술이라던지 사용 가능한 인터페이스 스타일이다.
예를 들어
HTTP + JSON으로 REST API를 정의했다면, 안드로이드 플랫폼이건, iOS 플랫폼이건, 또는 C나 Java/Python이건 특정 언어나 기술에 종속 받지 않고
HTTP와 JSON을 사용할 수 있는 모든 플랫폼에 사용이 가능한 느슨한 결함(Loosely coupling) 형태의 구조이다.
느슨한 결합을 통해 네가지 제약조건으로서 균일한 (uniform) Rest 인터페이스를 달성한다.
2.
Client - Server 구조
관심사를 분리하여 클라이언트와 서버 구성요소가 독립적으로 발전하게 함. (의존성 )
3.
Stateless 무상태성
각 요청에 요청을 이해하고 완료하는데 필요한 모든 정보가 포함되어야 한다.
API 서버는 들어오는 요청만을 단순히 처리, 서비스의 자유도가 높아지고 구현이 단순해짐
4.
Cacheable 캐시가능
캐싱은 클라이언트 측의 성능 향상과 서버의 확장성 범위를 향상시킨다.
HTTP 프로토콜 표준에서 사용하는 Last-Modified태그나 E-Tag를 이용하면 캐싱 구현이 가능
5.
Layered System 계층형 구조
구성 요소 동작을 제한하여 아키텍처가 계층적으로 구성
REST 서버는 다중 계층으로 구성될 수 있으며
보안, 로드 밸런싱, 암호화 계층을 추가해 구조상의 유연성을 둘 수 있다.
계층화된 시스템에서 각 구성 요소는 상호 작용하는 요소와 직접 연결되었는지 확인 할 수 없다 (like 캡슐화)
PROXY, 게이트웨이 같은 네트워크 기반의 중간매체를 사용할 수 있게 한다.
6.
Code-On-Demand (Optional)
Server 에서 보낸 코드를 Client에서 실행할 수 있어야함을 의미 (ex - Java Script)

디자인시 제일 중요한 점 - Uniform Interface

HTTP 프로토콜을 사용하면 REST 의  많은 부분을 따르게 된다.
1. 요청(Client) 와 응답(Server) 의 구조 2. stateless(무상태성) 과 connetionless (비연결성) 3. Header 의 cache-control를 통한 cache 가능 여부 명시 4. Server 의 코드를 담을 수 있는 Body 5. HTTP 프로토콜로 통신할 때, 요청과 응답을 보내는 주체는, 중간 레이어에 대해 신경쓰지 않음
Java
복사
하지만 Unifrom Interface는 따로 신경을 써줘야 하기 때문에 중요하다.
1.
자원에 대한 식별
URI 를 통해 자원을 식별할 수 있어야한다는 의미
2.
표현을 통한 자원에 대한 조작
HTTP 메소드(표현) 을 통해 HTTP 메세지에 해당 리소스에 대해 어떤 조작을 하는지 명시하라는 것
3.
Self-descriptive messages 자기 서술적 메세지
메세지를 읽는 모든 주체들이, 메세지의 모든 요소는 메시지만 보고 그 의미를 파악할 수 있어야한다는 의미
예시로, 이런 응답을 API가 한다고 쳤을 때, 우리는 op와 path가 무엇을 의미하는지 모르므로 Restful 하지 않다.
HTTP/ 1.1 200 OK Content-Type: application/json [ { "op": "remove", "path": "/a/b/c" } ]
Java
복사
그래서 아래의 방법을 통해 Restful하게 만들 수 있다.
1.
미디어 타입의 정의
2.
Link 헤더의 API 명세를 첨부
4.
HATEOAS - Hypermedia as the engine of application stat
하이퍼 미디어를 통한 앱 상태 변경 인터페이스를 제공해야한다.
→ 현재 상태에서 어떤 페이지로 이동가능한지 보여야한다는 것
URI는 정보의 자원을 표현한다.
명사사용
행위가 들어가면 안된다.
_ 언더바 사용 금지. - 사용하여 가독성 높이기
마지막 문자로 / 를 포함하지 않는다.
소문자 사용
파일확장자 URI에 포함하지 않음
자원에 대한 행위는 HTTP METHOD로 표현한다.
참고