본문 바로가기
SW Architecture/REST API

[restful api] restful api vs GraphQL 기초

by SIXXXX_ 2023. 1. 8.
728x90

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