[GraphQL] Schema, Query Type

Joah·2022년 11월 9일
0

GraphQL

목록 보기
5/9

지난 게시글에서 에러가 발생했다

🚫 Error: Apollo Server requires either an existing schema, modules or typeDefs

에러가 발생한 이유?

graphql은 data의 type을 미리 알고 있어야 하기 때문이다.
graphql server에게 서버에 있는 data의 type을 알려주어야 데이터를 찾을 수 있다.
이런 type은 graphql server를 시작하기 전에 미리 알려야 한다.
따라서 위와 같은 에러가 발생했다.


🛼 스키마 schema

위와 같은 에러 때문에 개발시 스키마를 우선 개발한다.
스키마란?
데이터 타입의 집합이다.
이를 미리 정의해두면 스키마 정의는 API 문서같은 역할을 하며 프론트, 백엔드 개발자의 의사소통에 대한 비용을 줄이고 빠른 개발을 할 수 있다는 장점이 있다.

GraphQL API를 설계하기 전에 항상 사용할 스키마를 먼저 정의해야 한다.
GraphQL 쿼리의 형태는 리턴되는 값과 거의 일치한다.

어떤 필드를 선택할지 어떤 종류의 객체를 반환할지를 알기 위해서는 스키마를 통해서 알 수 있다.

따라서 GraphQL에게 스키마를 통해서 어떤 데이터를 가져올지 먼저 말해줘야한다.(스키마 덕분에 자동완성도 가능하다)
참고문서



🌈 스키마 작성법

GraphQL에게 어떤 데이터가 있는지 알려주기 위해, 위의 에러를 해결하기 위해 스키마를 먼저 작성하자

const typeDefs = gql``
  • 해당 백틱 안에 GraphQL Schema Definition Language(SDL)를 작성한다.

  • 데이터의 모양 즉, 타입을 알려줄 것이다.


🙏🏼 type Query (필수작성!! mandatory!!!)

만약 type Query를 작성하지 않으면 꼭 작성하라고 Error를 뱉는다.

import { ApolloServer, gql } from "apollo-server";

const typeDefs = gql`
  type Films {
    title: String
  }
`;

const server = new ApolloServer({ typeDefs });

server.listen().then(({ url }) => {
  console.log(`running on ${url}`);
});

🚫 Error: Query root type must be provided.

에러를 해결하기 위해서는 type Query를 반드시 작성해야 한다.

import { ApolloServer, gql } from "apollo-server";

const typeDefs = gql`
  type Query {
    text: String
  }
`;

const server = new ApolloServer({ typeDefs });

server.listen().then(({ url }) => {
  console.log(`running on ${url}`);
});


🏝 type Query의 역할

REST API의 관점으로 설명하면

GET /title
GET /age
GET /allFilms

const typeDefs = gql`
  type Query {
    title: String
	age : String
	allFilms: String
  }
`;
  • Query type을 지정하면 REST API에서 GET request URL을 노출시키는 것과 동일하다.

Star Wars GraphQL API에서도 마찬가지로 서버를 제공하는 사람이 allFilms, allPeople 등의 데이터를 Query type으로 이미 작성했기 때문에 데이터를 가지고 올 수 있었던 것이다.

Query type에 적힌 모든 것들은 GET URL을 만드는 것과 동일하다.

정리

사용자가 request 할 수 있도록 하고 싶은 것은 모두 Query type에 작성되어야 한다.

profile
Front-end Developer

0개의 댓글