[F-Lab 모각코 챌린지 20일차] REST API와 GraphQL API

Nami·2023년 6월 20일
0

66일 포스팅 챌린지

목록 보기
20/66
멘토링 내용을 정리해보면서 채우지 못한 질문이 꽤 있었다. 몇 가지의 질문들을 복기하면서 생소했던 지식을 좀 더 깊게 공부해볼 생각이다.

GrpahQL & REST API

GraphQL과 REST는 인터넷을 통한 데이터 교환을 위한 API를 설계하는 두 가지 접근방식이다.

REST API

  • HTTP 메서드(GET, POST 등)를 사용하여 API를 구축하기 위한 아키텍처 스타일이다.
  • 일반적으로 URL을 사용하여 사용자가 요청한 주소를 식별하고 JSON 형태로 데이터를 반환한다.
  • 상태를 저장하고 있지 않는다. (비연결성)
  • 클라이언트에서 서버로의 각 요청을 보낼 때 필요한 모든 정보를 포함한다는 의미.

개발자들이 직면했던 몇 가지 문제

1. 고정 구조 데이터 교환

REST API는 클라이언트 요청이 고정된 구조를 따라야 리소스를 수신할 수 있다. 엄격한 구조는 사용하기 쉽지만 필요한 데이터를 정확히 교환하기에 무조건 효율적인 수단인 건 아니다.

2. 오버페칭 및 언더페칭

REST API는 항상 전체 데이터 세트를 반환한다. 예를 들어 REST API의 person 객체로부터는 그 사람의 이름, 생년월일, 주소 및 전화번호를 받게 된다. 전화번호만 있으면 이 모든 데이터를 얻을 수 있다.

또한 개인의 전화번호와 마지막 구매 내역을 알려면 여러 개의 REST API 요청이 필요하다. /person이라는 URL은 전화번호를 반환하고 /purchase라는 URL은 구매 내역을 반환한다.

소셜 미디어 개발자는 API 요청을 처리하기 위해 많은 양의 코드를 작성해야 했고, 이는 성능과 사용자 경험에 영향을 미쳤다.

SO ?

GraphQL이 쿼리 기반 솔루션으로 부상했다. 쿼리는 한 번의 API 요청 및 응답 교환에서만 정확한 데이터를 반환할 수 있다.

GraphQL

  • 페이스북이 개발한 API용 쿼리 언어
  • 클라이언트가 요청 시 모든 데이터를 수신하는 대신 서버에서 특정 데이터를 요청하고 해당 데이터만 수신할 수 있다 (장점)
  • 클라리언트 사이드에서 필요한 것을 정확히 지정할 수 있고 서버는 요청된 데이터만 포함하는 JSON 개체로 응답할 수 있다.
  • 보다 효율적인 데이터 송수신이 가능하게 만든다.

REST API는 HTTP 메서드를 사용하여 작업을 수행하는 API를 구축하기 위한 아키텍처 스타일인 반면, GraphQL은 클라이언트 사이드에서 필요한 데이터만 요청할 수 있는 API를 위한 쿼리 언어다.

유사점

GraphQL과 REST는 모두 클라이언트-서버 모델에서 서로 다른 서비스 또는 애플리케이션 간에 데이터를 교환할 수 있는 널리 사용되는 API 아키텍처 스타일이다.
프론트엔드 및 백엔드 팀은 이러한 API 아키텍처를 사용해 모듈식 애플리케이션 및 접근성이 뛰어난 애플리케이션을 만든다. API 아키텍처를 사용하면 시스템을 안전하고 모듈화되고 확장 가능한 상태로 유지할 수 있다. 또한 시스템의 성능이 향상되고 다른 시스템과의 통합이 더 쉬워진다.

1. 아키텍처

REST와 GraphQL 모두 몇 가지 일반적인 API 아키텍처 원칙을 구현한다. 공통적인 원칙으로는

  • 둘 다 상태를 저장하지 않으므로 서버가 요청 간에 응답 기록을 저장하지 않는다.
  • 둘 다 클라이언트-서버 모델을 사용하므로 단일 클라이언트에서 요청하면 단일 서버에서 응답한다.
  • 둘 다 기반 통신 프로토콜인 HTTP 기반으로 한다.

2. 리소스 기반 설계

REST와 GraphQL은 모두 리소스를 중심으로 데이터 교환을 설계한다. 리소스는 클라이언트가 API를 통해 엑세스하고 조작할 수 있는 모든 데이터 또는 객체를 말함. 각 리소스마다 고유할 식별자 URI)와 클라이언트가 해당 리소스에 대해 수행할 수 있는 작업세트(HTTP 메서드)가 있다.

3. 데이터 교환

REST와 GraphQL 모두 유사한 형식을 지원한다.
JSON은 모든 언어, 플랫폼 및 시스템이 인식하는 가장 널리 사용되는 데이터 교환 형식이다. 서버는 JSON 클라이언트에 반환한다. XML 및 HTML을 비롯한 다른 형식도 사용 가능하지만 일반적으론 사용하지 않는다.
둘다 캐싱을 지원해서 클라이언트와 서버는 자주 액세스하는 데이터를 캐싱하여 통신 속도를 높일 수 있다.

