Introspection
GraphQL 스키마가 어떠한 쿼리를 지원하는지 물어보는건 유용할 수 있다. GraphQL은 introspection 시스템을 통해 이를 가능케 한다.
스타워즈 예제에서 파일 starWarsIntrospection 은 introspection 시스템을 보여주는 많은 쿼리를 포함하고 있다. 그리고 이것은 이를 확인할 수 있는 테스트 파일이다.
우리는 타입 시스템을 디자인 하엿기 때문에 어떠한 타입들이 사용 가능한지 안다. 하지만 우리가 이를 디자인 하지 않았다면 우리는 GraphQL 에 __schema 필드를 쿼리 함으로써 이를 물어볼 수 있다. 그리고 이것은 쿼리의 루트 타입에서 언제나 사용 가능하다.
어떤 타입이 가능한지 한번 물어보자.
오, 엄청많다. 한번 그룹으로 나눠보자.
- Query, Character, Human, Episode, Droid - 이 것들은 우리가 우리 타입 시스템에 정의한 것들이다.
- String, Boolean - 이것은 타입 시스템이 제공하는 내장 타입이다.
- __Schema, __Type, __TypeKind, __Field, __InputValue, __EnumValue, __Directive - 앞에 더블 언더스코어가 있는 것들은 introspection 시스템에 속한다는 것을 뜻한다.
이제 어떠한 쿼리들이 사용 가능한지 알아보기 위해 어디서 시작하면 좋을지 알아보자. 우리가 타입 시스템을 디자인할때, 우리는 모든 쿼리가 어떤 타입에서 시작해야 되는지 명시하였다. introspection 시스템에 이를 물어봐보자.
저 것은 우리가 타입 시스템에서 말한 것과 매치하며, 저 Query 타입이 우리가 시작해야 할 부분이다. 이름 짓는 방법이 그냥 컨벤션에 따라 되었음을 보라.
Query 타입을 다른 것으로 이름 지을 수 있었고, 이것은 우리가 이름지은 대로 반환했을 것이다. 그러나 Query 라고 이름 짓는 것이 유용한 컨벤션이다.
하나의 특정 타입을 살펴보는 것은 유용할 수 있다. 아래 Droid 타입을 보자.
그러나 우리가 Droid 에 더 알고 싶다면 어떻게 해야할까? 예를 들어 이게 interface 인지 객체인지 알고 싶다면?
kind 는 __TypeKind enum 을 리턴하는데, 이 중 하나의 값은 OBJECT 이다. 대신에 캐릭터 에 대해서 묻는다면 이것은 인터페이스를 리턴할 것이다.
해당 객체가 어떠한 가능한 필드를 가지고 있는지 아는 것도 유용하므로 Droid에 대해 물어보자.
위에 값들이 우리가 Droid 에 정의한 필드들이다!
id 는 약간 이상하게 보이는데, 이것은 타입의 이름이 없다. 왜냐하면 이것은 NON_NULL 의 "wrapper" 타입이기 때문이다.(?)
만약에 해당 필드의 타입에 ofType 이라는 쿼리를 보낸다면, 우리는 non-null id 라고 말해주는 ID 타입을 찾을 수 있을 것이다.
마찬가지로 friends 와 appearsIn 또한 이름이 없는데 이는 그들이 LIST wrapper 타입이기 때문이다. 우리가 해당 타입에 ofType 을 쿼리해주면, 이는 이 리스트들이 무엇인지 알려줄 것이다.
introspection 시스템의 특히 유용한 부분을 알려주면서 마칠 것이다. 시스템에 도큐멘테이션에 대해서 물어보자!
introspection 을 통해서 타입 시스템의 도큐멘테이션에 접근 할 수 있으며, 도큐멘테이션 브라우저나 풍부한 IDE 경험을 제공할 수 있다.
이 내용들은 introspection 시스템의 표면에 불과하다. 우리는 enum 값이나 인터페이스 등을 요청할 수 있다. 우리는 또 introspection 시스템 자체를 introspect 할 수 있다. 이 주제는 instrospection 섹션에서 더 자세히 다루어 지며 introspection 에서 더 많은 코드를 볼 수 있다.
* 해당 글은 번역기 돌리다가 크롬 번역기 말도 안되는 해석에 지친 본인이 나중에 참고할 의도로 대충대충 발로 해석한 것이니 참고용으로만 사용하시길 바랍니다.
* 출처: https://graphql.github.io/learn/introspection/
'배움의 즐거움 > 프로그래밍' 카테고리의 다른 글
(8) Graphql-ruby - Introspection (0) | 2018.12.31 |
---|---|
(7) Graphql-ruby - 스키마 정의 (0) | 2018.12.31 |
(5) GraphQL - 실행 (0) | 2018.12.31 |
(4) GraphQL - 유효성 검사 (0) | 2018.12.31 |
(3) GraphQL - 스키마와 타입 (0) | 2018.12.31 |