Non-Nullable field
Non-Nullable이란 해석 그대로 null 값이 나올 수 없다.
tweet(id: ID): Tweet
예를 들어보자.
여기서 Tweet은 nullable field이다. null이 될 수 있는 fileld로 graphql은 '아~ 이 쿼리는 Tweet(type)이나 null값을 주는군' 라고 생각한다. 디폴트로 모든 값은 null이 될 수 있기 때문이다.
tweet(id: ID): Tweet|null
그래서 이렇게 코드를 작성해도 위의 코드와 똑같이 작동한다.
tweet(id: ID!): Tweet
id를 필수로 만들고 싶다면 ID 뒤에 !를 붙이면 된다.
tweet 쿼리를 쓰고 싶다면 ID를 무조건 보내야 한다는 뜻이다.
tweet(id: ID!): Tweet!
Tweet 뒤에 !를 붙여, 이 쿼리는 항상 하나의 tweet을 return하게 해준다.
절대로 null을 return하지 않겠다고 확실히 하는 것이다.
이것이 GraphQL과 소통하는 방법이다. !로 인해 GraphQL은 무엇이 필수요소인지 구별할 수 있게 되는 것이다.
복습
type Query {
allTweets: [Tweet]
tweet(id: ID!): Tweet
}
GraphQL 서버에서 type Query는 가장 기본적인 (필수적인) type이다. type Query 안에 있는 것들은 사용자가 요청할 수 있는 것들이다. 즉, allTweets는 사용자가 나의 GraphQL API에 all tweets 요청을 보낼 수 있다는 뜻이다.
코드를 작성할 때 Boolean type, ID type, String type, integer type 등으로는 충분하지 않다.
왜냐하면 데이터가 string, ID, boolean, int보다 복잡하기 때문이다. 그리하여 우리만의 type을 만드는 것이다.
type Tweet {
id: ID
text: String
author: User
}
이렇게 우리만의 Tweet이라는 type을 만들어 graphql에게 type 형태를 설명해준다. (내 Tweet이라는 타입에에서 id는 ID이고 text는 sting이고~...)
type을 만든다는 것은 ID, int, string 등만을 사용할 때 보다 더 많은 것을 할 수 있게 한다. 왜냐하면
type Query {
allTweets: [Tweet]
이렇게 만든 type을 또 다른 type과 연결하며 간편하게 사용할 수 있기 때문이다.
type Mutation {
postTweet(text: String, userId: ID): Tweet
deleteTweet(id:ID): Boolean
}
Mutation은 API와 소통할 수 있게 해준다.
Mutation에 있는 동작들은 데이터베이스에 영향을 미치기도 하고 서버의 상태를 변형시키기도 한다.
POST, DELETE 요청 혹은 리소스 업데이트를 위한 PUT 요청이 될 수 있다.
즉, POST, DELETE 등의 요청은 모두 Mutation type에 있어야 한다.
type User {
id: ID
username: String!
firstName: String!
lastName: String!
!를 쓰지 않는다면 기본적으로 nullable field가 된다.
즉, graphql이 ID 혹은 null이 될 수 있다고 생각할 것이다. 사용자가 id로 null값을 가지고 있더라도 문제가 없다고 생각하는 것이다.(id가 null값이라면 문제가 있는 것)
!를 삽입하여 graphql에게 이 field들은 null값이 있어선 안된다는 것을 알려주는 것이다.
만약 이 field들이 null이라면 에러가 뜰 것이다. 그리하여, 무엇이 필수요소(required)이고 아닌지 구체화할 수 있는 것이다.
allTweets: [Tweet]!
이 뜻은 allTweets가 항상 list를 준다는 것을 의미한다. null이 되어선 안되고 list여야만 한다.
allTweets: [Tweet!]!
이 뜻은 항상 list가 되어야 한다는 것이고, list는 항상 Tweet이라는 것이다. (null이 되어선 안된다)
만약 데이터베이스에 Tweet이 없을 때는 에러가 뜨지 않는다. 비어있는 것은 null이 아니고 그저 비어있는 것이기 때문이다.
allTweets field가 항상 Tweet을 가지고 있어야 한다는 것은 아니다. 하지만, list 안에 null이 있어선 안된다.
tweet(id: ID!): Tweet
하나의 트윗을 보고싶다면 id를 보내야 한다는 뜻이다.
하지만, 원하는 트윗을 찾지 못할 수 있다 (id가 존재하지 않거나 트윗이 삭제될 수 있으니까)
그런 의미에서 Tweet은 nullable이다.
'클론코딩' 카테고리의 다른 글
Tweet API 클론코딩5 (1) | 2022.06.12 |
---|---|
Tweet API 클론코딩 4 (0) | 2022.06.11 |
Tweet API 클론코딩 2 (0) | 2022.06.09 |
Tweet API 클론코딩 1 (0) | 2022.06.08 |