4. 언어 및 데이터베이스 중립성

GraphQL과 REST API 모두 클라이언트 측과 서버 측의 모든 데이터베이스 구조 및 프로그래밍 언어를 지원한다. 따라서 모든 애플리케이션과의 상호 운영성이 뛰어남.

주요 차이점

REST API는 애플리케이션 통신을 위한 아키텍처 개념이다. 반면 GraphQL은 사양, API 쿼리 언어 및 도구 세트이다. GraphQL은 HTTP를 사용해 단일 엔드포인트에서 작동한다.

클라이언트 측 요청

  1. REST 요청 작동에 사용되는 요소
  • 동작을 결정하는 HTTP 동사
  • HTTP 동사를 작동시킬 리소스를 식별하는 URL
  • 기존 서버 측 리소스 내에서 객체를 생성하거나 수정하려는 경우 구문 분석할 파라미터 및 값

리소스에서 읽기 전용 데이터를 가져오려면 GET을 사용하고, 새 리소스 항목을 추가하려면 POST를 사용하며, 리소스를 업데이트하려면 PUT을 사용

2.대조적으로 GraphQL 요청

  • 읽기 전용 데이터를 가져오기 위한 쿼리
  • 데이터 수정을 위한 변형
  • 이벤트 기반 또는 스트리밍 데이터 업데이트 수신을 위한 구독
    내부적으로 GraphQL은 모든 클라이언트 요청을 POST HTTP 요청으로 전송한다.

클라이언트에 반환되는 데이터

REST아키텍처에서는 서버가 지정한 전체 리소스 구조로, 서버에서 클라이언트로 데이터가 반환된다.
REST에서 반환되는 데이터의 예

REST에서 GET /posts는 다음을 반환한다.

[

  {

    "id": 1,

    "title": "First Post",

    "content": "This is the content of the first post."

  },

  {

    "id": 2,

    "title": "Second Post",

    "content": "This is the content of the second post."

  },

  {

    "id": 3,

    "title": "Third Post",

    "content": "This is the content of the third post."

  }

]

GraphQL에서 반환되는 데이터의 예
GraphQL을 사용할 경우 클라이언트가 제공한 구조에 지정된 데이터만 반환된다.

GET /graphql?query{post(id: 1) {id title content}}는 첫 번째 게시물만 반환한다.

{

  "data": {

    "posts": [

      {

        "id": "1",

        "title": "First Post",

        "content": "This is the content of the first post."

      },

]}}

GraphQL을 써야하는 경우

  • 원칙적으로 Multipart 방식의 전송이 허용되지 않기에 이미지, 영상 등의 처리에 굉장히 약한 모습이기에 비교적 간단한 정보를 송수신 하는 경우
  • 대역폭이 제한되어 있으며 요청 및 응답 수를 최소화하려는 경우
  • 여러 데이터 소스가 있고 이를 하나의 엔드포인트에서 결합하려는 경우
  • 고객 요청이 매우 다양하고 기대하는 응답도 크게 다른 경우

REST를 써야하는 경우

  • 모든 엔드포인트를 일일이 개발하고 여러 경우의 수를 대응해야 하기에 개발 속도가 상대적으로 느리기에 인증, 외부 서버와의 연동
  • 애플리케이션 규모가 작고 데이터가 덜 복잡한 경우
  • 모든 클라이언트에서 유사하게 사용되는 데이터와 작업이 있는 경우
  • 복잡한 데이터 쿼리가 필요 없는 경우

또한 다양한 기능 영역에 대해 GraphQL API와 REST API 모두 사용하여 단일 애플리케이션을 구축할 수도 있음.

RESTGraphQL
무엇인가요?REST는 클라이언트와 서버 간의 정형 데이터 교환을 정의하는 일련의 규칙GraphQL은 API를 생성하고 조작하기 위한 쿼리 언어, 아키텍처 스타일 및 도구 세트
가장 적합한 용도REST는 리소스가 잘 정의된 간단한 데이터 소스에 적합GraphQL은 크고 복잡하며 서로 연관된 데이터 소스에 적합
데이터 액세스REST에는 리소스를 정의하는 URL 형태의 여러 엔드포인트가 있음.GraphQL에는 단일 URL 엔드포인트가 있음.
반환된 데이터REST는 서버가 정의한 고정된 구조로 데이터를 반환GraphQL은 클라이언트가 정의한 유연한 구조로 데이터를 반환
데이터 구조 및 정의 방법REST 데이터는 형식이 약하게 지정됨. 따라서 클라이언트는 형식이 지정된 데이터를 반환할 때 해석하는 방법을 결정해야함.GraphQL 데이터는 엄격하게 형식이 지정됨. 따라서 클라이언트는 미리 결정되고 상호 이해되는 형식으로 데이터를 수신함.
오류 검사REST를 사용할 경우 반환된 데이터가 유효한지 클라이언트가 확인해야 함.GraphQL을 사용하면 잘못된 요청이 일반적으로 스키마 구조에 의해 거부됨. 그 결과 오류 메시지가 자동으로 생성

참조 ✅

0개의 댓글