핵심
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로 표현한다.
참고