# 이름 요구를 읽는 세 클래스의 줄 수
  GraphQlOperationNamePolicy.java : 85 줄
  GraphQlOperationSelectionHandler.java : 125 줄
  GraphQlRequestEnvelopeValidator.java : 152 줄

# GraphQlOperationNamePolicy 를 자기 파일 밖에서 쓰는 자리
  main · GraphQlOperationNameInterceptor.java:17   private final GraphQlOperationNamePolicy policy;
  main · GraphQlOperationNameInterceptor.java:24   public GraphQlOperationNameInterceptor(GraphQlOperationNamePolicy policy) {
  test · GraphQlOperationNamePolicyTest.java:14 class GraphQlOperationNamePolicyTest {
  test · GraphQlOperationNamePolicyTest.java:18     var policy = GraphQlOperationNamePolicy.production();
  test · GraphQlOperationNamePolicyTest.java:29                 GraphQlOperationNamePolicy.local()
  test · GraphQlOperationNamePolicyTest.java:40                 GraphQlOperationNamePolicy.local()
  test · GraphQlOperationNamePolicyTest.java:50     var policy = GraphQlOperationNamePolicy.production();
  test · GraphQlOperationNamePolicyTest.java:68     var policy = GraphQlOperationNamePolicy.production();
  test · GraphQlOperationNamePolicyTest.java:78     var policy = GraphQlOperationNamePolicy.production();
  test · GraphQlOperationNamePolicyTest.java:94     var interceptor = new GraphQlOperationNameInterceptor(GraphQlOperationNamePolicy.production());

# GraphQlOperationNameInterceptor 를 자기 파일 밖에서 쓰는 자리
  test · GraphQlOperationNamePolicyTest.java:94     var interceptor = new GraphQlOperationNameInterceptor(GraphQlOperationNamePolicy.production());

# GraphQlRequestEnvelopeValidator 를 실제로 만드는 자리 전부
  test · GraphQlRequestBoundsTest.java:38
  test · GraphQlRequestBoundsTest.java:50
  test · GraphQlRequestEnvelopeValidatorTest.java:19
  test · GraphQlRequestEnvelopeValidatorTest.java:30
  test · GraphQlRequestEnvelopeValidatorTest.java:41
  test · GraphQlRequestEnvelopeValidatorTest.java:77
  test · GraphQlRequestEnvelopeValidatorTest.java:92
  test · GraphQlRequestEnvelopeValidatorTest.java:101
  testFixtures · GraphQlContractFixture.java:84

# namedOperationRequired 를 읽는 프로덕션 코드
  main · GraphQlRequestEnvelopeValidator.java:63         policy.namedOperationRequired(),
  main · GraphQlRequestEnvelopeValidator.java:134     if (namedOperationRequired && GraphQlOperationName.parse(envelope.operationName()).isEmpty()) {
  main · GraphQlOperationSelectionHandler.java:74       if (policy.namedOperationRequired() && selected.getName() == null) {

# GraphQlClientPolicy 인스턴스를 만드는 프로덕션 코드 전부
  main · GraphQlPlatformAutoConfiguration.java:303     return GraphQlClientPolicy.defaults(
  main · GraphQlClientPolicy.java:85   public static GraphQlClientPolicy defaults(
  main · GraphQlClientPolicy.java:87     return new GraphQlClientPolicy(
  그 빈을 내놓는 자리 :
  GraphQlPlatformAutoConfiguration.java:300   @Bean
  GraphQlPlatformAutoConfiguration.java:301   @ConditionalOnMissingBean
  GraphQlPlatformAutoConfiguration.java:302   public GraphQlClientPolicy graphQlClientPolicy(GraphQlPlatformSettings properties) {
  GraphQlPlatformAutoConfiguration.java:303     return GraphQlClientPolicy.defaults(
  GraphQlPlatformAutoConfiguration.java:304         properties.limits().maximumPageSize(),
  GraphQlPlatformAutoConfiguration.java:305         properties.limits().maximumComplexity(),
  GraphQlPlatformAutoConfiguration.java:306         properties.console().introspectionEnabled());
  GraphQlPlatformAutoConfiguration.java:307   }
  GraphQlPlatformAutoConfiguration.java:308 
  defaults 가 마지막 세 성분에 넣는 값과 그 성분의 이름 :
    값  GraphQlClientPolicy.java:101         introspectionAllowed,
    값  GraphQlClientPolicy.java:102         false,
    값  GraphQlClientPolicy.java:103         false);
    이름 GraphQlClientPolicy.java:49     boolean introspectionAllowed,
    이름 GraphQlClientPolicy.java:50     boolean persistedOperationOnly,
    이름 GraphQlClientPolicy.java:51     boolean namedOperationRequired) {

# 배선된 핸들러가 요청 경로에 오르는 사슬
  main · GraphQlPlatformAutoConfiguration.java:403     return GraphQlExecutionChain.stable(
  main · GraphQlPlatformAutoConfiguration.java:404         new GraphQlOperationSelectionHandler(clientPolicy),
  main · GraphQlPlatformAutoConfiguration.java:420     return new GraphQlPlatformInstrumentation(chain);
  main · GraphQlExecutionChain.java:43   public static GraphQlExecutionChain stable(
  GraphQlPlatformInstrumentation.java:81           chain.run(
  그 사슬이 붙는 어댑터 자체의 조건 :
  GraphQlRootAutoConfiguration.java:4 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
  GraphQlRootAutoConfiguration.java:21 @ConditionalOnProperty(prefix = "backend.graphql", name = "enabled", havingValue = "true")

# GraphQlRequestContext.operationId 를 읽는 프로덕션 코드
  main 에서 0 건
  참고 — 이 모듈 main 에서 operationId() 로 잡히는 둘은 별개 타입이다 :
  main · GraphQlPersistedOperationAdminService.java:68         command.operationId(),
  main · GraphQlPersistedOperationInterceptor.java:50     GraphQlPersistedOperation operation = lookup.require(request.operationId());

# 미배선 정책이 이름을 검사하는 방식과 GraphQlOperationName.parse 의 계약
  GraphQlOperationNamePolicy.java:54     if (namedRequired && !selection.named()) {
  GraphQlOperationNamePolicy.java:55       throw new GraphQlAnonymousOperationException("named operation required");
  GraphQlOperationNamePolicy.java:56     }
  GraphQlOperationNamePolicy.java:57     if (selection.named() && GraphQlOperationName.parse(selection.operationName()).isEmpty()) {
  GraphQlOperationNamePolicy.java:58       // Validates the bounded naming pattern; an unbounded name would defeat the reason for
  GraphQlOperationNamePolicy.java:59       // requiring one at all.
  GraphQlOperationNamePolicy.java:60       throw new GraphQlAnonymousOperationException("named operation required");
  GraphQlOperationNamePolicy.java:61     }
  GraphQlOperationName.java:37   public static Optional<GraphQlOperationName> parse(String candidate) {
  GraphQlOperationName.java:38     if (candidate == null || candidate.isBlank()) {
  GraphQlOperationName.java:39       return Optional.empty();
  GraphQlOperationName.java:40     }
  GraphQlOperationName.java:41     return Optional.of(new GraphQlOperationName(candidate));
  GraphQlOperationName.java:42   }
