지시문이 필요한 이유
앞서 Alias를 사용해 필드명을 변경시키는 방법을 살펴봤다. 하지만 Alias를 사용해 필드명을 변경시키는 것은 데이터를 처리하는데 충분하지 않다. 예를 들어 Kotlin의 sealed class를 상속하는 data class를 사용해 데이터를 받을 경우 특정 데이터를 받을 경우 특정 데이터가 포함되거나 되지 않는 경우를 처리하기 어렵기 때문이다.
예를 들어 다음과 같은 영화 정보를 담는 FilmInfo sealed class가 있다고 해보자.
sealed class FilmInfo(){
data class BasicFilmInfo(val filmTitle : String) : FilmInfo()
data class FilmInfoWithDirector(val filmTitle : String, val director: String) : FilmInfo()
}
어떤 클래스에는 감독(direcotr)의 이름이 포함되어야 하고 어떤 영화에는 감독의 이름이 포함되어야 하지 않아야 되는 경우 다음 쿼리로는 핸들링이 불가능하다. 무조건 title과 director가 포함되기 때문이다.
query QueryFilms {
allFilms{
films {
title
director
}
}
}
이를 해결하기 위해 우리는 GraphQL의 @include 혹은 @skip 지시문을 사용할 수 있다.
GraphQL의 @include 지시문
GraphQL의 @include 지시문은 필드의 뒤에 써서 사용될 수 있다. @include 지시문은 if 라는 인자를 받으며 if 값에 true가 올 경우 필드가 포함되고 false가 올 경우 필드가 생략된다. 예를 들어 위와 같이 director가 특정 경우에 포함되어야 하고 특정 경우에는 포함되지 말아야 하는 경우 다음과 같이 director 뒤에 붙여서 사용될 수 있다.
query QueryFilms($includeDirector : Boolean = false) {
allFilms {
films {
title
director @include(if: $includeDirector)
}
}
}
이렇게 하면 $includeDirector 변수의 값이 false일 때 데이터에는 [그림1]과 같이 director의 데이터가 생략되어 온다.
반대로 $includeDirector 변수의 값이 true일 때는 데이터에는 [그림2]와 같이 director 데이터가 포함되어 온다.
즉, 변수에 따라 데이터를 포함하거나 생략할 수 있다.
GraphQL의 @skip 지시문
GraphQL의 @skip 지시문은 @include와 반대의 역할을 한다. @skip 지시문은 @include와 같이 if 라는 인자를 받으며 if 값에 true가 올 경우 필드가 생략되고 false가 올 경우 필드가 포함된다.
query QueryFilms($skipDirector : Boolean = true) {
allFilms {
films {
title
director @skip(if: $skipDirector)
}
}
}
@skip 지시문의 if의 인자로 true가 오면 [그림3]과 같이 필드가 생략된다.
반대로 @skip 지시문의 if 인자로 false가 오면 [그림4]와 같이 필드가 포함된다.