개념, 아이디어, 전략
개념, 아이디어, 전략충돌을 피하기 위한 스키마 네임스페이싱

충돌을 피하기 위한 스키마 네임스페이싱

WordPress 디렉토리에 플러그인을 게시하는 개발자는 자신의 플러그인을 누가 사용할지, 또는 사이트가 어떤 설정이나 환경을 가질지(다른 어떤 플러그인이 설치되어 있는지 포함)를 사전에 알 수 없습니다. 따라서 플러그인은 충돌에 대비하고, 사전에 이를 방지하기 위한 조치를 취해야 합니다.

WordPress 플러그인이 충돌을 피하는 방법 중 하나는 PHP 네임스페이싱을 사용하는 것입니다. 네임스페이스는 PHP 커뮤니티에서 널리 사용되며, Composer 오토로딩을 활성화하기 위해 PHP 표준 권고안 PSR-4를 따릅니다. PHP 패키지에는 "vendor-name/package-name"과 같이 벤더 이름이 포함되어야 하며, 해당 네임스페이스가 PHP 코드에 명시됩니다.

<?php
namespace VendorName\PackageName\ClassName;

네임스페이싱은 GraphQL의 맥락에서도 의미가 있으며, 스키마에서 발생할 수 있는 다음과 같은 충돌을 방지합니다.

  • 같은 이름을 가진 두 개의 타입이 존재하는 경우
  • 같은 타입에 같은 이름을 가진 두 개의 필드가 존재하는 경우
  • 같은 이름을 가진 두 개의 디렉티브가 존재하는 경우

네임스페이싱은 GraphQL 사양에 대해 요청된 바 있습니다.

At the moment all GraphQL types share one global namespace. This is also true for all of the fields in mutation/subscription type. It can be a concern for bigger projects which may contain several loosely-coupled parts in a GraphQL schema.

그러나 Lee Byron(Facebook 재직 시절 GraphQL의 창시자 중 한 명)은 사양에 네임스페이싱을 추가하는 것이 필요하지 않다고 생각합니다. 이 코멘트에서 Facebook이 수천 개의 타입을 충돌 없이 GraphQL 스키마에서 관리하는 방법을 설명하고 있습니다.

We avoid naming collisions in two ways:

  1. integration tests.

We don't allow any commit to merge into our repository that would result in a broken GraphQL schema. [...]

  1. Common naming patterns.

We have common patterns for naming things which naturally avoid collision problems. [...]

하지만 이 전략이 Facebook에서 효과적이라고 해서 WordPress에서도 효과적이라는 의미는 아닙니다. Facebook은 GraphQL 스키마에 대한 모든 입력을 제어하므로 엔티티 명명에 관한 절차를 따르고 충돌이 발생하지 않도록 할 수 있습니다. 그러나 WordPress 사이트는 서드파티 플러그인에 크게 의존하며, 이러한 플러그인이 어떻게 만들어지는지 제어할 수 없습니다.

예를 들어, 어떤 사이트가 WooCommerce와 Easy Digital Downloads 플러그인을 모두 사용하고 있고, 두 플러그인 모두 GraphQL 스키마에 Product라는 이름의 타입을 가지고 있다면 충돌이 발생합니다. 사이트 소유자가 할 수 있는 유일한 방법은 두 회사 중 하나에 연락하여 코드를 수정해 달라고 요청하는 것입니다. 이는 예방이 아닌 사후 대처이며 신뢰성이 낮습니다.

네임스페이싱은 WordPress 사이트 소유자에게 코드가 항상 정상적으로 작동한다는 안심감을 줄 수 있습니다. 두 타입이 Product라는 이름을 가지는 경우, 사이트 관리자는 GraphQL 스키마에서 네임스페이싱을 활성화할 수 있으며, 이 타입들은 자동으로 WooCommerce_ProductEDD_Product로 이름이 변경되어 충돌을 방지합니다.

추가적인 이점으로, 네임스페이싱은 GraphQL 스키마를 더욱 우아하게 만들어 줍니다. WooCommerce가 자사 플러그인과의 충돌이 절대 발생하지 않도록 보장하고 싶다면, 타입 이름 자체에 「네임스페이스를 부여」해야 합니다. 예를 들어 WCProduct, WCDownload, WCPayment(또는 항상 작동한다는 것을 완전히 확신하기 위해 WooCommerceProduct, WooCommerceDownload, WooCommercePayment라고 부를 수도 있습니다). 네임스페이싱 덕분에 이러한 타입들은 Product, Download, Payment라는 더 자연스러운 이름을 가질 수 있습니다.