GraphQL query 다루기
GraphQL은 클라이언트가 요청한 query를 읽어 데이터를 반환하는 역할을 한다. GraphQL이나 SQL과 같은 Query Language는 다양한 요청을 처리할 수 있어야 하므로 다양한 제약과 옵션이 들어간다. 예를 들어 SQL에서는 group by 를 사용하기 위해서는 group 별로 하나의 데이터를 반환할 수 있는 SUM 과 같은 연산을 더하도록 강제하며, ORDER BY 문을 통해 데이터를 정렬할 수 있도록 한다. GraphQL도 SQL과 같은 Query Language 이므로 다양한 제약을 강제하고 옵션을 제공한다.
이번글에서는 GraphQL이 단일 데이터를 출력하기 위해 강제하는 제약에 대해 알아볼 것이다.
* 아래 링크에서 예시 코드를 실행시켜 볼 수 있다.
단일 데이터를 반환하는 query의 제약
우리가 GraphQL을 쓸 때 단일 데이터를 반환하도록 사용하는 경우가 많다. 예를 들어 영화 목록에서 특정 영화만을 출력한다던지, 저장소 목록에서 하나만을 리턴한다던지 하는 경우이다. 다중 데이터를 반환하는 쿼리는 식별자를 지정하지 않아도 되지만, 단일 데이터를 반환하는 query에서 단일 데이터를 반환하는 요청은 식별자를 지정해야 한다.
예를 들어 아래와 같이 모든 영화 목록을 출력하는 쿼리에서는 특정한 식별자를 지정하지 않아도 된다.
query QueryFilms {
allFilms{
films{
title
director
}
}
}
하지만 아래와 같이 하나의 영화를 출력하는 쿼리에서는 꼭 뒤에 식별자를 붙여줘야 한다. 식별자를 붙이지 않으면 어떤 데이터를 반환하면 될지 모르기 때문이다.
query QueryFilm {
film(id : 1){
title
director
}
}
만약 식별자를 붙이지 않은 채로 위 쿼리를 실행하게 되면 그림1과 같이 식별자를 지정하라는 메세지가 포함된 애러가 발생한다.
다중 데이터와 단일 데이터의 필드명 차이
눈썰미가 좋은 사람이라면 위의 두가지 예시를 보면서 다중 데이터를 가진 필드와 단일 데이터를 출력하는 필드 사이의 차이를 확인했을 것이다. 바로 뒤에 "s"가 붙는지와 아닌지이다. 만약 "s"가 붙으면 다중 데이터를 출력하는 것이서어 식별자를 붙이지 않아도 되고, "s"가 붙지 않으면 단일 데이터여 식별자를 붙여야 한다.
물론 이는 리프 노드에는 적용되지 않는다. 그림1의 title과 director 필드가 리프 노드이다.
*GraphQL은 그래프 구조이기 때문에 리프 노드란 말을 쓰는데, 리프 노드란 맨 안쪽의 노드를 뜻한다.