Restful API
Q . 우리가 흔히 쓰는 Rest API 는 진짜일까 ?
A : Rest API 가 아니지만 Rest API 라고 부른다.
https://deview.kr/2017/schedule/212
그런 REST API로 괜찮은가
발표자 : 이응준
deview.kr
why ?
self-descriptive와 HATEOAS를 만족하지 않기 때문에.
- Self-descriptive : 메세지를 그 메세지만 보고 뜻을 알 수 있어야 한다.
- HATEOAS : 애플리케이션 상태는 Hyperlink를 이용해서 전이가 되어야 한다.
해결방법
- self-descriptive : custom media type, profie link relation등으로 만족시키기
- HATEOAS : HTTP 헤더나 본문에 링크를 담아 만족시키기
커뮤니케이션을 기계 - 기계가 한다.
그래서 이를 media type으로 해결하려고 하는데,
media type : JSON Self-descriptive : 불완전, 온전한 해석이 불가능하다
1. media type 을 하나 정의하고 문서를 작성한다.
2. id와 title의 의미를 정의한다.
3. IANA에 미디어 타입을 등록한다, 문서를 미디어 타입의 명세로 등록한다.
문제 >> 매번 media type을 정의해야하는 귀찮음
Profile
1. id, title에 대한 정확한 명세를 정의하고
2. Link 헤더에 profile relation으로 해당 명세를 링크한다.
3. 이제 메세지를 보는 사람은 명세를 찾아갈 수 있으므로 이 문서의 의미를 온전히 해석할 수 있다.
문제 >> 클라이언트가 Link 헤더와 profile 을 이해해야 한다.
HATEOAS
data로 처리, 하이퍼링크를 표현한다.
링크를 표현하는 방법을 직접 정의해야 한다.
>> HTTPS 헤더를 사용해서
ex ) 영화 api
no vebr
1. 컬렉션 : 복수
2. DB에서 고유 식별자
HTTP Request methods를 활용해서 인터랙션한다.
GET /movies : 모든 영화를 불러온다.
POST /movies : movie를 생성한다.
DELETE, UPDATE(PUT) : /movies/고유식별자
query parameter를 사용해서 특정요청을 한다.
/movies?min_rating=9.8
/movies?release_date=2021
pagination 추가 가능
/movies?page=5
GraphQL (spec, specification)
하나의 아이디어이고
GraphQL : body로 원하는 정보를 다 명시해주면 원하는 명시되어 보여진다.
1. overfetching
기존의 restapi가 많은 data를 받는 over-fetching을 갖고 있어서 이를 해결하기 위해 존재
>> 요청한 것에 대한 data만 받는 것
2.underfetching
우리가 필요한 것보다 덜 받는 것. 기존의 restapi는 2-3개 정도의 request를 받아야 한다. 이는 한 화면을 위해 두개의 request를 받는 것, 그 중에 실패가 있을 수 있다는 것, 여러 개의 url에서 로딩이 필요하다.
>> 하나의 single request 만 요청하는 것
mutation { } : 데이터베이스에 수정
(도메인)/graphql POST
POST-DELETE
결론 : 요청복잡도는 GraphQL, 응답복잡도는 Rest API가 높다
둘다 제공해도 된다.
GraphQL ex) node.js + Express
모듈사용
app = express();
schema - resolver 반환해주면 된다.
input 으로 함수 지정
mutation으로 함수를 지정해서 데이터를 조작한다.
Reference
- https://tech.kakao.com/2019/08/01/graphql-basic/
- https://www.youtube.com/watch?v=EkWI6Ru8lFQ (얄코 graphql 설명)
- https://www.youtube.com/watch?v=N-81mS2vldI (노마드코더 graphql, restful api 설명)
- https://www.youtube.com/watch?v=9BIXcXHsj0A&t=870s (얄코 graphql + Apollo 강좌)
- 구글 "restful api design guidelines" (https://wayhome25.github.io/etc/2017/11/26/restful-api-designing-guidelines/)
- https://learn.microsoft.com/en-us/azure/architecture/best-practices/api-design