눈썰미가 좋으신 분들은 알아차리셨겠지만, 결과 객체 필드가 쿼리의 필드 이름과 일치하지만 인자는 그렇지 않으므로 다른 인자를 사용하여 같은 필드를 직접 쿼리 할 수는 없습니다. 그렇기 때문에 필드의 결과를 원하는 이름으로 바꿀 수 있습니다. 이 것이 별칭 이 필요한 이유입니다.
{
empireHero: hero(episode: EMPIRE) {
name
}
jediHero: hero(episode: JEDI) {
name
}
}
위 예제에서 두 hero 필드는 서로 충돌하지만, 서로 다른 이름의 별칭을 지정할 수 있으므로 한 요청에서 두 결과를 모두 얻을 수 있습니다.
앱에서 상대적으로 복잡한 페이지가 있다고 가정해 봅시다. 친구(friends)를 가진 두 영웅(hero)을 순서대로 요청한다고 해봅시다. 그러면 쿼리가 복잡해질 수 있습니다. 이렇게되면 필드를 최소 두 번 반복해야합니다.
이것이 프래그먼트 라는 재사용 가능한 단위가 GraphQL에 포함된 이유입니다. 프래그먼트를 사용하면 필드셋을 구성한 다음 필요한 쿼리에 포함시킬 수 있습니다. 다음은 프래그먼트을 사용하여 위 상황을 해결하는 방법의 예제입니다.
{
leftComparison: hero(episode: EMPIRE) {
...comparisonFields
}
rightComparison: hero(episode: JEDI) {
...comparisonFields
}
}
fragment comparisonFields on Character {
name
appearsIn
friends {
name
}
}
필드가 반복될 경우 위 쿼리가 꽤 반복될 것을 알 수 있습니다. 프래그먼트 개념은 복잡한 응용 프로그램의 데이터 요구사항을 작은 단위로 분할하는데 사용됩니다. 특히 청크가 다른 여러 UI 구성 요소를 하나의 초기 데이터 fetch로 통합해야하는 경우에 많이 사용됩니다.
query Hero($episode: Episode, $withFriends: Boolean!) {
hero(episode: $episode) {
name
friends @include(if: $withFriends) {
name
}
}
{
"episode": "JEDI",
"withFriends": false
}
- @include(if: Boolean): 인자가 true 인 경우에만 이 필드를 결과에 포함합니다.
- @skip(if: Boolean) 인자가 true 이면 이 필드를 건너뜁니다.
-
GraphQL도 마찬가지입니다. 기술적으로는 어떠한 쿼리든 데이터를 수정할 수도 있습니다. 하지만 변경을 발생시키는 작업이 명시적으로 뮤테이션를 통해 전송되어야 한다는 규칙을 정하는 것이 좋습니다.
-
쿼리 필드는 병렬로 실행되지만 뮤테이션 필드는 하나씩 차례대로 실행됩니다.
- 즉, 하나의 요청에서 두 개의 incrementCredits 뮤테이션를 보내면 첫 번째는 두 번째 요청 전에 완료되는 것이 보장됩니다.
query HeroForEpisode($ep: Episode!) {
hero(episode: $ep) {
name
... on Droid {
primaryFunction
}
... on Human {
height
}
}
}
- 인터페이스나 유니언 타입을 반환하는 필드를 쿼리하는 경우, 인라인 프래그먼트 을 사용해야합니다. 예제를 통해 확인하는 것이 가장 쉽습니다.
-
프래그먼트를 사용하면 조합해서 클라이언트가 요청을 보낼 수 있는데, 서버는 resolver로 그럼 복잡하게 구조를 만들어줄 필요가 없는건가? 서버는 엔티티만 정의해두고, 클라이언트는 필요한 데이터를 조합해서 요청을 보내고
- 이럴 경우 네트워크 효율은 있지만, 서버 측에서는 계속 1+n 쿼리 요청 된다.
-
만약 1+n쿼리를 요청하는 경우 nosql lookup이나, mysql join없이도 1번의 리퀘스트로 해결 가능하지는 않구나(네트워크 1, 쿼리는 1+n)
-
graphql은 변수를 어떻게 저장할 수 있는가? 언어별로 구현되어있다.
-
리졸버 이름을 짓는 베스트 프랙티스는 뭘까? (예시에서는 HeroNameAndFriends, mutation CreateReviewForEpisod 이런식으로 지었던데)
-
자바스크립트의 변수값을 grapqhl 스키마 변수로 바로 할당 가능한가? ㅇㅇㅇ
-
인라인 프래그먼트의
... on <타입>
은 if exist같은 걸까