본문 바로가기

내직업은 IT종사자/기타

Yarn과 npm 차이, Yarn으로 모듈이 설치된 프로젝트를 npm으로 설치한다면?

반응형

 

 

 

Yarn과 Npm 이란?


Yarn과 npm은 모두 자바스크립트 패키지 매니저로, 주로 Node.js 환경에서 패키지를 관리하는 데 사용됩니다.

두 가지 도구는 비슷한 목적을 가지고 있지만, 몇 가지 중요한 차이점과 각각의 장단점이 있습니다.

 

Yarn과 Npm 의 차이점


 

  • npm: Node.js의 기본 패키지 관리자입니다. npm은 Node.js와 함께 설치되며, JavaScript 생태계에서 가장 널리 사용되는 패키지 관리자입니다.
  • Yarn: Facebook이 npm의 몇 가지 문제점을 해결하고자 개발한 패키지 관리자입니다. Yarn은 npm과 호환되며, 성능 및 안정성 개선을 목표로 합니다.

 

 

주요 차이점

 

- 패키지 설치 속도

 

  • Yarn: 병렬 설치 방식을 사용하여 패키지 설치 속도가 더 빠릅니다. Yarn은 패키지 설치 시 네트워크 요청을 병렬로 처리하여 속도를 최적화합니다.
  • npm: npm 버전 5 이후에는 속도가 개선되었지만, 기본적으로 순차적으로 패키지를 설치합니다. npm 7부터는 일부 병렬 설치 기능이 도입되었습니다.

 

- 캐시

 

  • Yarn: 설치된 패키지를 로컬 디스크에 캐시하여, 동일한 패키지를 재설치할 때 네트워크 요청 없이 빠르게 설치할 수 있습니다.
  • npm: npm도 캐싱을 지원하지만, Yarn의 캐싱 메커니즘이 더 효율적입니다.

 

 

 

- lock  파일

 

  • Yarn: yarn.lock 파일을 사용하여 패키지 버전을 고정합니다. 이는 동일한 종속성을 모든 개발자와 환경에서 보장합니다.
  • npm: npm 5부터 package-lock.json 파일을 도입하여 패키지 버전을 고정합니다. 기능은 yarn.lock과 유사합니다.

 

 

 

- 설치 등 명령어

 

  • Yarn: yarn add, yarn remove, yarn install, yarn upgrade 등 고유한 명령어를 사용합니다.
  • npm: npm install, npm uninstall, npm update 등 표준 명령어를 사용합니다. npm 6부터는 npm ci 명령어를 도입하여 CI 환경에서 더 빠른 설치를 지원합니다.
* npm install  과  npm ci 의 차이점

[npm install]
- 개발 중 패키지 추가, 업데이트 시 사용
- package-lock.json 파일이 없으면 생성.
- 이미 설치된 패키지를 유지하면서 새로운 패키지를 추가.

[npm ci]
- CI/CD 환경에서 일관된 종속성 설치를 위해 사용.
- node_modules 디렉토리를 삭제하고, package-lock.json 파일을 기준으로 종속성 설치.
- package-lock.json 파일과 package.json 파일이 일치하지 않으면 오류 발생.

 

 

 

- 보안

 

  • Yarn: 패키지 설치 시 각 패키지의 무결성을 확인하기 위해 체크섬을 사용합니다.
  • npm: npm 6부터는 기본적으로 설치 시 보안 점검을 수행하고, 알려진 취약점을 검사하여 알립니다.

 

 

- 워크스페이스

 

  • Yarn: 모노레포(monorepo) 지원을 위한 워크스페이스(workspaces) 기능을 제공합니다. 이를 통해 여러 패키지를 단일 리포지토리에서 효율적으로 관리할 수 있습니다.
  • npm: npm 7부터 워크스페이스 기능을 도입하여 모노레포를 지원합니다.

 

 

 

**모노레포란?
모노레포(Monorepo)는 여러 개의 프로젝트나 패키지를 단일 리포지토리(repository)에서 관리하는 방식입니다.
즉 각각의 프로젝트나 패키지를 별도의 리포지토리에서 관리하는 방식과 반대입니다.

 

//package.json

{
  "private": true,
  "workspaces": ["packages/*"]
}

 

my-monorepo/
├── package.json
└── packages/
    ├── package-a/
    │   ├── package.json
    └── package-b/
        ├── package.json

 

 

Yarn의 장/단점


 

Yarn의 장점:

  • 속도: 병렬 설치 및 캐싱 메커니즘 덕분에 설치 속도가 빠릅니다.
  • 일관성: yarn.lock 파일을 통해 의존성의 일관성을 보장합니다.
  • 워크스페이스: 대규모 프로젝트나 모노레포에서 유용한 기능입니다.

Yarn의 단점:

  • 추가 학습 필요: npm에 익숙한 사용자에게는 새로운 명령어 체계를 익히는 데 시간이 필요할 수 있습니다.
  • 커뮤니티 및 생태계: npm에 비해 커뮤니티나 생태계가 작을 수 있습니다.

 

 

Npm의 장/단점


