Last Updated: 2021-06-14

cover

이번 섹션에서는 npm scope에 대해서 알아보고 이 scope 패키지를 통해서 어떻게 npm registry에 배포하는지 파악해보고 npm 패키지를 실제로 배포까지 해보도록하자.

npm에는 scope라는 개념이 존재한다.
npm의 scope 개념은 조직 또는 그룹이다. 우리는 이 scope를 통해서 협업이 가능하며, 여러개의 분산된 패키지를 하나의 조직으로 관리 또는 배포 할 수 있다.

빠르게 배우는 Node.js와 NPM 설치부터 개념 잡기에서 NPMNode.js에 대한 개념을 잡고 빠르게 배우는 NPM 패키지 생성부터 배포까지 완벽 가이드에서 NPM 패키지를 실제로 생성하고 배포까지 해보았다면 이제는 NPM Scope에 대해서 알아보자.

NPM Scope

NPM Scope 패키지는 NPM 패키지와 같이 동일한 패키지이며 사용법도 같다. 다만 다른 게 있다면 NPM Scope 패키지범위 또는 그룹을 가진다. 이렇게 그룹을 가지게 되면 패키지 이름에 일반적인 규칙을 가지게 되며 패키지를 처리하는 방법에 약간의 영향을 준다.

각 NPM 사용자조직(Organizations)은 자체 범위를 가지고 이 범위에서 패키지를 추가할 수 있다. 이 범위는 그룹으로 볼 수 있으며, 그룹으로 지정된 패키지는 NPM 기본 Registry에 배포 및 설치된다. 그룹으로 지정되지 않은 패키지는 그룹으로 지정된 패키지에 종속적일 수 있으며 반대도 마찬가지며, 범위가 있는 패키지는 1개의 범위에 원하는 개수만큼 패키지를 포함 시킬 수 있다.

@

node module을 설치하고 node_modules 폴더를 보게 되면 @가 붙은 패키지를 볼 수 있을 것이다. 이러한 패키지가 모두 범위가 있는 패키지이며, 아래와 같이 @로 표현된다.

@somescope/somepackagename

NPM Scope Install

NPM Scope 패키지도 일반 패키지와 설치하는 방법은 같다.

npm install @scopeName/pacakgeName

다른 게 있다면 위에서 말한 것과 같이 범위가 있는 패키지는 @가 붙고 범위 명칭이 붙기 때문에 패키지 이름에 있어서 주의만 하면 되고 일반 패키지는 node_modules/packageName 설치가 된다면 범위가 있는 패키지는 node_modules/@scopeName/packageName에 설치가 된다.

{
"dependencies": {
"@scopeName/packageName": "^1.0.0"
}
}

NPM Scope의 사용

require를 통해 NPM Scope 패키지를 사용할 때도 동일하게 @ 범위 이름으로 사용하면 된다.

require('@scopeName/packageName')

NPM Scope의 배포

NPM Scope의 사용하는 방법까지는 일반 패키지와 비슷하지만, 배포부터는 조금 까다롭고 다르다.

NPM Scope 패키지는 일반 패키지와 동일하게 배포할 수는 없다. 배포를 위해서는 두 가지의 NPM Registry 형태로만 가능하다.

  1. 비공개 패키지 게시 권한이 있는 개인 Registry
  2. 조직(Organizations)으로 생성된 Registry

위 내용을 토대로 각 Registry에 배포하는 방법을 보자.

1. 비공개 패키지 게시 권한이 있는 개인 Registry

개인 비공개 패키지를 배포하기 위해서는 $7의 결제가 필요하다.
7가 아깝다면 여긴 넘어가자.

만약 개인 비공개 Registry로 업그레이드하였다면 npm publish 또는 npm publish --access=restricted로 모듈을 게시 할 수 있다.

2. 조직(Organizations)으로 생성된 Registry

조직(Organizations) 생성

조직으로 생성된 Registry에 배포하기 위해서는 먼저 조직(Organizations)을 생성해야 한다. NPM에 로그인 후 개인 Package 항목으로 가서 생성하자.

npm-organization

