사내 유틸리티 메소드를 NPM 패키지로 관리하기
이 글은 Node.js의 패키지 매니저인 NPM과 Git 저장소를 이용한 사내 라이브러리 관리를 다루고 있습니다.
이 글은 Node.js의 패키지 매니저인 NPM과 Git 저장소를 이용한 사내 라이브러리 관리를 다루고 있습니다.
상황
회사 프로젝트 진행 중 여러 다른 Node.js 기반 프로젝트에서 공통적으로 사용해야하는 정책 관련 기능이 있습니다. 일반적인 내용이 아닌 비즈니스 로직이어서 npmjs에 공개할 수도 없습니다. 이런 상황에서 어떻게 모든 프로젝트에서 일관된 기능을 사용할 수 있을까요?
문제점
가장 큰 문제는 일반적으로 사용할 수 있는 npmjs를 이용해서 설치할 수 없는 것입니다. 그러면 각 프로젝트마다 따로 코드를 가지고 있어야(혹은 따로 개발해야)할까요? 공통적으로 사용하는 메소드가 정책적인 내용이고, 한번 바뀌면 서너개의 프로젝트, 어쩌면 이보다 많은 프로젝트가 있을 경우 일일이 바꿔주어야 할까요?
한 저장소에서 코드를 모아두고, 변경 사항이 생기면 해당 부분만 업데이트할 방법은 없을까요?
npmjs에 유료로 가입하면 Private NPM 패키지를 만들 수는 있습니다. 하지만 이미 회사는 Github 또는 Bitbucket 등의 서비스를 유료로 사용하고 있습니다. 자금이 부족한 초기 스타트업에서 크기가 작은 정책관련 유틸리티 메소드를 위해 추가 비용을 지불해야 할까요?
해결방법
Node.js에서 오픈소스 패키지를 사용할 때 사용하는 npm install <패키지 이름>
명령어는 package.json
에 npmjs에 있는 패키지 이름을 이용해 설치합니다. 보통 설치된(혹은 앞으로 설치할) package.json의 패키지는 다음과 같습니다.
"dependencies": {
"lodash": "^4.17.10"
... 기타 다른 패키지들
}
버전 정보를 담고 있는 쌍따옴표 안의 내용은 해당 패키지의 버전을 의미합니다. npm install
명령어를 실행하면 npmjs에서 해당 버전을 찾아 설치합니다.
버전 정보가 있는 위치에 Git 저장소의 URL을 지정하면 npmjs에서 패키지를 찾지 않고, Git저장소에서 패키지를 가져와 설치합니다. 물론 git 저장소가 NPM 패키지를 가지고 있어야 합니다.
"dependencies": {
"lodash": "^4.17.10",
"company-utilities": "git+https://<USERNAME>:<PASSWORD>@bitbucket.org/<PACKAGE_USERNAME>/<PACKAGE_NAME>.git",
... 기타 다른 패키지들
}
회사 정책을 담고 있는 company-utilities 패키지는 https://bitbucket.org/<PACKAGE_USERNAME>/<PACKAGE_NAME>.git
에 NPM 패키지 규격에 맞게 만들어져 있습니다. 사용이 필요한 개발자는 <USERNAME>
과 <PASSWORD>
만 넣어주면 npm install
명령어로 사설 저장소에 있는 NPM 패키지를 가져와 설치할 수 있습니다. 패키지가 업데이트 된 경우 npm update
명령어로 최신 버전의 유틸리티를 사용할 수 있습니다.
위 예제는 bitbucket를 사용한 예를 들었지만 어떤 Git 저장소 서비스를 이용하더라도 URL 포맷은 같습니다.
더 생각해 볼 것들
package.json의 <USERNAME>
과 <PASSOWRD>
에 실제 사용하는 계정 정보가 노출되면 심각한 보안 문제를 야기할 수 있습니다. 때문에 배포 스크립트를 이용해 환경변수에서 가져와 빌드과저에서 교체하는 방법을 이용해야합니다.
bitbucket을 사용하고, Google 계정으로 로그인하는 경우 <PASSWORD>
를 사용할 수 없습니다. 이 경우 bitbucket setting 메뉴에서 ACCESS MANAGEMENT 중 App passwords 에서 비밀번호를 만들 수 있습니다. fobid님께서 알려주셔서 쉽게 해결 할 수 있었습니다. 감사합니다.