표준 뮤테이션과 중첩 뮤테이션에 단일 코드 소스 사용하기
GraphQL 서버는 두 가지 동작을 지원합니다.
- 기본값인 뮤테이션의 표준 동작
- 옵트인 방식의 중첩 뮤테이션
그 결과, 기본적으로 QueryRoot와 MutationRoot 타입을 노출하며, 중첩 뮤테이션에 대해서는 단일 Root 타입 노출로 전환합니다.
리졸버를 제공할 때, 각 솔루션에 대해 두 개의 리졸버를 제공하고 싶지는 않을 것입니다. Root의 필드를 해석하는 데 사용되는 동일한 리졸버가 QueryRoot 및 MutationRoot의 필드도 해석할 수 있는 편이 더 바람직합니다.
구현 세부 사항
서버는 필드를 해석하기 위해 FieldResolver라는 객체를 사용하고, 실제 뮤테이션을 실행하기 위해 MutationResolver라는 객체를 사용합니다. 동일한 MutationResolver 객체는 서로 다른 필드를 구현하는 여러 FieldResolvers에서 참조할 수 있으므로, 코드는 한 번만 구현되고 SOLID 접근 방식에 따라 여러 곳에서 사용됩니다.
필드가 뮤테이션인지 아닌지는 FieldResolver가 해당 필드에 대해 MutationResolver 객체를 선언하는지 여부로 판단하며, 이는 resolveFieldMutationResolverClass 함수를 통해 수행됩니다.
예를 들어, 필드 Root.replyComment는 AddCommentToCustomPostMutationResolver 객체를 제공합니다. 이 동일한 객체는 필드 Comment.reply에 의해서도 사용됩니다.
또한, FieldResolver를 코딩할 때 루트 필드는 Root 타입에만 추가됩니다. 표준 GraphQL 동작에서 서버는 이 구성을 가져와, 해당 필드가 뮤테이션인지 아닌지에 따라 MutationRoot 또는 QueryRoot에 자동으로 추가할 수 있습니다.
그 결과, 표준 동작과 중첩 뮤테이션 모두를 지원하는 코드에 단일 소스를 사용하고 있기 때문에, 추가 노력 없이 중첩 뮤테이션이 포함된 쿼리를 실행할 수 있습니다.