플러그인 모듈
백엔드 모듈은 플러그인 또는 때로는 다른 모듈을 추가 기능으로 확장하거나 기존 동작을 변경하는 데 사용돼요.
출처: 문서
본문
백엔드 모듈은 플러그인 또는 때로는 다른 모듈을 추가 기능으로 확장하거나 기존 동작을 변경하는 데 사용돼요. 모듈은 항상 확장하는 플러그인과 같은 백엔드 인스턴스에 설치되어야 하며, 단일 플러그인만 확장할 수 있어요. 모듈은 플러그인이 등록한 확장 지점을 사용해 대상 플러그인과 상호 작용하며, 동시에 그 플러그인의 서비스에도 의존할 수 있어요.
모듈과 플러그인 모두 시작 중에 호출되는 init 메서드를 등록해요. 플러그인이 시작하기 전에 모듈이 모든 확장을 등록했는지 보장하기 위해, 각 플러그인의 모든 모듈은 플러그인 자체가 초기화되기 전에 완전히 초기화돼요. 실제로는 모듈의 각 init 메서드가 반환하는 모든 promise가 플러그인 init 메서드가 호출되기 전에 resolve되어야 한다는 뜻이에요. 이는 또한 init 메서드가 resolve된 후에는 확장 지점과 더 이상 상호 작용할 수 없음을 의미해요.
모듈은 대상 플러그인의 라이브러리 패키지(예: @backstage/plugin-catalog-node)가 내보내는 확장 지점에 의존하며, 플러그인 패키지 자체에 직접 의존성을 선언하지 않아요. 이는 플러그인 패키지의 중복 설치를 초래할 수 있는 직접 의존성을 피하기 위해서이며, 라이브러리 패키지의 중복 설치는 항상 지원되어야 해요.
실용적인 예시
다음은 catalogProcessingExtensionPoint를 사용해 새 processor를 추가하는 모듈을 만드는 방법의 예시예요:
// plugins/catalog-backend-module-example-processor/src/module.tsimport { createBackendModule } from '@backstage/backend-plugin-api';import { catalogProcessingExtensionPoint } from '@backstage/plugin-catalog-node';import { MyCustomProcessor } from './MyCustomProcessor';export const catalogModuleExampleCustomProcessor = createBackendModule({ pluginId: 'catalog', moduleId: 'example-custom-processor', register(env) { env.registerInit({ deps: { catalog: catalogProcessingExtensionPoint, logger: coreServices.logger, }, async init({ catalog }) { catalog.addProcessor(new MyCustomProcessor(logger)); }, }); },});
상호 작용하려는 확장 지점을 deps 옵션에 넣는 한편 logger 서비스에도 동시에 의존하는 것을 확인할 수 있어요. 모듈을 초기화할 때 확장 지점과 서비스를 서로 바꿔 가며 의존할 수 있어요. 모듈 구현이 요구한다면 여러 확장 지점에 동시에 의존할 수도 있어요.
플러그인처럼 모든 모듈 패키지는 모듈 인스턴스를 패키지의 기본 내보내기(default export)로 내보내야 한다는 규칙이 있어요:
// plugins/catalog-backend-module-example-processor/src/index.tsexport { catalogModuleExampleCustomProcessor as default } from './module.ts';
이를 통해 패키지를 참조하기만 하면 백엔드 인스턴스에 모듈을 설치할 수 있어요:
backend.add( import('@internal/backstage-plugin-catalog-backend-module-example-processor'),);
각 모듈 패키지는 단일 모듈만 포함해야 하지만, 이 모듈은 여러 확장 지점을 확장할 수 있어요. 모듈은 구성을 사용해 특정 확장을 조건부로 활성화하거나 비활성화할 수도 있어요. 이 패턴은 서로 관련된 확장에만 사용해야 하며, 그렇지 않으면 자체 모듈을 가진 별도의 모듈 패키지를 만드는 것이 가장 좋아요.