Featured image of post GitLab Private NPM Registry 설정 방법은? 멀티 패키지 및 권한 관리 모범 사례

GitLab Private NPM Registry 설정 방법은? 멀티 패키지 및 권한 관리 모범 사례

GitLab Private NPM Registry 설정 난제를 해결. .npmrc 로직, 멀티 패키지 관리, 404 오류 해결을 포함하며, 통합 Registry 모범 사례를 제공합니다.

회사 프로젝트에서 Private Package를 사용해야 하는데 .npmrc 설정에서 막히셨나요?

Token을 설정했는데도 왜 여전히 404 Not Found가 나타날까요?

회사에 여러 팀, 여러 패키지(예: @frontend, @backend)가 있을 때 .npmrc를 어떻게 우아하게 관리할 수 있을까요?

.npmrc의 두 가지 미신 풀기

.npmrc를 이해하려면 먼저 어떻게 작동하는지 이해해야 합니다.

간단히 말해서 핵심 로직은 **스코프 매핑(Scope Mapping)**과 인증(Authentication) 두 가지뿐입니다.

1. 스코프 매핑(Scope Mapping)

이것은 npm에게 말하는 것입니다: @company로 시작하는 패키지를 보면 공식 npmjs.org에서 찾지 말고 우리가 지정한 GitLab Registry로 가서 찾으세요.

@company:registry=https://gitlab.com/api/v4/groups/100/-/packages/npm/

2. 인증(Authentication)

주소가 있어도 열쇠가 필요합니다. 열쇠는 귀하의 AuthToken입니다.

여기 매우 중요한 규칙이 있습니다: Registry URL과 AuthToken 경로는 “정확히 일치"해야 합니다.

# ✅ 올바름: 경로는 위에서 정의한 registry와 완전히 동일합니다.
//gitlab.com/api/v4/groups/100/-/packages/npm/:_authToken=${GITLAB_TOKEN}

# ❌ 잘못됨: 경로가 일치하지 않아 권한 실패가 발생합니다.
//gitlab.com/api/v4/:_authToken=${GITLAB_TOKEN}

많은 사람들이 설정에 실패하는 이유는 종종 경로에 슬래시가 하나 더 많거나 레벨이 하나 부족하기 때문입니다.

의존성 지옥과 404 오류

가장 골치 아픈 상황은 다음과 같습니다: 패키지 A를 설치했는데, 그것이 패키지 B(역시 비공개)에 의존하고 있고, npm이 404 Not Found를 뱉어내는 경우입니다.

왜 이런 일이 발생할까요? 그것은 올바른 대응 관계가 없으면 의존성을 해결할 때 npm이 길을 잃기 때문입니다.

특히 서로 다른 GitLab Group에 두 개의 서로 다른 스코프(예: @team-a@team-b)가 있는 경우 .npmrc는 매우 복잡하고 유지 관리하기 어려워집니다. 게다가 서로 다른 Registry에는 서로 다른 Token이 필요할 수 있으므로 이러한 환경 변수를 관리하는 것만으로도 벅찹니다.

더 현명한 방법이 있을까요?

권장 솔루션: 통합 다운로드 Group Registry & 독립 게시 Project Registry

Registry 설명
Group Registry 모든 패키지의 다운로드를 통합하기 위해 Group Registry를 설정하여 이 GitLab Group 아래의 모든 패키지를 다운로드합니다.
Project Registry 게시할 때 권한을 갖기 위해 각 프로젝트는 자체 Project Registry를 설정하여 게시할 수 있습니다.

왜 이렇게 해야 할까요?

이유 설명
간단한 설치 동일한 그룹의 모든 패키지를 쉽게 설치하고 다운로드할 수 있습니다.
간단한 게시 패키지를 각 프로젝트에 쉽게 게시할 수 있어 서로 다른 패키지가 동일한 Registry에 게시되는 것을 방지하고 각 프로젝트가 자체 Registry를 갖습니다.
쉬운 Token 관리 개발자 컴퓨터이든 CI/CD 환경이든 GITLAB_NPM_TOKEN 한 세트만 유지 관리하면 됩니다.
의존성 오류 방지 모든 비공개 패키지가 같은 곳에 있으므로 npm이 찾지 못하는 일은 절대 없습니다.

설정 실전

이 템플릿을 직접 복사할 수 있습니다:

Token을 보호하는 작업은 환경 변수에 맡겨야 하며, 절대 코드에 Token을 직접 하드코딩해서는 안 된다는 것을 기억하세요!

# .npmrc
# 일반 도메인 수준 auth token(모든 group 및 project 수준 설치 요청 포함)
//gitlab.com/:_authToken=${GITLAB_NPM_TOKEN}

# 게시용: project-level auth token(npm publish는 정확한 경로 일치 필요)
//gitlab.com/api/v4/projects/YOUR_PROJECT_ID/packages/npm/:_authToken=${GITLAB_NPM_TOKEN}

# @company scope는 group 수준 registry 사용
# 모든 @company/* 패키지는 이 registry에서 설치됩니다
@company:registry=https://gitlab.com/api/v4/groups/YOUR_GROUP_ID/-/packages/npm/

# 기타 공개 패키지는 여전히 공식 라이브러리로 이동합니다
registry=https://registry.npmjs.org/

package.json에서 publishConfig를 설정하여 패키지를 해당 GitLab Project Registry에 게시합니다.

{
  "name": "@company/my-package",
  "publishConfig": {
    "@company:registry": "https://gitlab.com/api/v4/projects/YOUR_PROJECT_ID/packages/npm/"
  }
}

결론

**“통합 다운로드 Group Registry”**와 “독립 게시 Project Registry” 전략을 통해 유지 관리 비용을 크게 줄이고 개발 프로세스를 더 원활하게 만들 수 있습니다.

목표 설명
정확한 매칭 Scope 매핑과 Token 경로는 완전히 일치해야 합니다
안전 제일 환경 변수 ${GITLAB_NPM_TOKEN}을 잘 활용하여 개인 정보를 관리하세요
중앙 집중식 관리 통일된 GitLab Group을 우선적으로 사용하여 회사의 모든 비공개 패키지를 다운로드하세요
독립 게시 독립된 GitLab Project를 우선적으로 사용하여 각 비공개 패키지를 게시하고, 혼란을 피하기 위해 각 패키지를 독립적으로 관리하세요

이러한 로직을 마스터하면 GitLab NPM Registry는 회사 개발 프로세스에서 강력한 조력자가 될 것입니다!

All rights reserved,未經允許不得隨意轉載
Hugo로 만듦
JimmyStack 테마 사용 중