[node.js] GraphQL vs RESTAPI(overfetching / underfetching)

Hyo Kyun Lee·2021년 8월 1일
0

node.js

목록 보기
32/34

1-1. RESTAPI

요청한 엔드포인트를 응답할 때 활용하는 명령어로,
엔드포인트로부터 data를 얻기위해 필요한 호출함수 및 언어이다.

client와 server간 data 및 웹페이지(template)을 송수신하는 과정의 핵심은, 엔드포인트에서 data를 확보하는 시점이다.

우리(=client)가 request한 요청에 따라 server는 response를 하고, 이에 대한 data 및 template(웹페이지)를 우리에게 response 한다.

이 과정을 server나 관리자 관점에서 본다면, 특정 user가 작성한 게시글 및 follower 등 사용자에 대한 세부적인 정보들을 동일한 원리로 얻을 수 있을 것으로 생각할 수 있다.

이처럼 Server측에서 가지고 있는 data나 여러 template을, 엔드포인트(data를 보유하고 있는 지점, uri)로부터 요청하고 이를 확보하기위해 호출하고 이용하는 명령어를 RESTAPI라 한다.

1-2. RESTAPI의 문제점

위 그림처럼 최종적으로 특정 user의 follower 정보를 확보해야한다고 생각해보자.

RESTAPI를 이용해 우리가 원하는 follower 정보를 얻기 위해선,

  • 먼저 특정 user에 대한 전체 정보가 있는 엔드포인트를 요청한다(RESTAPI ①)
  • 이후 user id(key)값을 알아낸다(RESTAPI ①에서 확보)
  • 알아낸 id를 통해 다시 user follower 정보가 있는 엔드포인트를 요청한다(RESTAPI ②)
  • follower 정보가 있는 엔드포인트에서 follower 정보를 얻는다(RESTAPI ③)

위와 같이 단계적인 엔드포인트 시점을 알아야 하고, 각 엔드포인트로부터 RESTAPI를 호출하여 원하는 정보를 얻어야만 최종적인 follower 정보를 얻을 수가 있다.

overfetching

이때 우리는 follower 정보를 얻기위해 사용자 전체정보와 id 값 등 불필요한 정보까지 모두 확보가 필요하였다.

한 정보를 얻기위해 불필요한 정보까지 얻어야하는 번거로움을 overfetching이라 하고, 이는 RESTAPI의 가장 큰 문제점 중 하나이다.

underfetching

또한 이를 다른 관점으로 볼 수 있다.

follower 정보를 얻기 위해 RESTAPI를 통해 직접적으로 정보를 얻고자 하면 해당 user id를 모른 상태로 정보를 얻게 되거나, 다른 엔드포인트의 follower 정보를 얻을 수 있는 불확실성이 존재한다.

이처럼 RESTAPI를 통해 필요한 정보가 아닌, 다른 정보나 부족한 정보를 얻게 되는 이슈를 underfetching이라 하며 이 역시 RESTAPI의 문제점 중 하나이다.

버전관리 및 유지보수의 번거로움

추가적으로, RESTAPI를 사용할 경우 API버전별 관리가 필요하게 된다.

버전별로 API를 관리하게 된다면, 버전에 맞춘 엔드포인트가 별도로 생성되어야 하며 실무적으로 백엔드/프론트엔드간 협의가 반복적으로 이루어져야 하는 번거로움이 생긴다.

이를 통해 RESTAPI를 사용시 data 무결성 및 유지관리에 매우 힘들 수 있음을 알 수 있다.

2-1. GraphQL(Graph-data Query Language)

GraphQL은 URL 개념이 존재하지 않는다.

비선형 자료구조인 Graph처럼 data가 무수히 많은 연관관계를 지닌 상태에서,
Query Language를 통해 원하는 data만 선별적으로 확보할 수 있는 체계(명령어).

GraphQL은 RESTAPI가 가지는 치명적인 단점인 "여러 개의 엔드포인트"를 "단일 엔드포인트화"하여, 한 번의 엔드포인트 접근으로 원하는 data를 얻을 수 있도록 한다.

GraphQL은 모든 data가 graph처럼 연결관계를 지닌 것으로 생각한다.

client나 서버관리자는 자신이 원하는 data를 얻기 위해, 여러 엔드포인트를 단계적으로 거치는 것이 아닌 user 정보가 있는 하나의 엔드포인트로만 접근한다.

그 후 Query language를 통해, user id와 followers key값에 접근하여 원하는 followers 정보만 선별하여 확보할 수 있다.

GraphQL은 이처럼 data무결성 및 유지보수가 RESTAPI에 비해 우수하고, server 운영면에서 월등히 간결하고 쉽다.

2-2. GraphQL Query 예시

※한 엔드포인트의 특정 data를 얻기위해 전달하는 Query

한 유저의 feed정보(댓글, 좋아요 수)와 기본정보(조회수)를 DB에 요청하는 Query

query {
  feed {
    comment,
    likeNumbers,
  }
  notifications{
    isRead
  }
}

※ Query를 받아 Database에서 Javascript 문법을 통해 출력하는 예시

DB가 feed정보와 기본정보를 javascript를 통해 전달해주는 구조

{
  feed : [
    {
      comments : 1,
      likeNumbers : 3
    }
  ]
    
    notifications : [
    	{
    		isRead : 2
    	}
    ]
}

3. 참조자료 및 링크

fastcampus 강의자료 발췌(GraphQL과 RESTAPI의 차이점)

https://velog.io/@gyrbs22/node.js-node.js%EB%A5%BC-%ED%86%B5%ED%95%9C-TDD%EA%B8%B0%EB%B0%98-API-%EC%84%9C%EB%B2%84%EA%B0%9C%EB%B0%9C

0개의 댓글