[GrapQL] Non nullable Fields

Joah·2022년 11월 14일
0

GraphQL

목록 보기
8/9

🛼 exclamation mark!

코드에 느낌표를 붙였더니 studio에서 error를 반환한다.

const typeDefs = gql`
  type User {
    id: ID!
    username: String!
  }
  type Feed {
    id: ID!
    text: String!
    creator: User!
  }
  type Query {
    allFeeds: [Feed]!
    feed(id: ID): Feed
  }
  type Mutation {
    postFeed(text: String, userId: ID): Feed!
    deleteFeed(id: ID): Boolean!
  }
`;

이제 Feed field를 제외하고 모든 type에 느낌표를 붙이고 Feed를 받아오자! 어떤 일이 생길까?

const typeDefs = gql`
  type User {
    id: ID!
    username: String!
  }
  type Feed {
    id: ID!
    text: String!
    creator: User!
  }
  type Query {
    allFeeds: [Feed]!
    feed(id: ID): Feed
  }
  type Mutation {
    postFeed(text: String, userId: ID): Feed!
    deleteFeed(id: ID): Boolean!
  }
`;

느낌표를 붙이지 않은 Feed에 대한 데이터 응답은 정상적으로 출력되는 것을 볼 수 있다.

왜 느낌표를 붙이지 않았더니 에러가 나타나지 않았을까?

feed(id: ID): Feed는 느낌표가 없는 한 nullable field이다.

🏝 Nullable Field

nullable field라는 뜻은 null값을 가질 수도 있는 field를 말한다.
GraphQL에서 데이터의 타입을 지정할 때 모든 데이터의 뒤에는 |null이 붙게 된다.

const typeDefs = gql`
  type User {
    id: ID!
    username: String | null
  }
  type Feed {
    id: ID!
    text: String | null
    creator: User | null
  }
  type Query {
    allFeeds: [Feed]!
    feed(id: ID): Feed | null
  }
  type Mutation {
    postFeed(text: String, userId: ID): Feed!
    deleteFeed(id: ID): Boolean| null
  }
`;

Boolean만 작성해도
graphql은 이 query는 Boolean 또는 null을 주는 군!이라고 이해한다.
이것이 default 값이고 nullable field라고 불린다.
따라서 그 어떤 error도 없이 null을 반환하고 있는 것이다.

모든 필드는 기본적으로 nullable 하기 때문에 graphql은 error없이 null 반환


🏝 그럼 느낌표의 역할은 뭘까?!!

  1. 느낌표를 붙이는 field는 반드시 보내야 하는 field이다.
const typeDefs = gql`
  type User {
    id: ID!
    username: String
  }
  type Feed {
    id: ID!
    text: String!
    creator: User!
  }
  type Query {
    allFeeds: [Feed]!
    feed(id: ID!): Feed
  }
  type Mutation {
    postFeed(text: String, userId: ID): Feed!
    deleteFeed(id: ID): Boolean!
  }
`;
  • User field의 id에 느낌표가 붙었다는 뜻은 무조건 id를 보내야 한다는 뜻이다.

  • type Query에 feed(id: ID!):Feed라고 작성하면 무조건 id를 보내야 한다는 뜻이다.

만약 id를 보내지 않았다면?


빨간 밑줄이 뜨면서 error를 반환한다.
따라서 id를 지정해주면?


2. null이 아닌 특정 데이터를 반드시 리턴할 것이라는 확신이 있다는 뜻일 때

위의 예시처럼 느낌표를 작성하면 반드시 보내야하는 데이터를 지정해야 한다.
따라서 모든 field에 느낌표를 붙였다는 것은 모든 데이터는 null값이 아니라 무조건 특정 값을 가지고 있다는 확신이다.

  type User {
    id: ID!
    username: String!
    firstname: String!
  }
  • 모든 User는 무조건 ID를 가지고 있으며

  • 모든 User는 무조건 username을 가지고 있으며

  • 모든 User는 무조건 firstname을 가지고 있다.

만약 firstname에 느낌표를 붙이지 않는다면?

  type User {
    id: ID!
    username: String!
    firstname: String
  }
  • 모든 User는 무조건 ID를 가지고 있으며

  • 모든 User는 무조건 username을 가지고 있으며

  • 모든 User는 firstname이 string일 수도 있고 null일 수도 있다.


다른 예시를 들어서,

  type Mutation {
    postFeed(text: String!, userId: ID!): Feed!
    deleteFeed(id: ID!): Boolean!
  }
  • feed를 post하게 되면 무조건 text가 있어야 하며, 그 text는 무조건 string이어야 한다.

  • 또한 무조건 userId가 있어야 하며, 항상 Feed를 반환한다.

  • feed를 delete하고 싶다면 무조건 id를 보내야 하며, 항상 true or false를 반환한다.

  type Query {
    allFeeds: [Feed!]!
  }
  • 위의 query는 allFeeds가 항상 배열을 반환하고 그 배열 안에는 항상 feed가 들어 있다.
  type Query {
    allFeeds: [Feed]!
  }
  • 위의 query는 allFeeds가 항상 배열을 반환하지만 그 배열안에 feed가 들어올 수도 있고 null이 들어올 수도 있다.

이것은 graphql과 소통하는 방법이고 graphql에게 어떤 정보가 require이고 아닌지를 명시해줄 수 있다.

만약 user가 lastname을 필수로 주지 않아도 된다면

  type User {
    id: ID!
    username: String!
    firstname: String!
    lastname: String
  }
  • 위와 같이 작성하여 lastname은 String일 수도 있고 null일 수도 있다.

nullable한 데이터가 아니라고 느낌표를 붙였는데 API가 null를 return 한다면

에러가 발생한다. 이미 graphql에게 !를 부여함으로 해당 데이터는 null이 아니라고 말해줬는데 API가 null를 주었다는 것은 ERROR이다.

why?
아직 post한 feed가 없기 때문에 feed를 요소로 가진 배열을 가져오는 것은 없는 값을 가져오는 것이다. 따라서 결과는 null인데 느낌표를 작성하여 nullable하지 않게 지정했기 때문에

"Cannot return null for non-nullable field Query.allFeeds"
라는 에러를 뱉는 것이다.



🏝 Wrap Up

grapql에서 느낌표 사용에는 2가지 이유가 있다.

  1. 반드시 보내야할 데이터
  2. nullable 하지 않은 데이터를 확신하기 위해서
profile
Front-end Developer

0개의 댓글