개발 공부/백엔드

Django Rest Framework vs. GraphQL (chat GPT 검색)

yunnaa 2023. 5. 30. 16:05

백엔드 공부 시작에 있어서 노마드코더의 '에어비앤비 클론코딩'을 수강하고 있다.

AI 분야에 있으면서 python을 주로 사용했기 때문에 Django 프레임워크를 사용하는 강의를 선택했다.

 

Django Rest Framework(DRF)로 열심히.. 여러가지 Rest API를 만들어보았더니.. API를 만드는 또 다른 방법인 GraphQL에 대해 설명한다고 한다..

즉, 장고에서는 DRF로 RESTful API를 만들고 Graphene으로 GraphQL API를 만드는 방법이 있는 것 같다.

 

이제 막 DRF를  마친 나에게 새로운 프레임워크를 배우는 것은 무리라고 생각되었고!  그럼에도 대략적인 특징은 알고 넘어가기 위해 Chat GPT에 검색해 보았다ㅎ 

- 다음 Chat GPT의 답변이 정답인 것은 아니기에 추후 직접 검색해보며 더 공부해보기로 하자!

 



1. 데이터 요청 방식:
   - DRF: RESTful API는 URL 기반의 엔드포인트를 사용하여 데이터를 요청합니다. 각 엔드포인트는 HTTP 동사(GET, POST, PUT, DELETE 등)와 연결되어 해당 동작을 수행합니다.
   - GraphQL: GraphQL은 단일 엔드포인트를 사용하여 데이터를 요청합니다. 클라이언트는 필요한 데이터를 GraphQL 쿼리로 지정하고, 서버는 해당 쿼리를 해석하여 필요한 데이터만 반환합니다.

* 엔드포인트(Endpoint) : RESTful API에서 특정 리소스에 접근하기 위한 URL 경로.

* 단일 엔드포인트(Single Endpoint) : 

더보기

"GraphQL은 단일 엔드포인트(Single Endpoint)를 사용하여 데이터를 요청하는 API 디자인 패턴입니다. 기존의 RESTful API에서는 여러 개의 엔드포인트를 사용하여 각각의 리소스에 대한 데이터를 요청했습니다. 예를 들어, 사용자 정보를 가져오기 위해서는 `/users` 엔드포인트를 사용하고, 게시물 목록을 가져오기 위해서는 `/posts` 엔드포인트를 사용하는 식으로 각각의 리소스에 대한 엔드포인트를 따로 정의해야 했습니다.

그러나 GraphQL은 단일 엔드포인트를 사용하여 모든 데이터 요청을 처리합니다. 클라이언트는 단일 엔드포인트에 GraphQL 쿼리를 보내고, 서버는 해당 쿼리를 해석하여 클라이언트가 필요로 하는 데이터만을 반환합니다. 이는 RESTful API에서 발생할 수 있는 Over-fetching과 Under-fetching 문제를 해결하고, 클라이언트가 필요로 하는 데이터를 정확하게 요청할 수 있도록 합니다.

GraphQL의 단일 엔드포인트는 일반적으로 `/graphql`과 같은 경로를 가집니다. 클라이언트는 HTTP POST 요청을 통해 GraphQL 쿼리를 전송하고, 서버는 해당 요청을 처리하여 응답을 반환합니다. 쿼리는 클라이언트가 필요로 하는 필드와 관계를 명시적으로 지정하여 원하는 데이터를 요청할 수 있습니다. 서버는 쿼리를 해석하여 필요한 데이터를 한 번에 반환하므로, 여러 번의 요청을 보내지 않고도 필요한 데이터를 효율적으로 가져올 수 있습니다.

단일 엔드포인트를 사용하는 GraphQL은 클라이언트와 서버 간의 통신을 단순화시키고, 유연성과 효율성을 제공하여 개발자가 필요한 데이터를 정확하게 제어할 수 있도록 합니다."

 

