오늘은 keycloak과 module federation이 무엇인지 정의하고 발생한 에러를 해결할 방법을 알아보겠습니다.
Keycloak은 통합 인증 시스템으로, 아이덴티티 및 접근 관리(Identity and Access Management)를 제공하는 오픈 소스 소프트웨어입니다.
주요 기능으로는 싱글 사인온(SSO)을 지원하여 사용자가 여러 애플리케이션에 대해 반복적인 로그인 과정을 겪지 않도록 도와줍니다.
Module Federation은 웹팩 5의 기능으로, 마이크로 프론트엔드 아키텍처를 손쉽게 구현할 수 있게 도와줍니다. 이를 통해 여러 개의 독립적인 애플리케이션 모듈 간에 구성을 공유하고 동적으로 로드할 수 있습니다.
Angular 17 환경에서 Keycloak을 통합하는 과정에서 발생하는 "WEBPACK_IMPORTED_MODULE_5 is not a constructor" 에러는 다양한 요인에 의해 발생할 수 있으며, 이를 해결하기 위해 체계적인 점검과 수정이 필요합니다. 다음은 이 문제의 원인과 함께 효과적인 해결책을 제시합니다.
Angular 17과 함께 사용하는 keycloak-angular 및 keycloak-js와 같은 라이브러리의 버전이 호환되는지 먼저 확인해야 합니다.
잘못된 버전의 라이브러리를 사용하면 의도한 대로 동작하지 않거나 오류가 발생할 수 있습니다. 다음 단계에 따라 확인하시기 바랍니다:
npm list keycloak-angular keycloak-js 명령어를 사용하여 설치된 버전을 확인합니다. 이때 설치된 버전이 Angular 17과 호환되는지 확인해야 합니다. Angular의 공식 문서나 패키지의 GitHub 페이지를 참고하여 권장하는 버전을 찾아보세요.
만약 버전이 호환되지 않는다면, npm install keycloak-angular@<희망하는버전> 또는 npm install keycloak-js@<희망하는버전>과 같은 명령어로 적절한 버전으로 업데이트합니다.
angular.json 파일에서 빌드 설정이 올바르게 되어 있는지도 확인해야 합니다. 특히 allowedCommonJsDependencies 속성은 CommonJS 모듈 사용을 허용하는 설정으로, 다음과 같이 구성되어야 합니다:
"allowedCommonJsDependencies": [
"base64-js",
"js-sha256",
"keycloak-js"
]
이 설정은 Angular 애플리케이션이 사용하는 CommonJS 모듈을 명시적으로 허용하여 모듈 페더레이션에서 발생할 수 있는 충돌을 최소화하는 데 기여합니다.
Keycloak과 관련된 차별화된 설정이 필요합니다. Module Federation의 목적상 Keycloak을 공유와 스킵 리스트에 추가하는 것이 중요합니다. 다음과 같이 Webpack 설정 파일을 조정하십시오:
const sharedConfig = {
singleton: false,
strictVersion: false,
requiredVersion: 'auto'
};
const skipList = [
'@angular-architects/module-federation',
'tslib',
'zone.js',
'keycloak-js'
];
shareAll(sharedConfig, skipList);
이렇게 설정하면 Keycloak의 의존성이 Module Federation에 의해 처리되지 않도록 하며, 이는 모듈 간의 충돌을 방지하고 런타임에서 발생할 수 있는 오류를 사전에 예방합니다.
문제가 지속되면, 에러 메시지가 발생하는 부분에서 추가적인 로깅을 통해 문제의 근본 원인을 파악하는 것도 중요한 방법입니다. 예를 들어, Keycloak을 초기화할 때 각 단계를 헬퍼 함수로 분리하여 어떤 단계에서 오류가 발생하는지 확인할 수 있습니다:
const initKeycloak = async () => {
try {
const keycloak = new Keycloak();
await keycloak.init({
onLoad: 'login-required',
checkLoginIframe: false,
});
console.log('Keycloak initialized successfully');
} catch (error) {
console.error('Error initializing Keycloak: ', error);
}
};
이와 같은 형식으로 로깅을 추가하면, 정확한 오류의 위치와 이유를 진단하는 데 큰 도움이 됩니다.
이렇게 여러 단계를 통해 "WEBPACK_IMPORTED_MODULE_5 is not a constructor" 문제를 체계적으로 해결할 수 있습니다. 각 점검 항목과 조정 사항들을 바탕으로 Keycloak과 Angular 환경을 효과적으로 통합하여 안정적인 애플리케이션을 구축하시기 바랍니다.