npm의 장점:

  • 널리 사용됨: 기본적으로 Node.js와 함께 제공되며, 많은 프로젝트가 npm을 기본으로 사용합니다.
  • 광범위한 지원: 풍부한 문서와 커뮤니티 지원을 제공합니다.
  • 모노레포 지원: npm 7부터 워크스페이스 기능을 지원하여 대규모 프로젝트에서도 효과적으로 사용할 수 있습니다.

npm의 단점:

  • 과거의 성능 문제: 초기 버전에서의 성능 및 보안 문제로 인해 나쁜 평판을 얻은 적이 있습니다. 하지만 최신 버전에서는 많이 개선되었습니다.
  • 일관성 문제: package-lock.json 파일이 도입되기 전에는 패키지 의존성 관리에서 일관성 문제가 있었습니다.

 

 

 

형상관리 Git에 package-lock.json파일을  올리는 것이 좋을까?


package-lock.json 파일을 올리는 이유

-일관된 종속성 설치:

  • package-lock.json 파일은 정확한 버전의 패키지를 기록합니다. 이를 통해 모든 개발 환경과 배포 환경에서 동일한 버전의 종속성을 설치할 수 있습니다.
  • 이는 개발자 간의 "작동하지 않음" 문제를 줄이고, 배포 시 버전 불일치로 인한 버그를 방지합니다.

- 재현 가능한 빌드:

  • 프로젝트를 빌드하거나 테스트할 때, 동일한 종속성을 보장합니다. 이는 CI/CD 환경에서 매우 중요합니다.
  • npm ci 명령어를 사용하면 package-lock.json 파일을 기반으로 종속성을 설치하여 빠르고 일관된 빌드를 제공합니다.
  1. 성능 최적화:
    • package-lock.json 파일이 있으면 npm은 네트워크 요청을 줄이고 캐시를 효율적으로 사용할 수 있어 설치 속도가 빨라집니다.
  2. 보안:
    • 특정 버전의 패키지를 고정함으로써 의존성 트리에 잠재된 취약점을 더 잘 관리할 수 있습니다.
    • npm audit 명령어를 사용하면 보안 취약점을 쉽게 식별하고 해결할 수 있습니다.
    •  

package-lock.json 파일을 올리지 않는 경우의 문제점

- 비일관성:

  • package-lock.json 파일이 없으면, package.json에 정의된 버전 범위 내에서 가장 최신 버전의 패키지가 설치됩니다. 이는 환경마다 다른 버전의 패키지가 설치될 수 있음을 의미합니다.
  • 이는 개발자 간의 차이뿐만 아니라 개발 환경과 배포 환경 간의 차이를 유발할 수 있습니다.

- 디버깅 어려움:

  • 비일관성으로 인해 발생하는 문제를 디버깅하기 어려워집니다. 특히 특정 버전의 종속성에서 발생하는 버그를 추적하는 데 어려움이 생깁니다.

 

 

npm 으로 package-lock.json 으로 모듈 디펜던시가 설치된 프로젝트에서  사용자가 yarn을 통해 해당 모듈을 설치하여 혼용이 가능할까?

npm 으로 설치시 package.json을 기반으로 package-lock.json  이만들어지고
yarn 으로 설치시 package.json을 기반으로 yarn.lock 파일을 사용합니다.

 

 

1. package-lock.json 파일을 무시하고 Yarn 사용하기

package-lock.json 파일이 이미 존재하는 경우, Yarn을 처음 사용하면 yarn.lock 파일을 생성합니다. 이 과정에서 package-lock.json 파일을 무시하고 package.json 파일을 기반으로 종속성을 설치합니다.

 

yarn.lock 파일을 생성 또는 업데이트

# 기존 node_modules 삭제 (선택 사항이지만 권장됨)
rm -rf node_modules

# Yarn으로 종속성 설치
yarn install

 

2. 프로젝트에 Yarn Workspaces가 필요한 경우

모노레포 프로젝트에서 Yarn Workspaces를 사용할 경우, package.json 파일에 워크스페이스 설정을 추가해야 합니다. 예를 들어, 다음과 같이 설정할 수 있습니다:

 

//package.json
{
  "private": true,
  "workspaces": ["packages/*"]
}

 

 

3. yarn.lock 파일 커밋

종속성을 설치한 후 생성된 yarn.lock 파일을 Git에 커밋해야 합니다. 이는 yarn.lock 파일이 정확한 패키지 버전을 지정하여, 다른 개발자나 배포 환경에서도 동일한 종속성이 설치되도록 보장합니다.

 

 

권장사항

1. 혼합사용 피하기

가능하면 하나의 프로젝트에서 npm과 Yarn을 혼용하지 않는 것이 좋습니다. 이는 잠재적인 충돌을 피하고, 일관된 종속성 관리를 보장하기 위함입니다. 프로젝트를 Yarn으로 전환한 후에는 팀원들이 Yarn을 사용하도록 권장합니다.

 

2. 기존 package-lock.json 파일 유지 또는 삭제

yarn.lock 파일을 커밋한 후, 기존의 package-lock.json 파일을 유지할지 삭제할지 결정해야 합니다. 일반적으로 Yarn을 주로 사용하기로 결정했다면 package-lock.json 파일을 삭제하는 것이 좋습니다. 이렇게 하면 혼란을 줄이고, 팀원들이 실수로 npm을 사용하여 종속성을 설치하는 것을 방지할 수 있습니다.

 

 

 

 

 

반응형