REST API
REpresentational State Transfter Application Programming Interface
REST API의 제약 조건들
- Client - Server
- Client는 Server에서 어떤 일을 수행하더라도 내부 작업을 알지 않아도 된다.
- 플랫폼의 이식성을 향상
- Client와 Server가 서로 독립적이라 별도의 진화가 가능하다.
- Stateless
- Client에서 Server로 각 요청에는 그 요청에 필요한 모든 정보가 포함되어야 한다.
- Cache
- 요청에 대한 응답 내의 데이터에 해당 요청은 캐시가 가능한지 불가능 한지 명시해야 한다.
- 보통 HTTP Header에 cache-control Header를 사용
- Uniform Interface
Uniform Interface
URL로 지정된 리소스에 대한 조작을 통일하고 한정된 인터페이스로 수행하는 아키텍쳐 스타일이다.
4가지 제약 조건
- Resource-Based
- Manipluation Of Resources Through Representations
- Self-Descriptive Message
- Hypermedia As The Engine of Application State
Resource-Based & Manipluation Of Resources Through Representations
HTTP Method : POST
<https://my-server.com/user/login>
Self-Descriptive Message
메시지 스스로가 자신에 대한 설명을 할 수 있어야 한다.
만약 서버가 변해서 Response Data가 변경되었다면, 클라이언트에서는 해당 API 문서를 통해서 어떤 데이터가 바뀌었는지 알게 된다.
Hypermedia As The Engine of Application State
HATEOAS
Hypermedia (링크)를 통해서 Application의 상태 전이가 가능해진다. 또한 Hypermedia (링크)에 자기 자신에 대한 정보가 담겨야 한다.
만약 게시글을 조회하는 URI가 있다고 가정해보자.
GET <https://my-server.com/article>
이 이후에 사용자의 행동은
- 다음 게시물 조회
- 게시물을 내 피드에 저장
- 댓글 달기
위의 행동들이 가능한데, 이 것들을 Response Data에 넣어줘야한다는 것이다.
{
"data": {
"id": 1000,
"name": "게시글 1",
"content": "HAL JSON을 이용한 예시 JSON",
"self": "<http://localhost:8080/api/article/1000>", // 현재 api 주소
"profile": "<http://localhost:8080/docs#query-article>", // 해당 api의 문서
"next": "<http://localhost:8080/api/article/1001>", // 다음 article을 조회하는 URI
"comment": "<http://localhost:8080/api/article/comment>", // article의 댓글 달기
"save": "<http://localhost:8080/api/feed/article/1000>", // article을 내 피드로 저장
},
}
- API 버전을 명시하지 않아도 된다.
- 링크 정보를 동적으로 바꿀 수 있다.
- 링크를 통해서 상태 전이가 쉽게 가능하다.
위와 같은 방식으로 데이터를 담아 Client에게 보낸다면 Client는 해당 링크를 참조 하는 방식으로, JPA에서 객체 그래프 탐색을 하는 것 처럼 API 그래프 탐색이 가능해진다.
HAL
Hypertext Application Lanaguage 로 JSON, XML 코드 내의 외부 리소스에 대한 링크를 추가하기 위한 특별한 데이터 타입
- application/hal+json
- application/hal+xml
HAL 타입을 이용한다면 쉽게 HATEOAS를 달성할 수 있다.
- 리소스 : 일반적인 data 필드
- 링크 : 하이퍼미디어로 보통 _self 필드가 링크 필드
{
"data": { // HAL JSON의 리소스 필드
"id": 1000,
"name": "게시글 1",
"content": "HAL JSON을 이용한 예시 JSON"
},
"_links": { // HAL JSON의 링크 필드
"self": {
"href": "<http://localhost:8080/api/article/1000>" // 현재 api 주소
},
"profile": {
"href": "<http://localhost:8080/docs#query-article>" // 해당 api의 문서
},
"next": {
"href": "<http://localhost:8080/api/article/1001>" // article 의 다음 api 주소
},
"prev": {
"href": "<http://localhost:8080/api/article/999>" // article의 이전 api 주소
}
}
}
'BE > Java' 카테고리의 다른 글
JPQL ( Java Persistence Query Language ) - JPQL에 대해서 알아보자 (0) | 2023.07.23 |
---|---|
JPA (Java Persistence API) - JPA에 대해서 알아보자 (0) | 2023.07.23 |
DipsatcherServlet이란? (0) | 2023.07.21 |
Spring의 특징 (2) | 2023.06.11 |
Spring Boot의 기본개념을 이해하자 (0) | 2023.06.11 |