조직을 생성하게 되면 아래 그림처럼 현재 계정을 조직으로 변경하거나 새로운 조직을 만들 수 있다. 현재 계정을 변경하게 되면 @계정명과 같이 scope가 생성이 된다. 이 포스팅에서는 devdy라는 새로운 조직으로 생성하겠다.

new-organization

조직을 생성하게 되면 기본적으로 Members 탭이 보인다. 조직은 말 그대로 조직이기 때문에 여러 사용자를 포함할 수 있으니 참고하자. 또한 조직은 기본적으로 Public 범위를 가진다. Private 조직을 가지기 위해서는 결제가 필요하니 참고해두자.

success-organization

조직(Organizations) 범위로의 배포

이제 생성된 조직에 배포해보자. 여기서 주의할 점은 조직을 생성하였으며 이 조직은 scope가 되기 때문에 패키지 명을 범위에 맞게 지정해야 한다. 여기서 조직명을 devdy로 했기 때문에 패키지 명을 @devdy/sample-package로 하겠다.

scope로 생성된 패키지는 일반 npm publish 명령으로 배포하면 오류가 출력된다. 조직 자체의 Registry는 공개이지만 배포에 있어서는 limited로 설정되어 있기 때문에 범위 패키지를 배포하기 위해서는 --access=public 하거나 최초 게시 후 npm access public 명령어를 사용하여 해당 액세스를 공개로 설정해야 한다.

npm publish 시에 --access=public 옵션을 주도록 하자.

npm publish --access=public

정상적으로 패키지가 배포된 것을 확인하자.

publish-package

NPM Repository에 배포된 패키지는 72시간이 지나면 직접 지울 수 없어서 불필요하다면 즉시 삭제하기 바란다.

npm unpublish @scopeName/packageName -f

범위를 가진 Registry에 연결하기

이 부분은 NPM Registry가 registry.npmjs.org가 아닌 사설 Registry 이거나 여러 개의 Registry가 필요한 상황에서의 범위 연결 방법이다.

N개의 Registry가 존재할 경우 각 Registry는 범위를 지정할 수가 있는데 두 가지 형태로 지정할 수 있다. 이 두 가지에 대하여 간략하게 설명하겠다.

  1. 로그인 시 범위를 가진 Registry 연결
  2. npm config를 통하여 범위를 가진 Registry 연결

범위는 하나의 Registry와 N:1 관계를 맺는다. 하나의 Registry는 여러 범위에 호스팅할 수 있지만 하나의 범위(scope)는 하나의 Registry만 연결할 수 있다.

이렇게 범위와 Registry를 연결 후 npm install을 통해 node module을 설치할 경우 만약 해당 Registry에 모듈이 없을 때 기본 Registry인 https://registry.npmjs.org/로 연결되게 되어있다.

1. 로그인 시 범위를 가진 Registry 연결

로그인 시 범위를 가진 Registry에 연결하는 방법은 명령어를 통해서 npm login 시 Registry와 범위(scope)를 직접 지정하는 방법이다.

npm login --registry=REGISTRY_PATH --scope=@SCOPE_NAME

2. npm config를 통하여 범위를 가진 Registry 연결

config를 통한 방법은 npm의 설정을 직접 변경하여 Registry 연결과 범위(scope)를 지정하는 방법이다.

npm config set @SCOPE_NAME:registry REGISTRY_PATH

지정된 registry와 범위(scope)는 .npmrc를 확인해보자.


NPM 패키지의 scope까지 배웠다면 NPM 패키지 배포에 있어서는 전반적으로 본 것이다.

필수조건으로 npm scope가 필요한 것은 아니지만 특정 패키지는 협업이 필요할 수도 있다. 여러 패키지의 Owner를 각각 두고 말이다. 이럴 때는 범위(scope)를 가진 패키지가 필요할 것이며, 또한 보통 혼자서 NPM 패키지를 만든다고 하더라도 하나만 만들지는 않을 것이다. 앞으로도 계속 만든다는 가정하에 이제는 범위(scope)가 있는 패키지를 만들도록 하자.