2. 데이터 응답 형식:
   - DRF: RESTful API는 JSON, XML, HTML 등 다양한 형식의 데이터를 응답으로 반환할 수 있습니다. 클라이언트는 Accept 헤더를 사용하여 선호하는 형식을 지정할 수 있습니다.
   - GraphQL: GraphQL은 항상 JSON 형식으로 데이터를 응답합니다. 클라이언트는 요청 시 필요한 필드와 관계를 지정할 수 있으므로, 불필요한 데이터를 받을 일이 줄어듭니다.

3. 데이터 요청의 유연성:
   - DRF: RESTful API는 서버 측에서 미리 정의된 엔드포인트를 통해 데이터를 요청하므로, 클라이언트는 제한된 선택지를 가지게 됩니다. 각 엔드포인트는 서버에서 사전에 작성되어야 합니다.
   - GraphQL: GraphQL은 클라이언트가 요청 시 필요한 데이터를 지정할 수 있으므로, 클라이언트는 원하는 데이터를 정확하게 가져올 수 있습니다. 서버는 클라이언트가 요청한 필드와 관계를 해석하여 응답합니다.

4. Over-fetching과 Under-fetching:
   - DRF: RESTful API는 클라이언트가 필요로 하는 데이터보다 더 많은 데이터를 가져올 수 있는 경우 Over-fetching 문제가 발생할 수 있습니다. 또한, 여러 요청을 보내야하는 경우 Under-fetching 문제가 발생할 수 있습니다.
   - GraphQL: GraphQL은 클라이언트가 필요로 하는 데이터를 정확하게 요청하수 있으므로 Over-fetching과 Under-fetching 문제를 해결합니다. 클라이언트는 단일 요청으로 필요한 데이터를 지정할 수 있으므로, 필요한 데이터만 효율적으로 가져올 수 있습니다.

* Over-fetching과 Under-fetching :

더보기

Over-fetching과 Under-fetching은 API 디자인과 사용 패턴에서 발생할 수 있는 문제입니다.

1. Over-fetching:
   Over-fetching은 클라이언트가 필요로 하는 데이터보다 더 많은 데이터를 가져오는 상황을 말합니다. RESTful API에서는 주로 사전에 정의된 엔드포인트를 통해 데이터를 요청하므로, 클라이언트가 특정 엔드포인트를 요청하면 해당 엔드포인트에 정의된 데이터 외에도 불필요한 데이터가 함께 반환될 수 있습니다. 이로 인해 네트워크 대역폭과 서버 리소스가 낭비되는 문제가 발생할 수 있습니다.
예를 들어, 사용자 목록을 요청하는 API가 있을 때, 해당 API가 사용자의 이름, 이메일, 주소 등 모든 필드를 반환한다면, 클라이언트가 이름만 필요로 할 경우에도 불필요한 이메일과 주소 정보까지 받아오게 됩니다.

2. Under-fetching:
   Under-fetching은 클라이언트가 필요로 하는 데이터를 가져오기 위해 여러 번의 요청을 보내야 하는 상황을 말합니다. RESTful API에서는 한 번의 요청에 해당하는 데이터만을 가져올 수 있기 때문에, 클라이언트가 필요로 하는 데이터를 모두 가져오기 위해 여러 번의 요청을 보내야 할 수 있습니다. 이로 인해 클라이언트와 서버 간의 추가적인 라운드트립이 필요하며, 응답 시간이 지연되고 효율성이 저하될 수 있습니다.
예를 들어, 사용자 목록을 요청하는 API가 있을 때, 해당 API는 사용자 정보만을 반환하고 사용자가 작성한 게시물 목록을 따로 요청해야 한다면, 클라이언트는 두 번의 요청을 보내야 합니다. 이 경우에는 클라이언트가 사용자와 관련된 정보를 얻기 위해 여러 번의 요청을 보내야 하므로 효율성이 떨어집니다.

GraphQL은 Over-fetching과 Under-fetching 문제를 해결하기 위해 클라이언트가 필요한 데이터를 정확하게 지정할 수 있도록 합니다. 클라이언트는 요청 시 필요한 필드와 관계를 명시적으로 지정하고, 서버는 해당 요청을 해석하여 필요한 데이터만을 반환합니다. 이를 통해 필요한 데이터만을 효율적으로 가져올 수 있습니다.

 

