코드노트

Nexus를 사용하여 npm 패키지 저장소 구축, feat.npm private7$ 본문

Code note/codenote

Nexus를 사용하여 npm 패키지 저장소 구축, feat.npm private7$

코드노트 2024. 3. 21. 13:49

현재 회사 서비스에서는 CORE 및 UI관련 api 로직 영역을 Npm패키지로 분리하기로 했다.

기존 솔루션에 있어서 내부 회사 코드들이 전부 있다보니 외부 개발자들이나 기타 등등... 문제가 될 수 있어서 인거 같다.

 

그렇기에 우선 Npm패키지로 등록을 하려했다.

 

Npm 패키지는 간단하게 배포한 경험이 있었다보니 약간의 테스트를 거치고 실행을 하기로 했다.


Npm 패키지 등록 방법

  • NPM 로그인
 

npm | Home

Bring the best of open source to you, your team, and your company Relied upon by more than 17 million developers worldwide, npm is committed to making JavaScript development elegant, productive, and safe. The free npm Registry has become the center of Java

www.npmjs.com

$ npm login
npm notice Please check your email for a one-time password (OTP)

- 회원가입 후 로그인을 실행해줘야 한다.

$ npm info

- npm info를 통해서 배포되어 있는 이름인지 터미널에서 확인할 수 있다. 배포되어 있다면 npm ERR 문구가 출력된다.

 

  • 배포 테스트를 위한 코드
    • 내가 현재 실행하는 것 중에서 중요한 건 env를 사용해야했고, api가 수백개가 되기 때문에 기존에 있던 코드에서 수정없이 import로만 불러와서 적용이 되어야 했다.
// "package.json"
{
  "name": "grm-api-test",
  "version": "0.0.18",
  "main": "index.js",
  "license": "MIT",
  "dependencies": {
    "axios": "^1.6.8"
  }
}
// "index.js"
import { TodoCall } from "./core/api/test/mock.test.api";

export { TodoCall };
// "./core/api/test/mock.test.api"
const axios = require("axios");

class TodoCallApi {
  async testApiFirst() {
    try {
      const res = await axios.get(
        `${process.env.VUE_APP_API_BASE_URL}/todos/1`
      );
      const data = res.data;
      return data;
    } catch (error) {
      console.error("Error fetching data:", error);
      throw error;
    }
  }
  async testApiSecond() {
    try {
      const res = await axios.get(
        `${process.env.VUE_APP_API_BASE_URL}/todos/2`
      );
      const data = res.data;
      return data;
    } catch (error) {
      console.error("Error fetching data:", error);
      throw error;
    }
  }
}
export const TodoCall = new TodoCallApi();

 

- api 성공!

 

그치만... 이렇게 한번에 쉽게 되면 재미없지.. ( 사실 이것도 v0.0.18 까지  version patch를 했다.. )


npm 패키지 비공개(Private)는 유료

여기서 생긴 문제 npm 패키지는 public으로 기본으로 제공된다.

여기서 private을 하기위해 알아보니...

월 7달러였다. 월 7달러면 싼건가 싶기도 하지만.. 팀원 당 7달러이기 때문에 50명만되어도 월 350달러..ㅋ

 

이 외에도 GihHub Packages는 무료로 제공되는 저장공간이 500MB였다.

 

팀장님과 이야기해본 결과 Nexus를 사용하자고 하셨다.

Nexus로 저장을 하고 나서 알게 된 사실이지만 GihHub Packages도 여러 문제가 있다고 한다. 스코프 관련한 이슈가 있다곤 하는데 해결방법이 있을것 같긴 하다.. 


Nexus Repository Manager OSS

- 처음에 Nexus가 어떤것인지 어떤방식으로 진행이 되는지 몰랐었다.

- 쉽게 이야기하면 Nexus가 프록시 서버 역할을 하면서 npm install을 하였을때 nexus에 올려진 이름이 install이 되었을때 가로채서 Nexus에 있는 repository에서 받을 수 있게 된다.

- 이렇게 되면 npm 패키지에는 저장이 되지 않고 nexus는 프록시 서버로 동작하여 사용자가 nexus에 직접 업로드한 패키지를 저장하고 관리하게 된다.

 

 

사내 보안상 따로 캡처를 더 찍지는 못했지만 정리해보자면

  1. Nexus에서 사용할 Repository를 생성한다.
  2. 그리고 저장소의 Name에 저장소이름을 작성하고 url을 복사해서 터미널에서 npm login을 할때 사용해야한다.
  3. 여기서 권한 관련하여, Security -> Roles 을 등록해줘야한다.
  4. 그리고 아까 npm에 publish를 했던것 처럼 진행해주면 끝
npm ERR! Unable to authenticate, need: BASIC realm="Nexus Repository Manager"

이러한 문구가 뜬다면 Realms 설정을 해줘야한다. active로 save 해주면 된다.

 

$ npm login --registry=repo만든 후 나왔던 URL
$ Username: id
$ Password: password
$ Email: email

 

 

그리고 이제 npm에 있는 패키지를 사용하는것처럼 진행하면 된다.

아직 추가적으로 진행해보고 테스트할게 많지만...

npm 패키지가 아닌 Nuxes를 사용해서 패키지를 배포해보는 경험은 좋은 경험이였던것 같다.

 

생각해뒀던 오픈소스 패키지도 이번기회에 만들어보는것도 좋을것 같은 느낌..!