5. 관계와 네스팅:
   - DRF: RESTful API에서는 관계가 표현되는 방식으로 URL을 사용합니다. 예를 들어, `/users/1/posts/`는 사용자의 ID가 1인 게시물을 나타냅니다. 네스팅된 URL 패턴을 사용하여 관계를 표현할 수 있습니다.
   - GraphQL: GraphQL은 관계를 자연스럽게 표현할 수 있습니다. 클라이언트는 요청 시 필요한 관계를 명시적으로 지정할 수 있으며, 서버는 해당 관계를 해석하여 필요한 데이터를 반환합니다.

6. 생태계와 도구 지원:
   - DRF: Django와 DRF는 장고 커뮤니티에서 지원되며, 다양한 확장성과 생태계를 가지고 있습니다. 다양한 기능을 제공하는 다른 장고 패키지와 통합하기 쉽습니다.
   - GraphQL: GraphQL은 장고와 함께 사용할 수 있지만, 생태계가 DRF보다는 작고 다양성이 상대적으로 낮을 수 있습니다. 그러나 Apollo, Relay 등의 클라이언트 측 도구와 함께 사용하면 강력한 개발 경험을 제공합니다.

요약하면, DRF는 RESTful API를 구축하기 위한 장고의 확장 모듈로써, URL 기반의 엔드포인트를 통해 데이터를 요청하고 다양한 데이터 형식을 지원합니다. 반면에 GraphQL은 단일 엔드포인트를 사용하며 클라이언트가 필요한 데이터를 정확하게 지정하여 가져올 수 있습니다. 

GraphQL은 Over-fetching과 Under-fetching 문제를 해결하고 관계를 표현하기에 유연하며 생태계는 상대적으로 작지만 클라이언트 측 도구와 함께 강력한 개발 경험을 제공합니다. 선택은 프로젝트 요구사항과 개발자 선호도에 따라 달라집니다.

 

 

다음은 GraphQL API를 사용하는 몇 가지 대표적인 애플리케이션입니다.

더보기

* 다음은 GraphQL API를 사용하는 몇 가지 대표적인 애플리케이션입니다.

1. Facebook: GraphQL은 Facebook에서 개발되었으며, Facebook의 주요 API에서 사용되고 있습니다. Facebook의 GraphQL API는 실시간 업데이트, 데이터 검색 및 작성 기능 등을 제공하여 Facebook 애플리케이션의 데이터 요구사항을 처리합니다.

2. GitHub: GitHub은 소스 코드 관리와 협업을 위한 플랫폼으로, GraphQL API를 사용하여 사용자, 리포지토리, 이슈, 풀 리퀘스트 등 다양한 데이터에 접근할 수 있습니다. GraphQL을 통해 개발자는 필요한 데이터를 정확하게 요청하고 응답을 받아올 수 있습니다.

3. Shopify: Shopify는 전자 상거래 플랫폼으로, GraphQL을 사용하여 상점 관리, 제품 목록, 주문 처리, 장바구니 등의 기능을 제공합니다. GraphQL을 통해 개발자는 다양한 상점 데이터를 효율적으로 가져올 수 있으며, 클라이언트 측 애플리케이션에서 필요한 데이터를 자유롭게 구성할 수 있습니다.

4. Twitter: Twitter API는 GraphQL을 지원하여 트윗, 사용자 프로필, 트렌드 등의 데이터에 접근할 수 있습니다. GraphQL을 통해 Twitter API를 사용하는 개발자는 트위터 데이터를 유연하게 요청하고 응답을 받아올 수 있습니다.

5. Pinterest: Pinterest는 이미지 기반의 소셜 미디어 플랫폼으로, GraphQL을 사용하여 사용자 핀, 보드, 검색 결과 등 다양한 데이터를 가져올 수 있습니다. GraphQL을 통해 필요한 이미지 및 관련 데이터를 효율적으로 요청할 수 있습니다.

위의 애플리케이션은 GraphQL API를 사용하여 데이터 요청과 응답을 처리하며, GraphQL의 유연성과 효율성을 활용하고 있습니다. 하지만 GraphQL은 널리 사용되는 기술이기 때문에 다양한 기업과 애플리케이션에서 활용되고 있습니다.